示例#1
0
        /// <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);
        }
示例#2
0
        /// <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();
        }