XML DSIG 확인
-
12-09-2019 - |
문제
XML 문서에 서명하고 2 개의 다른 컴퓨터에서 확인하고 있습니다 (한 기계에 서명하고 다른 기계에서 확인).
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;
}
처음에 웹 응용 프로그램이 키 컨테이너에 액세스하려고 할 때 AccissionEied Exception을 받고있었습니다. 그러나 나는 일시적으로 Application 사용자 및 IIS 사용자를 관리자 역할에 추가하고 CASPOL을 사용하여 내 웹 응용 프로그램에 FullTrust 보안 정책을 할당했습니다.
Q1 : [나의 첫 번째 질문은 이것을 과도하게하는 가장 좋은 방법은 무엇입니까] ?? 웹 응용 프로그램을 FullTrust를 할당하고 관리자 역할에 사용자를 추가하는 것은 작동하지만 밝은 아이디어가 아닙니다.
두 번째 질문은 signedXml.CheckSignature(rsaKey);
거짓 반환. 내 이해에 따라 XML 문서가 다른 시스템에 디지털 로그인하므로 서명 한 Mac은 해당 시스템의 키 컨테이너 이름 "XML_DSIG_RSA_KEY"에 저장되어 있지만 호스트 시스템에서 서명을 확인하려고 할 때 다른 Mac은 다음과 같습니다. 호스트 시스템에서 컨테이너 이름 "XML_DSIG_RSA_KEY"로 생성 및 저장하므로 디지털 서명이 확인되지 않았습니다.
Q2 :이 가정이 맞습니까? 그리고 이것에 대처하는 가장 좋은 방법은 무엇입니까 ... 인증서를 사용하여 XML 문서를 디지털로 서명 한 다음이 경우 확인해야합니다. DSIG XML 문서와 함께 인증서를 동반해야합니까 ???
해결책
두 번째 질문에 먼저 답변하려면 : XML을 공공의 서명하는 데 사용 된 RSA 키 페어의 일부. 따라서 이미 검증기의 공개 키를 보유하고 신뢰하거나 XML과 함께 공개 키가 포함 된 인증서를 보내야 한 다음 인증서가 있는지 확인해야합니다. 신뢰할 수있는 인증서에 의해 발행됩니다.
첫 번째 사례를 구현하려면 전화 할 수 있습니다 ToXmlString(false)
전송 측의 키에서 결과를 파일에 저장 하고이 파일을 수신쪽에 보관하십시오. 그런 다음 수신 종료시 파일을 읽고 전화하십시오.
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
rsaKey.ImportFromXml(publicKeyFromFile);
두 번째 사례는 인증서를 얻고 이와 같은 서명 측의 서명에 추가하여 수행 할 수 있습니다.
KeyInfo keyInfo = new KeyInfo();
X509Certificate cert = // load certificate
keyInfo.AddClause(new KeyInfoX509Data(cert));
signedXml.KeyInfo = keyInfo;
인증서를 신뢰할 경우 호출만으로 수신자의 서명을 확인할 수 있습니다.
bool isDone = signedXml.CheckSignature();
첫 번째 질문에 대답하려면 : 더 이상 개인 키 스토어에 액세스하려고하지 않으면 (RSAcryptoserviceProvider-Constructor와 같은 개인 키 스토어에 액세스하려고하지 않으면 완전한 신뢰없이 실행할 수 있어야합니다.