2010-11-23 21 views
3

私は、サーバーへのSSL接続を確立する動作中のアプリケーションを持っています。サーバーは自己署名入りの証明書を使用し、クライアントは認証局チェーンをロードして、サーバーが信頼できるかどうかを伝えます。OpenSSL C++でのピア(クライアント)証明書の確認

SSL_METHOD* method = TLSv1_client_method(); 
_ctx = SSL_CTX_new(method); 
if (SSL_CTX_load_verify_locations(_ctx, "ca-all.crt", NULL) != 1) 
{ 
    return false; 
} 
_ssl = SSL_new(_ctx); 
int val = SSL_set_fd(_ssl, _socket->GetFD()); 
if (val != SSL_SUCCESS) 
{ 
    int err = SSL_get_error(_ssl, val); 
    return false; 
} 
val = SSL_connect(_ssl); 

、サーバー上の::サーバは、クライアントのピア証明書(自己を検証するよう

if (SSL_CTX_use_certificate_chain_file(g_ctx, "ca-chain1.crt") <= 0) { 
    return 1; 
    } 
    ppem_file = getenv("PEM_FILE"); 
    if (ppem_file == NULL) { 
    ppem_file = pem_file; 
    } 
    if (SSL_CTX_use_certificate_file(g_ctx, ppem_file, 
            SSL_FILETYPE_PEM) <= 0) { 
    return 1; 
    } 
    if (SSL_CTX_use_PrivateKey_file(g_ctx, ppem_file, 
            SSL_FILETYPE_PEM) <= 0) { 
    return 2; 
    } 

私はこのコードを変更しようとしている私は、クライアント上でこのようなコードであることでした署名され、サーバと同じ発行者を使用しています)、少し問題があります。私は良い "概念的な概要"のドキュメントをどこにも見つけられておらず、OpenSSLライブラリの典型的なハードルのようです。クライアントで

私はSSL_CTX_load_verify_locations()呼び出しの後にこれを追加しました:

STACK_OF(X509_NAME) *list; 
    list = SSL_load_client_CA_file("ca_chain2.crt"); 
    if(list == NULL) { 
    return 4; 
    } 
    SSL_CTX_set_client_CA_list(g_ctx, list); 
    SSL_CTX_set_verify(g_ctx, SSL_VERIFY_PEER, NULL); 

接続が証明ので失敗:私はSSL_CTX_use_PrivateKey_file()呼び出しの後にこれを追加したサーバ上で

if (SSL_CTX_use_certificate_file(_ctx, "generic_client.pem", SSL_FILETYPE_PEM) != 1) 
{ 
    return false; 
} 

検証しません。クライアントは証明書をうまく読み込んでいるようですが、SSL_CTX_set_verify行をコメントアウトすると、クライアントは問題なく接続されます(証明書が確認されないため)。

サーバは、クライアントの認証局チェーンが良いとは思わないようです。私はここで何が欠けていますか?私が実行できるコマンドラインから

: OpenSSLは-CAfile CA-chain2.crtのgeneric_client.pem を確認し、それが通過するので、私は右の証明書データを用意して、私は何とか間違ってそれを使用する必要があります。

答えて

6

サーバーでは、SSL_CTX_load_verify_locations()も呼び出す必要があります。この関数は、証明書の検証に使用する証明書をサーバーに通知します。 SSL_CTX_set_client_CA_list()関数は、ハンドシェイクでクライアントに送信される許可されたCAのリストを設定します。どちらも必須です。

use_certificate_fileコールの後にクライアントでもSSL_CTX_use_PrivateKey_file()コールが必要ですが、これを実行しているだけです)。

+0

ありがとう、それは私が必要としていたものです。 –

0

SSL_CTX_set_client_CA_listは、CAのリストを設定します。 CA証明書は、定義上、ユーザ証明書とは異なる(例えばCAビットが設定されている)。ですから、適切なCA(CA証明書が自己署名されている)を作成し、これを使用してクライアント証明書とサーバー証明書の両方に署名することをお勧めします。 OpenSSLは、クライアントが実際にCA証明書を通信に使用することを期待していないと考えています。

関連する問題