2011-08-25 31 views
7

Tôi đang cố gắng sử dụng chứng chỉ theo chương trình, thay vì sử dụng cửa hàng. Tôi đang tạo X509Certificate2 với tên tệp và mật khẩu.Chuỗi chứng chỉ WCF, xác minh theo chương trình

Điều này hoạt động tốt khi tôi đã thêm thủ công chứng chỉ gốc vào Cửa hàng chứng chỉ trong Người đáng tin cậy. Tuy nhiên, tôi không muốn phải làm điều đó trên mọi triển khai - tôi cũng muốn giải quyết nó theo cách lập trình.

Khi tôi xóa chứng chỉ gốc khỏi Cửa hàng chứng chỉ, tôi nhận được ngoại lệ.

Mọi thứ tôi đã đọc dường như nói rằng tôi phải thêm thủ công chứng chỉ gốc vào Cửa hàng chứng chỉ hoặc Chuỗi tin cậy sẽ không hoạt động.

Câu hỏi: Có cách lập trình để thiết lập Chuỗi tin cậy không, vì vậy tôi không phải thực hiện thủ công?

Mã này trông giống như:

 var serverCert = new X509Certificate2("FullPathToMyCertificate.cer", "Password"); 
     Client.ClientCredentials.ServiceCertificate.DefaultCertificate = serverCert; 

Trường hợp ngoại lệ, mà occures khi tôi cố gắng sử dụng các khách hàng, đó là:

System.IdentityModel.Tokens.SecurityTokenValidationException 

The X.509 certificate CN=notrealcertname, OU=TPA, OU=BMP, OU=Projects, O=Somebody, C=US is not in the trusted people store. 
The X.509 certificate CN=notrealcertname, OU=TPA, OU=BMP, OU=Projects, O=Somebody, C=US chain building failed. 
The certificate that was used has a trust chain that cannot be verified. 
Replace the certificate or change the certificateValidationMode. 
A certificate chain could not be built to a trusted root authority. 

Trả lời

4

Thành phần sử dụng xác minh chuỗi theo mặc định - khi chuỗi không thể xác minh bạn nhận được ngoại lệ đó. NẾU bạn muốn làm tất cả mọi thứ bao gồm cả xác minh của chuỗi trong mã thì bạn cần phải implement "custom validation" and integrate that into the WCF Host:

Client.ServiceCertificate.Authentication.CertificateValidationMode = 
       X509CertificateValidationMode.Custom; 
Client.ServiceCertificate.Authentication.CustomCertificateValidator = 
    new MyCertificateValidator(); 

Một lựa chọn khác sẽ được vô hiệu hóa hoàn toàn xác nhận (KHÔNG phục vụ sản xuất !!!)

Client.ServiceCertificate.Authentication.CertificateValidationMode = 
       X509CertificateValidationMode.None; 

EDIT - sau khi bình luận:

Đối với chứng thực chuỗi chính mình, bạn nên xem X509ChainX509Store - để có được ý tưởng về cách xác minh chuỗi có thể được thực hiện, hãy xem Mono's implementation của Verify ... về cơ bản bạn sử dụng phương pháp Find để tìm kiếm số X509Certificate2Collection cho cha mẹ và trên ... các tiêu chí xác minh có xác nhận tùy chỉnh tùy thuộc vào bạn (chữ ký hợp lệ, chưa hết hạn ...).

một số liên kết tham khảo tại MSDN:

+0

Cảm ơn rất nhiều cho các phản ứng nhanh chóng, Yahia. Vì vậy, sau đó, cho phép nói rằng tôi muốn thực hiện một ** CustomCertificateValidator ** bắt chước hành vi mặc định xảy ra khi tôi không sử dụng ** CustomCertificateValidator ** nhưng đã thêm thủ công chứng chỉ gốc vào Certificate Store trong Trusted People. Tôi sẽ đặt gì trong ** CustomCertificateValidator ** của mình? Có lẽ hành vi mặc định đánh giá ** serverCert ** đối với chứng chỉ gốc trong Trusted People, quyết định OK của nó và cho phép máy khách nhận được phản hồi.Nó làm gì để thực hiện đánh giá này? Cảm ơn một lần nữa, Steve. – Steve

+0

những gì khách hàng đề cập đến ở đây (nói trong Client.ServiceCertificate.), Naespace xin vui lòng? Cảm ơn nhiều. – iTSrAVIE

+1

Đây KHÔNG phải là không gian tên. Mã này giả định rằng nó nằm trong một lớp có nguồn gốc từ System.ServiceModel.ClientBase <> và "ClientBase" này cho thấy, một thuộc tính 'ClientCredentials' mà bạn có thể làm '.ServiceCertificate' rồi '.Authentication' rồi '. CertificateValidationMode "và như vậy. Nếu bạn cần biết chính xác, ServiceCertificate là một lớp X509CertificateRecipientClientCredential – quetzalcoatl

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