Domanda

Sono in digitale la firma di un documento XML e la verifica su 2 macchine differenti (firmarlo ad una macchina e la verifica su un altro).

che sto facendo quanto segue per verificare la DSIG XML in 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;
        }

Inizialmente mi è stato sempre un'eccezione PermissionDenied quando la mia applicazione web tenta di accedere il contenitore di chiavi. Tuttavia ho temporaneamente aggiungere l'utente dell'applicazione e l'utente IIS per ruolo di amministratore e la politica di sicurezza assegnato FullTrust alla mia applicazione web utilizzando caspol.

Q1: [La mia prima domanda è che cosa è il modo migliore per venire su questo] ?? So assegnando FullTrust applicazione web e aggiungendo l'utente a ruolo di amministratore non è una brillante idea, anche se funziona

La mia seconda domanda è per quanto riguarda il ritorno signedXml.CheckSignature(rsaKey); falsa. Ora secondo la mia comprensione, dal momento che il documento XML è firmato digitalmente su una macchina diversa MAC utilizzato per firmato è memorizzato su quel macchine KEY Container Nome "XML_DSIG_RSA_KEY", ma quando ho provato a verificare la firma sul computer host un diverso MAC è generato e conservato in nome del contenitore "XML_DSIG_RSA_KEY" sulla macchina host, quindi la firma digitale non ha ottenuto verificato.

Q2: è questo presupposto corretto ?? e qual è il modo migliore per far fronte a questo ... Dovrei usare un certificato per la firma digitale del documento XML e quindi verificare che, in quel caso. dovrebbe ho bisogno di accompagnare il certificato con il documento XML DSIG. ???

È stato utile?

Soluzione

Per rispondere alla tua seconda domanda: Si vuole verificare l'XML con i href="http://en.wikipedia.org/wiki/Public_key" parte pubblica della coppia di chiavi RSA-che è stato utilizzato per firmarlo. Quindi è necessario sia già in possesso (e fiducia) la chiave pubblica sulla macchina verificare o di inviare il certificato contenente la chiave pubblica con l'XML (può essere conservato all'interno della struttura XML-firma) e quindi verificare che il certificato è stato emesso da un'autorità di certificazione attendibile.

Per la realizzazione del primo caso, è possibile chiamare ToXmlString(false) sul tasto sul lato di invio, memorizzare il risultato in un file e mantenere questo file sul lato ricevente. Poi sul lato ricevente, leggere il file e chiamare:

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

Il secondo caso può essere fatto da ottenere un certificato, e aggiungendo alla firma sul lato firma in questo modo:

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

Se il certificato è attendibile, è possibile verificare la firma sul lato ricevente semplicemente chiamando:

bool isDone = signedXml.CheckSignature();

Per rispondere alla tua prima domanda:. Una volta che non si è più si tenta di accedere al negozio chiave privata (che stavi facendo chiamando il RSACryptoServiceProvider costruttore come hai fatto), si dovrebbe essere in grado di eseguire senza la piena fiducia

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top