簡體   English   中英

OpenSSL用C ++驗證對等(客戶端)證書

[英]OpenSSL Verify Peer (Client) Certificate in C++

我有一個工作的應用程序,建立到服務器的SSL連接。 服務器使用自簽名證書,客戶端加載證書頒發機構鏈,告訴它服務器可以信任。 我在客戶端上用這樣的代碼做到了這一點:

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 verify -CAfile ca-chain2.crt generic_client.pem它通過,所以我有正確的證書數據可用,我必須以某種方式錯誤地使用它。

在服務器上,還必須調用SSL_CTX_load_verify_locations() 此函數告訴服務器用於證書驗證的證書; SSL_CTX_set_client_CA_list()函數設置在握手中發送給客戶端的允許CA列表。 兩者都是必需的。

(在use_certificate_file調用之后,您還需要在客戶端上調用use_certificate_file SSL_CTX_use_PrivateKey_file() ,但我猜您正在執行此操作並將其刪除)。

SSL_CTX_set_client_CA_list設置CA列表。 根據定義,CA證書與用戶證書不同(例如,它具有CA位設置)。 因此,我建議您創建一個適當的CA(其CA證書是自簽名的),並使用它來簽署客戶端和服務器證書。 我假設OpenSSL並不期望客戶端實際上也會使用CA證書進行通信。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM