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.
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.