XML DSIG Verification
-
12-09-2019 - |
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. ???
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