2017-11-03 22 views
0

TLS 1.1とTLS 1.2の両方をサポートするようにSSLサーバを取得しようとしていますが、以前のバージョンはサポートしていません。Boost :: asio SSLサーバーはTLS 1.1とTLS 1.2の両方を受け入れますか?

これは私が私のSSLコンテキストを設定する方法である:

// Here io is an instance of io_service 
boost::asio::ssl::context ctx(io, boost::asio::ssl::context::tlsv12_server); 

ctx.use_certificate_chain_file("./certs.pem"); 
ctx.use_private_key_file("./key.pem", ssl::context::pem); 

SSL_CTX_set_cipher_list(ctx.native_handle(), "ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS"); 

ctx.set_options(boost::asio::ssl::context::default_workarounds 
       | boost::asio::ssl::context::no_sslv2 
       | boost::asio::ssl::context::no_sslv3 
       | boost::asio::ssl::context::no_tlsv1 
       | boost::asio::ssl::context::single_dh_use 
       | SSL_OP_CIPHER_SERVER_PREFERENCE); 

ctx.clear_options(boost::asio::ssl::context::no_tlsv1_1); 

// Creating socket: 
using ssl_socket = boost::asio::ssl::stream<boost::asio::ip::tcp::socket>; 
auto sock = std::make_unique<ssl_socket>(io, ctx); 

それが何らかの形でデフォルトで設定されていた場合、私はしても、no_tlsv1_1オプションをオフにしてみました。私は設定を下げる場合でも:

ctx.use_certificate_chain_file("./certs.pem"); 
ctx.use_private_key_file("./key.pem", ssl::context::pem); 

TLS 1.1クライアントに接続しようと、async_handshakeコールバックは、まだエラーコードasio.ssl:336109835, wrong version numberを与えます。 TLS 1.2クライアントと接続すると、すべて正常に動作します。

SSLコンテキストを構築するときに、第2パラメータをtlsv12_serverからtlsv11_serverに変更すると、TLS 1.1は正常に動作しますが、TLS 1.2は使用できなくなります。

私はBoostバージョン1.54と1.65.1を試しましたが、opensslバージョン1.0.2gと1.0.2lはすべてのケースに当てはまりました。 Linux Mintの実行18.2

TLS 1.1とTLS 1.2の両方を許可するにはどうすればよいですか?

答えて

1

私は自分自身を理解することができました。コンテキストを構築するときに渡していたメソッドtlsv12_serverは、サポートされているバージョンの最大値でも最小値でもなく、というメソッドが使用される正確なプロトコルです

複数のプロトコルを使用する場合は、特殊な方法があります。たとえば、tls_serverなどです。バージョンを指定せず、TLS 1.0,1.1および1.2を有効にします。 1.0を無効にすると、boost::asio::ssl::context::no_tlsv1オプションが正常に動作し、1.1と1.2のみ有効になります。