2016-10-28 17 views
2

これは前の質問Boost.Asio SSL context load_verify_paths not loading certificateの続きです。Boost.Asio SSLコンテキストで証明書が検証されない

WindowsのシステムCAストアから生成されたCAファイルがあります。無効または期限切れの証明書は、生成されたファイルには含まれません。

My Boost Asioコードでは、このCAストアの使用を確認したくありません。ファイルは正常にロードされます。ssl::context::load_verify_fileはエラーなしで返されますが、確認コールバックはpreverifiedfalseに設定して呼び出し続けます。

Loading 'screen' into random state - done 
CONNECTED(00000178) 
depth=3 /C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root 
verify return:1 
depth=2 /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA 
Certification Authority 
verify return:1 
depth=1 /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA 
Domain Validation Secure Server CA 
verify return:1 
depth=0 /OU=Domain Control Validated/OU=PositiveSSL/CN=example.org 
verify return:1 
--- 
Certificate chain 
0 s:/OU=Domain Control Validated/OU=PositiveSSL/CN=example.org 
    i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA 
1 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA 
    i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority 
2 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority 
    i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root 
--- 
Server certificate 
-----BEGIN CERTIFICATE----- 
...snipped... 
-----END CERTIFICATE----- 
subject=/OU=Domain Control Validated/OU=PositiveSSL/CN=example.org 
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA 
--- 
Acceptable client certificate CA names 
/OU=Domain Control Validated/OU=PositiveSSL/CN=example.org 
/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority 
/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA 
--- 
SSL handshake has read 5399 bytes and written 334 bytes 
--- 
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA 
Server public key is 2048 bit 
Compression: NONE 
Expansion: NONE 
SSL-Session: 
    Protocol : TLSv1 
    Cipher : DHE-RSA-AES256-SHA 
    Session-ID: 8C04CCAE22F4B111AD13F10448ACDAD0C7F567F22C0D05829BDAE1DF9F29A005 

    Session-ID-ctx: 
    Master-Key: B99A5E1D0C3CF5421C41CDE88B6F21FD9816800409775C497859FAFCAE3A8942 
1A670D72808C804A33A10BF9A26B22AB 
    Key-Arg : None 
    Start Time: 1477664766 
    Timeout : 300 (sec) 
    Verify return code: 0 (ok) 

と証明書ファイルなしのopensslの別の実行:あなたが見ることができるように

Loading 'screen' into random state - done 
CONNECTED(00000178) 
depth=2 /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority 
verify error:num=20:unable to get local issuer certificate 
verify return:0 
--- 
Certificate chain 
0 s:/OU=Domain Control Validated/OU=PositiveSSL/CN=example.org 
    i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA 
1 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA 
    i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority 
2 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority 
    i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root 
--- 
Server certificate 
-----BEGIN CERTIFICATE----- 
...snipped... 
-----END CERTIFICATE----- 
subject=/OU=Domain Control Validated/OU=PositiveSSL/CN=example.org 
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA 
--- 
Acceptable client certificate CA names 
/OU=Domain Control Validated/OU=PositiveSSL/CN=example.org 
/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority 
/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA 
--- 
SSL handshake has read 5399 bytes and written 334 bytes 
--- 
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA 
Server public key is 2048 bit 
Compression: NONE 
Expansion: NONE 
SSL-Session: 
    Protocol : TLSv1 
    Cipher : DHE-RSA-AES256-SHA 
    Session-ID: 18036DF0E136729F9FE1BD8F51AA2FEF687D84D43918895B3F5847A2EB8C7109 

    Session-ID-ctx: 
    Master-Key: DA4BCC28FB9F4F5BCD9C9FBB51AA02B8A380F0580258A0F67E56BA2BFD627C54 
AB700C343F0741A77AC037E54272EB1E 
    Key-Arg : None 
    Start Time: 1477665097 
    Timeout : 300 (sec) 
    Verify return code: 20 (unable to get local issuer certificate) 

は、証明書ファイルが含まれている。ここ

は、証明書ファイルを使用してのOpenSSL実行例です。 opensslはファイルを使用するときにのみ接続するため、適切なルート証明書が必要です。

私の質問は、opensslがこのファイルを使って検証するのですが、Boost Asioはなぜですか? Boost Asioが生成されたCAストアの使用を検証するように、問題をどのように修正するのですか?あなたの目標は、ブーストASIOで保存CAウィンドウを使用する場合は

答えて

0

問題ではなく、それはset_default_verify_pathsを使用していた、システムの証明書を使用してロードされていなかった別のboost::asio::ssl::contextの作成だった、これLinuxでは動作しますが、Windowsでは動作しません。システム証明書がデフォルトの検証パスにあるため、Linuxで動作しましたが、Windowsでは空のディレクトリです(OpenSSLに証明書をインストールするように設定していませんでした)。

同様の問題を抱えている人は、証明書を読み込んでいるboost::asio::ssl::contextを使用していることを確認してください。そうすれば、時間を無駄にすることはありません。

2

、あなたはこのような何かをブーストSSLコンテキストにストアから証明書「を添付する」ことができます。これは、証明書をロードします

#include <boost/asio/ssl/context.hpp> 
#include <wincrypt.h> 

void add_windows_root_certs(boost::asio::ssl::context &ctx) 
{ 
    HCERTSTORE hStore = CertOpenSystemStore(0, "ROOT"); 
    if (hStore == NULL) { 
     return; 
    } 

    X509_STORE *store = X509_STORE_new(); 
    PCCERT_CONTEXT pContext = NULL; 
    while ((pContext = CertEnumCertificatesInStore(hStore, pContext)) != NULL) { 
     // convert from DER to internal format 
     X509 *x509 = d2i_X509(NULL, 
           (const unsigned char **)&pContext->pbCertEncoded, 
           pContext->cbCertEncoded); 
     if(x509 != NULL) { 
      X509_STORE_add_cert(store, x509); 
      X509_free(x509); 
     } 
    } 

    CertFreeCertificateContext(pContext); 
    CertCloseStore(hStore, 0); 

    // attach X509_STORE to boost ssl context 
    SSL_CTX_set_cert_store(ctx.native_handle(), store); 
} 

WindowsのCAストアから(あなたがリンクした質問に似ています)。しかし、証明書をbase64に変換する代わりに、d2i_X509を使って内部OpenSSL形式に変換し、OpenSSL X509_STOREに追加します。 SSL_CTX_set_cert_storeはそのストアをboost sslコンテキストに接続します。あなたのSSLコンテキストを設定して、それがSSLソケットで使用することを使用することができます。

namespace ssl = boost::asio::ssl; 
ssl::context ctx(ssl::context::tlsv12_client); 
ctx.set_options(ssl::context::default_workarounds 
          | ssl::context::no_sslv2 
          | ssl::context::no_sslv3 
          | ssl::context::tlsv12_client); 

add_windows_root_certs(ctx); 
ctx.set_verify_mode(ssl::verify_peer | ssl::verify_fail_if_no_peer_cert); 

// use custom verify_callback here for debugging purposes 
ctx.set_verify_callback(ssl::rfc2818_verification(address)); 

ssl::stream<boost::asio::ip::tcp::socket> socket(io, ctx); 
// socket ready to connect to ssl host 
+0

私はこれをしなければならないかもしれませんが、なぜAsioはロードされた証明書を使って事前確認していませんか?この余分なコードは必要ではありません。 – owacoder

+0

私の答えを見てください。コードは正常に動作しています。 – owacoder