我有一個可以與服務器建立SSL連接的工作應用程序。服務器使用自簽名證書,客戶端加載證書頒發機構鏈,告訴它服務器可以信任。我這樣做,在客戶端上這樣的代碼:OpenSSL驗證C++中的對等(客戶端)證書
SSL_METHOD* method = TLSv1_client_method();
_ctx = SSL_CTX_new(method);
if (SSL_CTX_load_verify_locations(_ctx, "ca-all.crt", NULL) != 1)
{
return false;
}
_ssl = SSL_new(_ctx);
int val = SSL_set_fd(_ssl, _socket->GetFD());
if (val != SSL_SUCCESS)
{
int err = SSL_get_error(_ssl, val);
return false;
}
val = SSL_connect(_ssl);
和服務器上:
if (SSL_CTX_use_certificate_chain_file(g_ctx, "ca-chain1.crt") <= 0) {
return 1;
}
ppem_file = getenv("PEM_FILE");
if (ppem_file == NULL) {
ppem_file = pem_file;
}
if (SSL_CTX_use_certificate_file(g_ctx, ppem_file,
SSL_FILETYPE_PEM) <= 0) {
return 1;
}
if (SSL_CTX_use_PrivateKey_file(g_ctx, ppem_file,
SSL_FILETYPE_PEM) <= 0) {
return 2;
}
我試圖修改此代碼,以便服務器也驗證客戶端的對等證書(自 - 簽名,使用與服務器相同的發行者)並且有點麻煩。我沒有在任何地方找到好的「概念概述」文檔,這似乎是OpenSSL庫的典型障礙。
在我加入這個SSL_CTX_load_verify_locations後,客戶端()調用:
if (SSL_CTX_use_certificate_file(_ctx, "generic_client.pem", SSL_FILETYPE_PEM) != 1)
{
return false;
}
在我加入這個SSL_CTX_use_PrivateKey_file()調用後的服務器:
STACK_OF(X509_NAME) *list;
list = SSL_load_client_CA_file("ca_chain2.crt");
if(list == NULL) {
return 4;
}
SSL_CTX_set_client_CA_list(g_ctx, list);
SSL_CTX_set_verify(g_ctx, SSL_VERIFY_PEER, NULL);
連接失敗,因爲證書不驗證。客戶似乎加載證書的罰款,如果我註釋掉SSL_CTX_set_verify行,客戶端連接沒有問題(因爲它的證書從未驗證)。
看來服務器不認爲客戶端的證書權限鏈是好的。我在這裏錯過了什麼?
從命令行,我可以運行: OpenSSL的核實-CAfile CA-chain2.crt generic_client.pem 並把它傳遞,所以我有權利證書數據可用,我必須只使用它錯了不知何故。
謝謝,那正是我所需要的。 – 2010-12-02 22:41:57