Question

Je signe numériquement un document XML et vérifier sur 2 machines différentes (le signer à une machine et vérifier une autre).

Je fais ce qui suit pour vérifier la DSIG XML dans CSharp.Net.

        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;
        }

Dans un premier temps, je recevais exception PermissionDenied lorsque mon application Web tente d'accéder au conteneur de clé. Cependant, j'ai temporairement ajoutez l'utilisateur de l'application et l'utilisateur IIS pour rôle d'administrateur et affecté la politique de sécurité FullTrust à mon application Web à l'aide Caspol.

Q1: [Ma première question est Quelle est la meilleure façon de venir sur ce] ?? Je sais que l'application Web assigne FullTrust et en ajoutant à l'utilisateur de rôle d'administrateur n'est pas une brillante idée, même si cela fonctionne

Ma deuxième question concerne le retour signedXml.CheckSignature(rsaKey); faux. Maintenant, selon ma compréhension, étant donné que le document XML est signé numériquement sur une autre machine MAC utilisée pour signer il est stocké sur que les machines KEY Nom_conteneur_destinataires « XML_DSIG_RSA_KEY », mais quand j'ai essayé de vérifier la signature sur la machine hôte MAC différente est générées et stockées dans le nom du conteneur « XML_DSIG_RSA_KEY » sur la machine hôte, d'où la signature numérique n'a pas obtenu vérifié.

Q2: Cette hypothèse est correcte ?? et quelle est la meilleure façon de faire face à cette ... Dois-je utiliser un certificat signé numériquement le document XML puis le vérifier, dans ce cas. dois-je besoin d'accompagner le certificat avec le document XML DSIG. ???

Était-ce utile?

La solution

Pour répondre à votre deuxième question: Vous voulez vérifier le XML avec les partie publique de la RSA paire de clés qui a été utilisée pour le signer. Donc, vous devez soit posséder déjà (et la confiance), la clé publique sur la machine de vérification ou d'envoyer le certificat contenant la clé publique avec le XML (il peut être stocké à l'intérieur de la structure XML-signature), puis vérifier que le certificat a été émis par une autorité de certification de confiance.

Pour mettre en œuvre le premier cas, vous pouvez appeler ToXmlString(false) sur la touche du côté émetteur, stocker le résultat dans un fichier et conserver ce fichier sur le côté de la réception. Ensuite, à l'extrémité de réception, lire le fichier et appeler:

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

Le deuxième cas peut être fait par l'obtention d'un certificat, et l'ajouter à la signature du côté de la signature comme ceci:

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

Si le certificat est digne de confiance, vous pouvez vérifier la signature du côté de la réception en appelant simplement:

bool isDone = signedXml.CheckSignature();

Pour répondre à votre première question. Une fois que vous n'êtes plus essayer d'accéder au magasin clé privée (que vous faisiez en appelant le RSACryptoServiceProvider constructeur comme vous l'avez fait), vous devriez être en mesure de fonctionner sans confiance totale

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top