2011-08-25 4 views
7

인증서를 프로그래밍 방식으로 사용하려고합니다. 저장소를 사용하는 대신 인증서를 사용하려고합니다. 나는 파일 이름과 암호로 X509Certificate2을 만들고 있습니다.WCF 인증서 체인, 프로그래밍 방식으로 확인

신뢰할 수있는 사람의 인증서 저장소에 루트 인증서를 수동으로 추가 한 경우 제대로 작동합니다. 그러나 모든 배포에서 그렇게 할 필요는 없습니다. 프로그래밍 방식으로 처리하는 것이 좋습니다.

인증서 저장소에서 루트 인증서를 제거 할 때 예외가 발생합니다.

내가 읽은 모든 것은 수동으로 루트 인증서를 인증서 저장소에 추가해야하거나 트러스트 체인이 작동하지 않는다고합니다.

질문 : 프로그래밍 방식으로 트러스트 체인을 설정 했으므로 수동으로하지 않아도됩니까? 나는 클라이언트를 사용하려고하면 occures

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

예외,이다 :

코드처럼 보이는

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. 

답변

4

사용 된 구성 요소는 기본적으로 체인을 확인 - 때 체인 당신은 그 예외를 얻을 수 있는지 확인할 수 없습니다. 당신이 코드에서 체인의 검증을 포함하여 모든 일을 할 경우 는 당신은 implement "custom validation" and integrate that into the WCF Host 필요 :

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

는 또 다른 옵션은 모두 검증하지 않도록하는 것입니다 (생산 하지 않음!)

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

편집 - 코멘트 후 :

을 검증하기위한 체인 자체에 X509ChainX509Store을 가져 가야합니다 - 체인 확인이 구현 될 수있는 방법을 알고 싶다면 을 Verify ... 기본적으로 Find 메서드를 사용하여 X509Certificate2Collection을 부모 용으로 검색하면됩니다. 사용자 정의 유효성 확인을 사용하는 확인 기준은 귀하에게 달려 있습니다 (만료되지 않은 유효한 서명 ...). MSDN에서

일부 참조 링크 : 빠른 응답, 야히아 대단히

+0

감사합니다. 그렇다면 ** CustomCertificateValidator **를 사용하지 않고 신뢰할 수있는 사용자의 인증서 저장소에 루트 인증서를 수동으로 추가했을 때 발생하는 기본 동작을 모방 한 ** CustomCertificateValidator **를 구현하려고합니다. ** CustomCertificateValidator **에 무엇을 넣을 수 있습니까? 아마도 기본 동작은 신뢰할 수있는 사용자의 루트 인증서에 대해 ** serverCert **를 평가하고 OK를 결정하며 클라이언트가 응답을받을 수 있도록합니다.이 평가를하기 위해 무엇을합니까? 다시 한 번 감사드립니다, 스티브. – Steve

+0

여기서 클라이언트가 참조하는 것은 무엇입니까 (Client.ServiceCertificate.). 많은 감사. – iTSrAVIE

+1

이것은 네임 스페이스가 아닙니다. 이 코드는 System.ServiceModel.ClientBase <>에서 파생 된 클래스에 있다고 가정하고이 "ClientBase"는 단순히 '.ServiceCertificate', '.Authentication'then ''할 수있는 'ClientCredentials'속성 만 나타냅니다. CertificateValidationMode "등등. 정확히 알고 싶다면 ServiceCertificate 클래스는 X509CertificateRecipientClientCredential 클래스입니다. – quetzalcoatl