openSSL 관련 질문 드립니다.

불량청년의 이미지

openSSL 사용하여 서버/클라이언트 통신을 잘 하고 있었습니다.

몇일전 특정서버와 핸드쉐이크 할때 protocol version miss match라는 error가 발생하면서

핸드쉐이크가 이루어 지지 않아 확인해 보니 아래 코드 때문에 그렇더군요.

method = (SSL_METHID *)TLSv1_client_method();
ctx = SSL_CTX_new(method);

위 TLSv1_client_method()를 SSLv23_client_method(); 로 바꿔주니 정상적으로 핸드쉐이크가 이루어지고

동작이 잘 됩니다.

method = (SSL_METHID *)SSLv23_client_method();
ctx = SSL_CTX_new(method);

서버쪽에서 클라이언트에서 사용하는 버젼보다 상위 버젼을 사용해서 문제가 발생된 것으로 추측됩니다.

한가지 궁금한 점이 있는데 ssl.h 파일을 보면 SSL_METHOD 포인터를 리턴하는 client_method 함수들이 여러게가 있습니다.

SSL_METHOD *SSLv2_method(void);		/* SSLv2 */
SSL_METHOD *SSLv2_server_method(void);	/* SSLv2 */
SSL_METHOD *SSLv2_client_method(void);	/* SSLv2 */
 
SSL_METHOD *SSLv3_method(void);		/* SSLv3 */
SSL_METHOD *SSLv3_server_method(void);	/* SSLv3 */
SSL_METHOD *SSLv3_client_method(void);	/* SSLv3 */
 
SSL_METHOD *SSLv23_method(void);	/* SSLv3 but can rollback to v2 */
SSL_METHOD *SSLv23_server_method(void);	/* SSLv3 but can rollback to v2 */
SSL_METHOD *SSLv23_client_method(void);	/* SSLv3 but can rollback to v2 */
 
SSL_METHOD *TLSv1_method(void);		/* TLSv1.0 */
SSL_METHOD *TLSv1_server_method(void);	/* TLSv1.0 */
SSL_METHOD *TLSv1_client_method(void);	/* TLSv1.0 */
 
SSL_METHOD *DTLSv1_method(void);		/* DTLSv1.0 */
SSL_METHOD *DTLSv1_server_method(void);	/* DTLSv1.0 */
SSL_METHOD *DTLSv1_client_method(void);	/* DTLSv1.0 */

버전의 차이란건 알겠는데 SSL/TLS 섹션을 따로 둔 이유가 궁금합니다.

서버쪽의 구현이 TLS나 SSL로 구현되어 있다면 클라이언트도 이것제 맞게 해줘야 한다는 말인가요?

만약 그렇다면 클라이언트에선 어떻게 서버쪽 사용 메서드를 알 수 있을까요?

불량청년의 이미지

Manual:SSL CTX new(3) - OpenSSLWiki
SSLv23_method(void), SSLv23_server_method(void), SSLv23_client_method(void)A TLS/SSL connection established with these methods may understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. If extensions are required (for example server name) a client will send out TLSv1 client hello messages including extensions and will indicate that it also understands TLSv1.1, TLSv1.2 and permits a fallback to SSLv3. A server will support SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. This is the best choice when compatibility is a concern.

H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!