/// <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> /// Entschlüsselung einer verschlüsselten XML Struktur /// </summary> /// <param name="Doc"></param> /// <param name="keyStore"></param> /// <param name="keyStorePasswort"></param> private static void DecryptXML(XmlDocument Doc, Pkcs12Store keyStore, string keyStorePasswort) { System.Security.Cryptography.X509Certificates.X509Certificate2 cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(CertHelper.ConvertPkcs12ToByteArray(keyStore, keyStorePasswort), keyStorePasswort); //Heranziehen des privaten Schlüssels: RSACryptoServiceProvider privateKeyProvider = null; privateKeyProvider = (RSACryptoServiceProvider)(cert.PrivateKey); //Kompatibilität Java Anfang --> XmlElement keyNameNode = null; string keyName = "rsaKeyName"; foreach (string keyNameName in GetNodeKeyNameCollection()) { keyNameNode = Doc.GetElementsByTagName(keyNameName)[0] as XmlElement; if (keyNameNode != null) { break; } } if (keyNameNode == null) { XmlElement encryptedKey = null; foreach (string encryptionKeyName in GetNodeEncryptionKeyNameCollection()) { encryptedKey = Doc.GetElementsByTagName(encryptionKeyName)[0] as XmlElement; if (encryptedKey != null) { break; } } if (encryptedKey != null) { XmlElement elementKeyMethod = null; foreach (string elementKeyMethodName in GetNodeEncryptionMethodCollection()) { elementKeyMethod = encryptedKey.GetElementsByTagName(elementKeyMethodName)[0] as XmlElement; if (elementKeyMethod != null) { break; } } if (elementKeyMethod != null) { XmlElement elementKeyInfo = Doc.CreateElement("KeyInfo", SignedXml.XmlDsigNamespaceUrl); XmlElement elementKeyName = Doc.CreateElement("KeyName", SignedXml.XmlDsigNamespaceUrl); elementKeyName.InnerText = keyName; elementKeyInfo.AppendChild(elementKeyName); encryptedKey.InsertAfter(elementKeyInfo, elementKeyMethod); } } } else { if (!string.IsNullOrEmpty(keyNameNode.InnerText)) { keyName = keyNameNode.InnerText; } else { keyName = ""; } } // Kompatibilität Java Ende <-- //Entschlüsselung: EncryptedXml exml = new EncryptedXml(Doc); exml.AddKeyNameMapping(keyName, privateKeyProvider); exml.DecryptDocument(); }