17

x.509 인증서를 사용하여 XML 파일에 서명하려고하는데 개인 키를 사용하여 문서에 서명 한 다음 CheckSignature 메서드 (인증서를 매개 변수로받는 오버로드가 있음)를 사용하여 서명을 확인합니다.C#에서는 x.509 인증서로 xml에 서명하고 서명을 확인하십시오.

문제는 서명을 확인하는 사용자는 인증서가 있어야한다는 것입니다. 사용자가 인증서를 가지고 있고 개인 키에 액세스 할 수 있다면 개인적으로 사용할 수 있어야합니다. 서명하는 사용자에게만 허용됩니다.

무엇이 누락 되었습니까?

도움 주셔서 감사합니다.

답변

5

모든 인증서에는 공개 및 개인 부분이 있습니다. 당신은 공공 장소를 통해서만 보냅니다. 브라우저에서 SSL 지원 웹 사이트를 열고 자물쇠 기호를 클릭하고 인증서를 살펴보십시오. .NET에서

+0

고마워요, 그게 내가 정확히 알지 못했던 것입니다. 이제 "서명자"인증서를 얻고 .cer 파일을 "검증 자"로 사용하려면 X509Store의 인증서를 사용해야한다는 것을 알고 있습니다. – willvv

19

,이처럼 .pfx 파일에서 X509의 인증서를 얻을 경우

X509Certificate2 certificate = new X509Certificate2(certFile, pfxPassword); 
RSACryptoServiceProvider rsaCsp = (RSACryptoServiceProvider) certificate.PrivateKey; 

는 그런 다음과 같이 공개 키 부분을 내보낼 수 있습니다

rsaCsp.ToXmlString(false); 

을 " 거짓 "부분은 공공 조각 만 수출하고 개인 작품은 수출하지 말라는 내용입니다. (RSA.ToXmlString에 대한 문서)

그리고 다음 검증 응용 프로그램에서,

RSACryptoServiceProvider csp = new RSACryptoServiceProvider(); 
csp.FromXmlString(PublicKeyXml); 
bool isValid = VerifyXml(xmlDoc, rsa2); 

를 사용하고 VerifyXml이 CheckSignature()를 호출합니다. 그것은 다음과 같은 :

private Boolean VerifyXml(XmlDocument Doc, RSA Key) 
{ 
    // Create a new SignedXml object and pass it 
    // the XML document class. 
    var signedXml = new System.Security.Cryptography.Xml.SignedXml(Doc); 

    // Find the "Signature" node and create a new XmlNodeList object. 
    XmlNodeList nodeList = Doc.GetElementsByTagName("Signature"); 

    // Throw an exception if no signature was found. 
    if (nodeList.Count <= 0) 
    { 
     throw new CryptographicException("Verification failed: No Signature was found in the document."); 
    } 

    // Though it is possible to have multiple signatures on 
    // an XML document, this app only supports one signature for 
    // the entire XML document. Throw an exception 
    // if more than one signature was found. 
    if (nodeList.Count >= 2) 
    { 
     throw new CryptographicException("Verification failed: More that one signature was found for the document."); 
    } 

    // Load the first <signature> node. 
    signedXml.LoadXml((XmlElement)nodeList[0]); 

    // Check the signature and return the result. 
    return signedXml.CheckSignature(Key); 
} 
+2

코드는 http://msdn.microsoft.com/en-us/library/ms229950(v=vs.110).aspx에있는 것 같습니다. 그래도 코드에 연결하는 대신 여기에 코드를 포함시키는 것이 좋습니다.하지만 그 코드의 유효 기한을 알려주십시오. –

0

우선 당신이 인증서를 .pfx 또는 사용중인 .CER이 목적에 서명하기위한 것입니다 있는지 확인하기 위해 필요한 모든.

 
You can check same in General Tab of a certificate 

*.Proves your identity to a remote computer 
*.Protects e-mail messages 
*.Allows data to be signed with the current time 
*.Allows data on disk to be encrypted 
*.2.16.356.100.2 
**Document Signing** 

디지털/서명 C#으로 된 XmlDocument를 확인하기 위해 완벽한 콘솔 응용 프로그램

here 기록됩니다.