2012-09-28 220 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的鏈中)找到頒發者證書。