1

我正在使用 OpenSSL 库编写一个程序,以与其他服务器(例如 Gmail)建立 SSL POP 连接。为此,我使用 OpenSSL 生成了一个自签名证书并对其进行了验证。

./openssl verify -CAfile /home/melluru/openssl/ssl/certs/cert.pem
           /home/melluru/openssl/ssl/certs/cert.pem
>/home/melluru/openssl/ssl/certs/cert.pem: OK

OpenSSL 工具的验证选项给出“OK”结果。但是当我在我的程序中使用以下内容来加载证书并验证结果时,我收到了错误

/** to add the cert file**/  
if(!(SSL_CTX_use_certificate_file(ctx,"/home/melluru/openssl/ssl/certs/cert.pem",
                             SSL_FILETYPE_PEM)))
    printf("Cant read certificate file\n");
/** to add the private key ***/
if(!(SSL_CTX_use_PrivateKey_file(ctx,"/home/melluru/openssl/ssl/certs/cert.pem",
                           SSL_FILETYPE_PEM)))
    printf("Cant read keyfile\n");
/** to cadd the trusted cert **/   
if(SSL_CTX_load_verify_locations(ctx,"/home/melluru/openssl/ssl/certs/cert.pem",
                             NULL) != 1) {
    printf("loading trust certificate failed\n");
    SSL_CTX_free(ctx);
    return 0;
}

/*** BIO code to connect to gmail server *****/

printf("ssl verify error is %d\n",SSL_get_verify_result(ssl));

我收到错误 20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
任何人都可以帮忙吗?我还有什么需要补充的吗?

4

1 回答 1

2

openssl verify由于您的证书是自签名的,因此您可以使用它来检查其签名,就像您使用命令行所做的那样。

但是,当您尝试建立 SSL 连接时,您要验证的不是您的证书,而是您从服务器(或客户端)收到的证书。

在该行SSL_CTX_load_verify_locations中,您必须指向您将信任的证书链。正是这个链​​将根据您通过握手协议接收的证书进行检查。

我从来没有使用过像你描述的那样的环境,但是你说你想连接到 gmail,所以它必须是 gmail 的证书链在行SSL_CTX_load_verify_locations

这就是您收到错误“X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY”的原因。OpenSSL 无法在本地(在您通过方法放入的链中SSL_CTX_load_verify_locations)找到您收到的证书的颁发者证书。

于 2012-10-08T13:46:38.427 回答