2008-09-10 10 views
3

.Net System.Security.SslStream 클래스를 사용하여 클라이언트 인증을 사용하여 SSL/TLS 스트림의 서버 쪽을 처리하려고합니다. .NET SslStream에서 클라이언트 인증에 사용할 수있는 인증서를 지정하는 방법

은이 코드를 사용하고, 악수를 수행하려면 다음을 수행

SslStream sslStream = new SslStream(innerStream, false, RemoteCertificateValidation, LocalCertificateSelectionCallback); 
sslStream.AuthenticateAsServer(serverCertificate, true, SslProtocols.Default, false); 

불행하게도,이 내 CryptoAPI를 신뢰할 수있는 루트 저장소에있는 모든 인증서의 SUBJECTNAMES를 포함하는 CertificateRequest를 송신 SslStream을 초래한다.

이 문제를 무시하고 싶습니다. 사용자가 신뢰할 수있는 루트 저장소에 인증서를 설치하거나 제거하도록 요구하는 것은 아닙니다.

SslStream은 SSPI/SecureChannel을 사용하는 것처럼 보이므로 해당 API를 사용하는 사람이 누구인지 알고 있다면 도움이 될 것입니다.

아이디어가 있으십니까?

답변

2

현재 .NET 라이브러리를 사용할 수없는 것처럼 보입니다.

System.Security.SslStream의 Mono 클래스 라이브러리 구현을 사용하여 해결했습니다.이 클래스는 핸드 셰이크 중에 서버 비헤이비어를 재정의하는 더 나은 액세스를 제공합니다.

1

인증서 유효성 검사가 수행하는 작업은 체인의 모든 인증서의 유효성 검사입니다. 진실하게 그것을하기 위하여는 다만 그 각자의 뿌리 상점을 접촉하십시오.

그런 일이 발생하지 않으려면 로컬로 자신의 루트 저장소를 배포 할 수 있습니다.

0

변경하려는 유효성 검사 부분이 아닙니다. 문제는 초기 핸드 쉐이크에 있으며, 서버는 클라이언트에 클라이언트 인증이 필요함을 알리는 메시지 (즉, CertificateRequest 메시지)를 전송합니다. 이 메시지의 일부로 서버는 클라이언트 인증서 발급자로 승인 할 CA의 이름을 보냅니다. 기본적으로 저장소에있는 모든 신뢰할 수있는 루트가 들어있는 목록입니다.

그러나 단일 응용 프로그램의 인증서 루트 저장소를 무시할 수 있으면 문제가 해결 될 가능성이 있습니다. 이게 네가 말하는거야? 그렇다면 어떻게해야합니까?

+0

Rasmus, 나는 동일한 문제를 해결하기 위해 노력하고 있습니다. 특정 해결책을 찾았습니까? – cdpnet

+0

@cdpnet, 나는 SslStream의 Mono 구현을 사용하여 그것을 해결했다. –