2013-01-22 2 views
1

OpenSSL 라이브러리 (전체 newb)를 사용하는 방법을 배우려고하고 있는데 클라이언트가 올바른 인증서로 서버에 연결하는 방법을 알아내는 데 어려움을 겪고 있으며 인증서가 올바르지 않으면 실패합니다. 내 사용 사례는 중앙 CA가없는 P2P 응용 프로그램을 작성하므로 CA 인증서에 의존 할 수 없습니다. 특히, 서버는 평소와 같이 cert/key를 가지며, 클라이언트는 다른 p2p 노드에게 투표하도록 요청함으로써 서버의 인증서를 결정합니다.OpenSSL은 인증 기관이있는 서버 인증서를 클라이언트에 제공합니까?

내가 두 가지 구체적인 질문이 있습니다 아래의 코드 조각에서

  • 을, 나는 클라이언트가 연결되지 기대 나는 을 주석 '암호 목록'아래 선택을하는 경우. 그것은 여전히 ​​작동합니다! 내가 뭔가 빠졌어. 그렇지?
  • 클라이언트가 서버 인증서를 사용하고 연결을 여는 데 충분해야합니까? 키가 없어, 아니 캘리포니아?

클라이언트 :

ctx = SSL_CTX_new(DTLSv1_client_method()); 
SSL_CTX_set_cipher_list(ctx, "HIGH:!DSS:[email protected]"); 

// If I comment out below stuff, client still connects happily!? 
if (!SSL_CTX_use_certificate_file(ctx, "certs/server-cert.pem", SSL_FILETYPE_PEM)) 
    printf("\nERROR: no certificate found!"); 

if (!SSL_CTX_use_PrivateKey_file(ctx, "certs/server-key.pem", SSL_FILETYPE_PEM)) 
    printf("\nERROR: no private key found!"); 

if (!SSL_CTX_check_private_key (ctx)) 
    printf("\nERROR: invalid private key!"); 

서버 :

SSL_CTX_set_cipher_list(ctx, "HIGH:!DSS:[email protected]"); // high strength ciphers 
SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF); 

if (!SSL_CTX_use_certificate_file(ctx, "certs/server-cert.pem", SSL_FILETYPE_PEM)) 
    printf("\nERROR: no certificate found!"); 

if (!SSL_CTX_use_PrivateKey_file(ctx, "certs/server-key.pem", SSL_FILETYPE_PEM)) 
    printf("\nERROR: no private key found!"); 

if (!SSL_CTX_check_private_key (ctx)) 
    printf("\nERROR: invalid private key!"); 

내 코드가 https://github.com/a34729t/exp/tree/master/tun2udp/dtls에있다; 그것은 Robin Seggelmann의 DTLS 예제로 만들어졌습니다. 특히, 나는 server3_oo.c와 함께 일하고있다.

답변

1

SSL/TLS는 다른 모드에서 작동 할 수 있습니다. 가장 공통적 인 모드는 서버 만 인증서와 키가있는 서버 인증입니다. 그런 다음 클라이언트 인증이라고도하는 상호 인증 모드가 있으며 클라이언트는 클라이언트 (클라이언트) 인증서와 키도 가지고 있습니다. 그리고 서버 나 클라이언트가 스스로 인증하지 않으며 인증서와 키가 필요없는 완전히 익명 모드가 있습니다.

그렇지 않으면 OpenSSL에게 알리지 않는 한 서버 인증 전용 모드로 작동합니다. 이 모드에서, 여기에 클라이언트에서이 라인 :

if (!SSL_CTX_use_certificate_file(ctx, "certs/server-cert.pem", SSL_FILETYPE_PEM)) 
    printf("\nERROR: no certificate found!"); 
if (!SSL_CTX_use_PrivateKey_file(ctx, "certs/server-key.pem", SSL_FILETYPE_PEM)) 
    printf("\nERROR: no private key found!"); 

은 (BTW, 클라이언트에 서버 인증서와 키를로드하지 않아도 않음) 클라이언트가 클라이언트 인증서를로드하게됩니다. 그러나 서버는 클라이언트에 인증서를 요청하지 않으므로 클라이언트는 인증서를 제공하지 않습니다. 이 행을 주석 처리하면 클라이언트는 어쨌든 사용되지 않으므로 아무런 차이가없는 클라이언트 인증서를로드하지 않습니다.

SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); 

SSL_VERIFY_PEER 차종을 : 아무도 제시하지 않을 경우

는 (오류가 생략 핸들링)이 같은 서버를 얘기를 해, 서버 인증서를 클라이언트를 요청하고, 서버가 연결을 거부 만들려면 서버가 클라이언트 인증서를 요청하면 SSL_VERIFY_FAIL_IF_NO_PEER_CERT은 클라이언트가 인증서를 제시하지 않으면 서버가 연결을 중단하도록합니다 ( documentation 참조). 후자의 옵션을 사용하지 않으면 클라이언트가 SSL_get_peer_certificate 기능을 사용하여 인증서를 보낸 경우 직접 확인할 수 있습니다.

관련 문제