.NET SslStream에서 클라이언트 인증을 위해 허용된 인증서를 지정하는 방법

StackOverflow https://stackoverflow.com/questions/53824

  •  09-06-2019
  •  | 
  •  

문제

.Net System.Security.SslStream 클래스를 사용하여 클라이언트 인증을 통해 SSL/TLS 스트림의 서버측을 처리하려고 합니다.

핸드셰이크를 수행하기 위해 다음 코드를 사용합니다.

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

안타깝게도 이로 인해 SslStream이 내 CryptoAPI 신뢰할 수 있는 루트 저장소에 있는 모든 인증서의 제목 이름이 포함된 CertificateRequest를 전송하게 됩니다.

나는 이것을 무시할 수 있기를 원합니다.사용자에게 신뢰할 수 있는 루트 저장소에서 인증서를 설치하거나 제거하도록 요구하는 것은 나에게 옵션이 아닙니다.

SslStream은 아래에서 SSPI/SecureChannel을 사용하는 것처럼 보이므로 누구든지 해당 API로 동등한 작업을 수행하는 방법을 알고 있다면 도움이 될 것입니다.

어떤 아이디어가 있나요?

도움이 되었습니까?

해결책

현재 .NET 라이브러리를 사용하면 이것이 가능하지 않은 것 같습니다.

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

다른 팁

인증서 유효성 검사는 체인에 있는 모든 인증서의 유효성을 검사하는 것입니다.실제로 그렇게 하려면 해당 인증서 각각의 루트 저장소에 문의하면 됩니다.

이것이 원하지 않는 경우 로컬에 루트 저장소를 배포할 수 있습니다.

제가 바꾸고 싶은 부분은 검증 부분이 아닙니다.문제는 초기 핸드셰이크에서 서버가 클라이언트 인증이 필요함을 알리는 메시지(즉, CertificateRequest 메시지)를 클라이언트에 전송하는 것입니다.이 메시지의 일부로 서버는 클라이언트 인증서 발급자로 수락할 CA 이름을 보냅니다.이는 기본적으로 저장소의 모든 신뢰할 수 있는 루트를 포함하는 목록입니다.

그러나 단일 애플리케이션에 대한 인증서 루트 저장소를 재정의할 수 있다면 문제가 해결될 것입니다.이게 네가 말하는거야?그렇다면 어떻게 해야 합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top