XML Belgesi İmzalama | C#

Merhaba, XML dosyası imzalamakla ilgili aşağıdaki gibi bir örnek yaptım.

Belki birilerinin işine yarayabilir diyerek paylaşıyorum.

Aşağıdaki YouTube videosundan faydalandım.

https://www.youtube.com/watch?v=weiFeQKxqDc&t=348s

Biraz da KamuSm DLL’lerini de kullanınca ortaya şöyle bir şey çıktı:

using System;

namespace KonsolXmlImza
{
    internal class Program
    {
        static void Main(string[] args)
        {
            XmlImzalama xmlImzalama = new XmlImzalama();
            xmlImzalama.Imzala();
            Console.ReadLine();
        }
    }
}
using System;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Xml;
using tr.gov.tubitak.uekae.esya.api.asn.x509;

namespace KonsolXmlImza
{
    // Bu ornegi https://www.youtube.com/watch?v=weiFeQKxqDc&t=348s adresindeki anlatimi referans alarak
    // kamusm'den elde ettigim DLL'leri kullanarak yaptim.
    // XML imzalayabilmek icin e-imzamizdaki sertifikayi kisisel sertifikalar icine eklememiz gerekiyor.
    // En azindan ben baska bir yontem bulamadim. 
    public class XmlImzalama : XadesSampleBase
    {
        private static readonly string ROOT_DIR = @"c:\EImza\";   // Bunu degistirmek gerekebilir.
        public static readonly string SIGNATURE_FILENAME = ROOT_DIR + "ImzaTest_imzali.xml"; // Bunu degistirmek gerekebilir.
        public static readonly string kaynakDosyaYolu = ROOT_DIR + "ImzaTest.xml"; // Bunu degistirmek gerekebilir.

        public void Imzala()
        {
            Console.WriteLine("Lütfen e-imza şifrenizi yazınız : ");
            string sifre = Console.ReadLine();
            SampleBase.PIN_SMARTCARD = sifre;
            
            // Bu kismi e-imzayi okumak icin kullandim..
            // Maksadim takili olan cihazdaki sertifikayi almak.
            // Bende e-guven'in sertifikasi vardi. Ne yazik ki onun icerisinde PrivateKey alanina ulasilamiyor bu sekilde.
            SmartCardManager smartCardManager = SmartCardManager.getInstance();
            ECertificate smartCardCertificate = smartCardManager.getSignatureCertificate(false, false);
            smartCardManager.getSigner(SampleBase.PIN_SMARTCARD, smartCardCertificate);
            X509Certificate2 cert = smartCardCertificate.asX509Certificate2();
            
            // Yukarida cihazdaki sertifikayi aldim ama PrivateKey almak icin de kisisel sertifikalardan
            // bizim cihazdaki sertifikanin Thumbprint degerine esit olanini buluyorum.
            // Bu sayede PrivateKey degerine erisebildim.
            X509Certificate2 certificate = null;
            X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadWrite);
            X509Certificate2Collection certificates = store.Certificates.Find(X509FindType.FindByThumbprint, cert.Thumbprint, false);
            if (certificates.Count == 0)
            {
                Console.WriteLine("Certificate not installed.");
                store.Close();
                return;
            }
            else
            {
                certificate = certificates[0];
                store.Close();
            }
            
            // Sonrasinda da PFX kullanarak nasil imzalaniyorsa o sekilde devam ettim.
            XmlDocument doc = new XmlDocument();
            doc.Load(kaynakDosyaYolu);
            SignedXml signedXml = new SignedXml(doc);
            signedXml.SigningKey = certificate.PrivateKey;
            Reference reference = new Reference();
            reference.Uri = "";
            reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
            signedXml.AddReference(reference);
            KeyInfo keyInfo = new KeyInfo();
            keyInfo.AddClause(new KeyInfoX509Data(certificate));
            signedXml.KeyInfo = keyInfo;
            signedXml.ComputeSignature();
            XmlElement xmlSig = signedXml.GetXml();
            doc.DocumentElement.AppendChild(doc.ImportNode(xmlSig, true));
            doc.Save(SIGNATURE_FILENAME);
            
            // Imzayi da gene ayni sekilde dogruladim...
            SignedXml signedXmlValidate = new SignedXml(doc);
            XmlNode signatureNode = doc.GetElementsByTagName("Signature")[0];
            signedXmlValidate.LoadXml((XmlElement)signatureNode);
            Console.WriteLine("'" +SIGNATURE_FILENAME + "' dosyasinin imzasi dogru mu? :" + signedXmlValidate.CheckSignature());
        }
    }
}

Selamlar.

Leave a Reply

Your email address will not be published. Required fields are marked *