17

Tôi đang cố gắng ký một tệp XML bằng chứng chỉ x.509, tôi có thể sử dụng khóa riêng để ký tài liệu và sau đó sử dụng CheckSignature phương pháp (nó có một quá tải nhận được một chứng chỉ như tham số) để xác minh chữ ký.Trong C#, ký xml với chứng chỉ x.509 và kiểm tra chữ ký

Vấn đề là người dùng xác thực chữ ký phải có chứng chỉ, mối quan tâm của tôi là, nếu người dùng có chứng chỉ thì anh ấy có quyền truy cập vào khóa riêng tư và như tôi hiểu, điều này là riêng tư và sẽ khả dụng chỉ cho người dùng ký tên.

Tôi đang thiếu gì?

Cảm ơn sự giúp đỡ của bạn.

Trả lời

5

Mọi chứng chỉ đều có phần công khai và riêng tư. Bạn chỉ gửi xung quanh phần công cộng. Chỉ cần mở bất kỳ trang web hỗ trợ SSL nào trong trình duyệt của bạn, nhấp vào biểu tượng khóa móc và xem xét chứng chỉ của họ.

+0

Cảm ơn bạn, đó là chính xác những gì tôi không rõ ràng. Bây giờ tôi biết rằng tôi phải sử dụng chứng chỉ từ X509Store để lấy chứng chỉ "người ký" và sử dụng tệp .cer làm "người xác minh". – willvv

19

Trong .NET, Nếu bạn nhận cert X509 của bạn từ một file pfx, như thế này:

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

Sau đó, bạn có thể xuất khẩu phần khóa công khai như vậy:

rsaCsp.ToXmlString(false); 

Các " giả "phần nói, chỉ xuất khẩu các mảnh công cộng, không xuất khẩu phần tư nhân. (Doc cho RSA.ToXmlString)

Và sau đó trong việc áp dụng kiểm định, sử dụng

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

Và VerifyXml gọi CheckSignature(). Nó trông giống như sau:

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

Mã có vẻ là từ http://msdn.microsoft.com/en-us/library/ms229950(v=vs.110).aspx. Tôi nghĩ rằng nó là mát mẻ mà bạn bao gồm mã ở đây thay vì chỉ liên kết với nó, tuy nhiên, nhưng cung cấp cho tín dụng mà nó đến hạn. –

0

Trước hết tất cả các bạn cần phải chắc chắn rằng pfx chứng chỉ hoặc cer mà bạn đang sử dụng được thiết kế cho mục đích ký.

 
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** 

Ứng dụng bảng điều khiển hoàn chỉnh để ký/xác minh số XmlDocument trong C# được viết here.

Các vấn đề liên quan