2012-09-28 177 views
1

我正在使用OpenSSL库编写程序,以与其他服务器(例如Gmail)建立SSL POP连接 。为此,我使用OpenSSL生成了一个自签名证书 并对其进行了验证。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'结果。但是,当我用下面的 我的程序加载certtificate和验证结果,我收到错误

/** 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
任何人都可以帮忙吗?还有什么我还需要补充吗?

回答

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的链中)找到颁发者证书。