我正在用OpenSSL库编写程序,以建立SSL POP连接 与其他服务器(例如Gmail)。为此,我生成了一个自签名证书 使用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
有人可以帮忙吗?我还需要添加什么吗?
答案 0 :(得分: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
放置的链中)找到您正在接收的证书的颁发者证书。