2014-01-10 3 views
9

TLS를 사용하여 클라이언트/서버 응용 프로그램을 개발 중입니다. 내 아이디어는 서버에서 인증되도록 클라이언트에서 인증서를 사용하는 것입니다. 또한 클라이언트가 올바른 서버에 연결하고 있음을 인증 할 수 있도록 서버의 또 다른 인증서입니다.OpenSSL을 사용하여 SSL/TLS 클라이언트 인증 테스트

먼저 openssl s_server 및 openssl s_client를 테스트하여 사용하여 제안서의 유효성을 검사하려고합니다.

지금까지 서버에 CA 개인 키를 만들었으므로 루트 인증서를 만들었습니다. 루트 인증서를 사용하여 두 개의 CSR에 서명 했으므로 서버에 대한 인증서 하나와 클라이언트에 대한 인증서 하나를 얻습니다.

또한 클라이언트에 클라이언트 인증서 + 루트 인증서를 설치하고 서버에 서버 인증서 + 루트 인증서를 설치했습니다.

openssl s_server와 openssl s_client 사이의 연결을 설정하고 둘 다 상호 인증되도록하려합니다.하지만 어떻게 할 지에 대한 문서로 내 마음을 감쌀 수는 없습니다. 어떤 도움이나 가이드가 있습니까?

일단 설정했다면 다음 단계는 해당 서버와 자체 개발 서버를 s_client에 대해 테스트하는 것입니다. 테스트를 위해이를 사용할 수 있습니까?

감사

당신이 테스트를 위해 (1) s_clients_server와 신뢰의 루트를 설정하려고하는 것 같습니다

답변

16

; 그리고 (2) OpenSSL을 사용하여 코드 내에서 프로그래밍 방식으로.


, 루트를 사용 openssl s_client (또는 openssl s_server)을 보장하기 위해 다음과 같은 옵션을 사용 : 루트에게

  • -key 옵션을 사용하는 인증서에 대한
  • -cert 옵션을 지정하는

    • -CAfile 옵션을 인증서 개인 키의 경우

    자세한 내용은 s_client(1)s_server(1)의 문서를 참조하십시오.


    클라이언트 프로그램 동일한 작업을 수행하려면 다음을 사용 :

    • SSL_CTX_load_verify_locations가 신뢰할 수있는 루트를로드
    • SSL_CTX_use_certificate 개인 키를로드 클라이언트 인증서
    • SSL_CTX_use_PrivateKey을 지정 클라이언트 인증서의 경우

    서버에 프로그램 적으로 동일한 작업을 수행하려면 다음을 사용 :

    • SSL_CTX_load_verify_locations가 신뢰할 수있는 루트를로드
    • SSL_CTX_use_certificate_chain_file 서버 인증서에 대한 개인 키를로드 할 서버 인증서
    • SSL_CTX_use_PrivateKey을 지정
    • 당신이 매개 변수를 사용하지 않으려면
    • SSL_CTX_set_client_CA_list는 클라이언트 인증서

    를 보내 클라이언트에게 모든 연결 (즉, 공통 컨텍스트)를 설정 한 다음 각 SSL 연결에 대해이를 설정합니다 (예 : SSL_use_certificateSSL_use_PrivateKey).

    많은 것들이 SSL_CTX_set_client_CA_list과 계속됩니다. (1) 서버가 클라이언트를 확인하기 위해 사용하는 CA를로드합니다. (2) 클라이언트가 클라이언트를 확인할 때 받아 들일 수있는 CA 목록을 서버에 보내고 (3) 클라이언트에서 ClientCertificate 메시지를 트리거합니다. 클라이언트에는 서버의 허용 된 CA 목록을 만족하는 인증서가 있습니다.

    SSL_CTX_load_verify_locations(3), SSL_CTX_use_certificate(3), SSL_CTX_set_client_CA_list 및 친구들에 관한 문서도 참조하십시오.


    가장 쉬운 인증서와 키 형식은 PEM입니다. PEM은 예를 들어 ----- BEGIN CERTIFICATE -----과 같이 사용되는 PEM입니다. 서버 인증서의 경우 파일이 서버 인증서와 클라이언트가 체인을 만드는 데 필요한 모든 중간 물을 연결 한 것인지 확인하십시오.

    "필요한 디렉터리"문제로 알려진 문제의 경우 서버가 모든 필요한 인증서를 보내도록하는 것이 일반적입니다. PKI에서 잘 알려진 문제이며, 클라이언트가 누락 된 중간 인증서를 가져올 곳을 모르는 근본적인 문제입니다.


    는 일반적으로, 당신은 지금 당신이 사용하는 데 필요한 기능을 알고있다. nginx과 같은 작은 서버를 다운로드하고 실제로 프로덕션 서버에서이를 사용하는 방법을 확인하십시오. SSL/TLS 서버를 설정하기 때문에 Postgres과 같은 SQL 서버를 사용할 수도 있습니다. SSL_CTX_load_verify_locations 또는 SSL_load_verify_locations에 대한 소스 파일을 검색하면 알맞은 장소를 찾을 수 있습니다.

    비록 내가 권장하지는 않지만 s_client.cs_server.c을 볼 수도 있습니다. 그들은 <openssl dir>/apps에 있습니다. 그러나이 코드는 때때로 읽기가 어려울 수 있습니다.

  • 관련 문제