XML ドキュメントにデジタル署名し、2 台の異なるマシンで検証しています (1 つのマシンで署名し、別のマシンで検証しています)。
CSharp.Net で XML DSIG を検証するために、次のことを行っています。
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;
}
最初は、Web アプリケーションがキー コンテナーにアクセスしようとすると、PermissionDenied 例外が発生していました。ただし、一時的にアプリケーション ユーザーと IIS ユーザーを管理者ロールに追加し、CasPol を使用して Web アプリケーションに FullTrust セキュリティ ポリシーを割り当てました。
Q1: [私の最初の質問はこれを克服する最善の方法は何ですか?? Web アプリケーションに fulltrust を割り当て、ユーザーを管理者の役割に追加することは、うまくいきますが、賢明な考えではありません。
私の 2 番目の質問は、signedXml.CheckSignature(rsaKey);
false を返すことに関するものです。私の理解によると、XMLドキュメントは別のマシンでデジタル署名されているため、署名に使用されたMACはそのマシンに保存されていますキーコンテナ名「XML_DSIG_RSA_KEY」ですが、ホストマシンで署名を検証しようとすると、別のMACがホスト マシン上のコンテナー名 "XML_DSIG_RSA_KEY" で生成および格納されたため、デジタル署名は検証されませんでした。
Q2: この仮定は正しいですか?? これに対処する最善の方法は何ですか...その場合、証明書を使用して XML ドキュメントにデジタル署名し、それを検証する必要があります。証明書に DSIG XML ドキュメントを添付する必要がありますか????