我有建立SSL连接到服务器的工作应用程序。服务器使用自签名证书和客户端负载证书颁发机构链,其告诉服务器是确定的信任。我这样做,与在客户端上这样的代码:

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后()调用:

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

在服务器添加此所述SSL_CTX_use_PrivateKey_file()调用之后:

  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_set_verify线,无故障客户端连接(因为它的证书是永远不会验证)。

看来,服务器并不认为客户端的证书颁发机构链是好的。缺少什么我在这里?

从命令行我可以运行: OpenSSL的验证-CAfile CA-chain2.crt generic_client.pem 并把它传递,所以我有权利证书可用数据,我要进去是错不知何故使用它。

有帮助吗?

解决方案

在服务器上,还必须调用SSL_CTX_load_verify_locations()。这个函数告诉服务器哪些证书使用了证书验证;该SSL_CTX_set_client_CA_list()函数设置了在握手发送到客户端允许CA的列表。两者都需要。

(你还需要一个SSL_CTX_use_PrivateKey_file()调用客户端上,在use_certificate_file调用后,但我猜你这样做,只是离开它)。

其他提示

SSL_CTX_set_client_CA_list设置的 CA 列表。 CA证书,顾名思义,是从用户证书不同(例如它具有CA位组)。所以,我建议你创建一个合适的CA(其CA证书是自签名),并用它来登录客户端和服务器证书。我假定OpenSSL是不期待的是,客户端将实际使用CA证书用于通信也

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top