私は、サーバーへの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 を確認し、それが通過するので、私は右の証明書データを用意して、私は何とか間違ってそれを使用する必要があります。
ありがとう、それは私が必要としていたものです。 –