我用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 的正确过程。
请帮忙!