2014-01-14 2 views
5

SSL 연결을 처리하기 위해 Microsoft Crypto API를 사용하고 있습니다. TLS 1.0 이상을 지원하는 서버와 통신 할 때 제대로 작동하지만 SSL 3.0 만 지원하는 서버를 처리하려고 시도하면 InitializeSecurityContext()이 오류 코드 0x80090331 (SEC_E_ALGORITHM_MISMATCH)과 함께 실패합니다.SSL/TLS 프로토콜 버전 폴백 메커니즘

AcquireCredentialsHandle()으로 전달되는 SCHANNEL_CRED 구조로 재생하려했는데 pAuthData 인수로. 특히 지원되는 프로토콜 집합을 제어해야하는 필드 grbitEnabledProtocols이 있습니다. grbitEnabledProtocols=SP_PROT_SSL3을 설정하면 모든 것이 정상적으로 작동하지만 TLS 1.0, 1.1 및 1.2도 지원하기 때문에 보안이 깨져 보안상의 이유로 SSL 3.0이 비활성화 된 서버와 통신 할 수 없게됩니다.

그래서 문제는 다음과 같습니다

내가 grbitEnabledProtocols=SP_PROT_SSL3TLS1_X을 설정하고 SSL 3.0 만, 연결 후 서버가 SSL 3.0 헤더와 적절한 데이터로 응답 TLS 1.2으로 시작 지원 서버와 통신 할 때. 여기에서 RFC에 따르면 Crypto API는 SSL 3.0 프로토콜을 사용하여 핸드 셰이크 절차를 계속해야하지만 대신 0x80090331 (SEC_E_ALGORITHM_MISMATCH, 클라이언트와 서버가 공통 알고리즘을 가지고 있지 않기 때문에 통신 할 수 없음) 오류가 발생합니다.

MS Crypto API에서 SSL 3.0과 함께 TLS 1.0, 1.1, 1.2를 사용할 수 있습니까?

답변

0

디버깅의 일부로 할 수있는 두 가지 작업.

1> 사용중인 API에서 지원되는 프로토콜을 지정하는 방법이 있습니다.

2> 가능한 모든 암호화 및 해싱 알고리즘을 포함 시키십시오.

이 두 옵션은 공개 SSL에서 사용할 수 있습니다.

디버깅하는 가장 좋은 방법은 wireshark를 사용하여 오류 코드 SSL 프로토콜이 전송하는 대상을 정확히 찾는 것입니다.

+0

> 프로토콜을 지정하려고 시도했는데 자세한 내용은 해당 문제에 설명되어 있습니다. grbitEnabledProtocols가 포함 된 부분을 읽었습니까? 지원되는 프로토콜을 지정해야하는 곳입니다. 2> 모든 프로토콜과 암호화가 포함되었지만 작동하지 않았습니다. OpenSSL에 같은 문제가 있다는 것을 발견했습니다. 적어도 같은 질문이있는 스레드가 있습니다. http://openssl.6102.n7.nabble.com/Need-inputs-suggestions-on-SSL-TLS-protocol-version -fallback-mechanism-td25597.html –