2012-09-29 152 views
1

我試圖連接到我自定義編寫的CPP中寫入的ssl服務器。它具有客戶端身份驗證功能。它在通過Wireshark觀看時出現錯誤的錯誤證書。在服務器端錯誤返回SSL客戶端認證返回錯誤證書錯誤

14560:error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned:s3_srvr.c:2619: 

我用下面的代碼來強制要求客戶端證書

SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); 
SSL_CTX_set_verify_depth(ctx, 1); 

我可以看到客戶在Wireshark的換票證。

應該使用哪個函數來設置用於在服務器端驗證客戶端證書的公鑰?

回答

1

從它看起來像你的客戶端不提供證書給服務器,並明確地要求客戶端需要呈現一個(在服務器代碼)的錯誤信息:

SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); 

什麼你可能需要是要告訴你的客戶端代碼使用證書(用私有密鑰一起):

SSL_CTX_use_certificate_chain_file(ctx, pcszCertPath); 
SSL_CTX_use_PrivateKey_file(ctx, pcszPrivKeyPath,SSL_FILETYPE_PEM); 

我希望幫助。 還要確保您的服務器使用相同的證書鏈(它信任相同的CA)。如果這是一個問題,讓我知道,我會幫你做到這一點。

0

使用wireshark,您會發現服務器是否曾向客戶端請求證書。該命令將是「CertificateRequest」。

0

我得到一個類似的錯誤(僅行號不同):

140671281543104:錯誤:140890B2:SSL例程:SSL3_GET_CLIENT_CERTIFICATE:沒有證書返回:s3_srvr.c:3292:

我已經生成的自 - 使用https://help.ubuntu.com/community/OpenSSL中提到的程序簽署的證書。

在與一天的錯誤雜耍後,我發現錯誤是因爲自我生成的CA不在我使用的機器的信任鏈中。

要將CA添加到RHEL-7的信任鏈,可以按照以下步驟操作:

 To add a certificate in the simple PEM or DER file formats to the 
     list of CAs trusted on the system: 

     Copy it to the 
       /etc/pki/ca-trust/source/anchors/ 
     subdirectory, and run the 
       update-ca-trust 
     command. 

     If your certificate is in the extended BEGIN TRUSTED file format, 
     then place it into the main source/ directory instead. 

我覺得上面的程序可以遵循的Fedora太多。 如果「update-ca-trust」命令不可用,則可能需要查看諸如「update-ca-certificates」之類的命令。 希望這對別人有用。

0

Difference Between SSLCACertificateFile and SSLCertificateChainFile

SSLCertificateChainFile一般是選擇正確的選項,因爲它的影響最小;它會導致列出的文件與證書一起發送到任何連接的客戶端。

提供所有的根CA到下面的文件來解決問題 SSLCACertificateFile(以下簡稱「CACERT」)做一切SSLCertificateChainFile做(以下簡稱「鏈」),並且還允許使用有問題的證書的簽署客戶證書。這種認證是非常罕見的(至少現在是這樣),如果你不使用它,恕我直言,沒有理由通過使用CACert而不是Chain來增強它的功能。另一方面,有人可能會說,附加功能沒有任何損害,CACert涵蓋所有情況。兩個參數都是有效的。不用說,如果你詢問證書供應商,他們會一直推銷CACert over Chain,因爲它給了他們另一件事(客戶證書),他們可能會把你賣掉。 ;)