/// <summary> /// Verifikation ob die Signatur des XML Dokumentes in Orndung ist und ob das Zertifikat mit welchem /// das XML Dokument siginiert wurde in seiner Zertifikatskette in Ordnung ist /// </summary> /// <param name="xmlDoc">signiertes XML Dokument</param> /// <param name="keyStore">KeyStore der zum Signierer gehört</param> /// <param name="keyStorePasswort">KeyStore Passwort</param> /// <param name="xmlSignatureCertificate">Liefert das Zertifikat welches in der Signatur inkludiert ist</param> /// <returns>Ist Signatur ok und entspricht das mitgeteilte Zertifikat dem jenigen der das Zertikat gesendet hat</returns> public static bool VerifyXmlSignatureAndSignatureCertificate(XmlDocument xmlDoc, Pkcs12Store keyStore, string keyStorePasswort, bool verifiziereZertifikatRootAbstammung, out X509Certificate xmlSignatureCertificate) { xmlSignatureCertificate = null; System.Security.Cryptography.X509Certificates.X509Certificate2 signatureCertificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(); BaseXmlDsig xmlDsig = new XmlDsigEnveloped(true); bool signaturVerifiziert = xmlDsig.VerifyXml(xmlDoc, out signatureCertificate); //Erstellung eines Referenzzertifikates aus dem KeyStore: System.Security.Cryptography.X509Certificates.X509Certificate2 rootCert = new System.Security.Cryptography.X509Certificates.X509Certificate2(CertHelper.ConvertPkcs12ToByteArray(keyStore, keyStorePasswort), keyStorePasswort); bool istZerifikatGefunden = false; xmlSignatureCertificate = DotNetUtilities.FromX509Certificate(signatureCertificate); if (verifiziereZertifikatRootAbstammung) { try { xmlSignatureCertificate.Verify(CertHelper.LadeX509CertificateFromPkcs12Store(keyStore).GetPublicKey()); istZerifikatGefunden = true; } catch { } } //Sollte die Zeritfikatherkunft (Abstammung von CA Zertifikat) verifiziert werden und stammt das Zertifikat nicht von //dem Root Zertifikat ab, dann wird als Prüfungsergebnis pauschal ein false zurückgegebn und somit die Signaturprüfung //als fehlgeschlagen markiert. if (verifiziereZertifikatRootAbstammung && !istZerifikatGefunden) { return(false); } return(signaturVerifiziert); }
/// <summary> /// Signatur eines XML Dokuments mit Hilfe des KeyStores. Aus dem KeyStore wird das Zertifikat gezogen und als /// Information, unter Berücksichtigung welchen Zeritfikats das XML signiert wurde, angehängt. /// </summary> /// <param name="xmlDoc">Zu signierendes XML Dokument</param> /// <param name="keyStore">KeyStore der zur Signierung herangezogen werden soll</param> /// <param name="keyStorePassword">Passwort zum KeyStore</param> private static void SignXml(XmlDocument xmlDoc, Pkcs12Store keyStore, string keyStorePasswort, string signaturAlgorithmus) { BaseXmlDsig xmlDsig = new XmlDsigEnveloped(true); xmlDoc = xmlDsig.SignXml(xmlDoc, keyStore, keyStorePasswort, signaturAlgorithmus); }