Frage

Ich bin digital signieren ein XML-Dokument und es auf zwei verschiedene Maschinen Verifizieren (Anmeldung es an einer Maschine und die Überprüfung auf einem anderen).

Ich mache das nach dem XML DSIG in CSharp.Net zu überprüfen.

        public static Boolean VerifyXml(XmlDocument document)
        {
            document.PreserveWhitespace = true;
            // Create a new CspParameters object to specify
            // a key container.
            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";

            // Create a new RSA signing key and save it in the container. 
            //**Earlier was getting exception here in rsaKey object**
            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);

            // Create a new SignedXml object and pass it
            // the XML document class.
            SignedXml signedXml = new SignedXml(document);

            // Find the "Signature" node and create a new
            // XmlNodeList object.
            // It's guaranteed that there's always exists a signature 
            XmlNodeList nodeList = document.GetElementsByTagName("Signature");

            // Load the <signature> node.  
            signedXml.LoadXml((XmlElement)nodeList[0]);

            // Check the signature and return the result.
            bool isDone = signedXml.CheckSignature(rsaKey); //**This is returning false.**
            return isDone;
        }

Am Anfang war ich immer PermissionDenied Ausnahme, wenn meine Web-Anwendung der Schlüssel Container zuzugreifen versucht. Allerdings habe ich vorübergehend fügen Sie die Anwendung Benutzer und IIS Benutzer-Administrator-Rolle und zugewiesen Fulltrust Sicherheitspolitik auf meiner Web-Anwendung mit caspol.

Q1: [Meine erste Frage Was ist der beste Weg, dies zu über kommen] ?? Ich weiß Zuweisen Web-Anwendung und Fulltrust Hinzufügen des Benutzers zu Administratorrolle ist keine gute Idee, auch wenn es funktioniert

Die zweite Frage ist in Bezug auf die signedXml.CheckSignature(rsaKey); false zurückgibt. Jetzt nach meinem Verständnis, da das XML-Dokument digital auf einer andere Maschine signiert ist der MAC unterzeichnete verwendet wird, gespeichert auf, dass Maschinen Schlüsselcontainername „XML_DSIG_RSA_KEY“, aber als ich versuchte, die Unterschrift auf Host-Rechner zu überprüfen, ein anderer MAC erzeugt und in Containernamen „XML_DSIG_RSA_KEY“ auf dem Host-Maschine gespeichert, daher hat die digitale Signatur nicht überprüft wird.

Q2: Ist diese Annahme richtig ?? und was ist der beste Weg, damit fertig zu werden ... Soll ich ein Zertifikat verwenden, um digital das XML-Dokument signiert und dann überprüfen, in diesem Fall. soll ich brauche das Zertifikat mit dem DSIG XML-Dokument. ???

begleiten
War es hilfreich?

Lösung

Ihre zweite Frage zuerst zu beantworten: Sie wollen die XML mit dem öffentlichen Teil das RSA-Schlüsselpaares, das verwendet wurde, es zu unterzeichnen. Sie müssen also entweder schon besitzen (und Vertrauen) der öffentliche Schlüssel auf der Überprüfung der Maschine oder das Zertifikat mit dem öffentlichen Schlüssel mit dem XML senden (es kann in der XML-Signatur-Struktur gespeichert werden) und dann überprüfen, ob das Zertifikat wurde ausgestellt von einer vertrauenswürdigen Zertifizierungsstelle.

den ersten Fall zu implementieren, können Sie ToXmlString(false) auf die Taste auf der Sendeseite, das Ergebnis in einer Datei aufrufen und diese Datei halten auf der Empfangsseite. Dann auf der Empfängerseite, die Datei lesen und rufen:

RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
rsaKey.ImportFromXml(publicKeyFromFile);

Der zweite Fall kann durch den Erhalt eines Zertifikats durchgeführt werden und es an die Unterschrift auf der Signierung Seite wie diese Zugabe:

KeyInfo keyInfo = new KeyInfo();
X509Certificate cert = // load certificate
keyInfo.AddClause(new KeyInfoX509Data(cert));
signedXml.KeyInfo = keyInfo;

Wenn das Zertifikat vertrauenswürdig ist, können Sie dann die Unterschrift auf der Empfangsseite überprüfen, indem Sie nur anrufen:

bool isDone = signedXml.CheckSignature();

Um Ihre erste Frage zu beantworten:., Wenn Sie nicht mehr versuchen, den privaten Schlüsselspeicher zuzugreifen (die Sie durch die RSACryptoServiceProvider-Konstruktor aufrufe tun, wie Sie haben), sollten Sie in der Lage sein, ohne volles Vertrauen laufen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top