0

我用openssl写了代码来连接tls下的服务器。如果我从 pem 文件加载证书,它可以正常工作。但是,如果我从 pfx 文件加载证书,则会在调用 SSL_connect 时发生 SSL_ERROR_SSL。我不知道加载pfx文件的过程是否错误。过程如下。

FILE* fp = fopen("cert.pfx", "rb");
PKCS12* p12 = d2i_PKCS12_fp(fp, NULL);
PKCS12_parse(p12, NULL, &private_key, &certificate, &ca_certificates);
SSL_CTX_use_certificate(ctx, certificate);
SSL_CTX_use_PrivateKey(ctx, private_key);
SSL_CTX_check_private_key(ctx);
SSL_CTX_add_extra_chain_cert(ctx, sk_X509_value(ca_certificates, i);
SSL_CTX_add_client_CA(ctx, sk_X509_value(ca_certificates, i);
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
...
SSL* ssl = SSL_new(ssl_context);
SSL_set_fd(ssl, sockfd);
SSL_connect(ssl);
...

我已经用其他客户端测试了 pfx 文件。它运作良好。所以问题不在于 pfx 文件。openssl 是否有任何选项会导致连接失败?还是我没有正确设置 CA 证书?pfx 文件包含我自己签名的 CA。但它适用于其他客户。

SSL_connect() 失败后,我调用了 ERR_get_error()。并获得证书验证失败。所以我认为上面加载pfx文件的过程有问题。也许我没有正确添加 CA 证书。谁能告诉我加载 pfx 的正确过程。

请帮忙!

4

2 回答 2

1

我发现,使用 SSL_CTX_add_extra_chain_cert 添加证书的顺序很重要。PKCS12_parse 添加证书的顺序必须从 libssl 0.9.8 更改为 libssl1.0。这就是为什么我使用下面的代码将它们添加到证书存储区的原因。

X509_STORE * certStore = SSL_CTX_get_cert_store(ctx);
for(int i = 0; i < sk_X509_num(ca) ; i++)
{
    if (X509_STORE_add_cert(certStore, sk_X509_value(ca_certificates, i))==0)
    {
        ERR_print_errors_fp (stderr);
    }
}
于 2012-12-21T11:41:00.137 回答
0

您的i变量是 size 的计数器sk_num(ca_certificates)吗?如果是,请尝试删除SSL_CTX_add_client_CA我认为不适合客户的行(不确定,很难)。

此外,在您的错误处理中,请输入以下几行以找出原因:

SSL_load_error_strings(); // just once
char msg[1024];
ERR_error_string_n(ERR_get_error(), err_msg, sizeof(err_msg));
printf("%s\n", msg);`

或者,您也可以尝试直接获取 SSL 错误:

int ssl_error = SSL_get_verify_result(ssl);

可以在此页面中检查生成的 int

于 2012-09-06T14:01:49.827 回答