2017-11-03 11 views
0

TLS 1.1과 TLS 1.2를 모두 지원하도록 SSL 서버를 설치하려고하지만 이전 버전은 지원하지 않습니다. 심지어 그것이 어떻게 든 기본적으로 설정되어있는 경우는 no_tlsv1_1 옵션의 선택을 취소하려고Boost :: asio SSL 서버를 만드는 방법은 TLS 1.1과 TLS 1.2를 모두 허용합니까?

// 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); 

:

이것은 내 SSL 컨텍스트를 구성하는 방법입니다. 나는에 구성을 감소하더라도 :

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 컨텍스트를 구성 할 때 두 번째 매개 변수를 tlsv12_server에서 tlsv11_server으로 변경하면 TLS 1.1은 정상적으로 작동하지만 TLS 1.2는 사용할 수 없게됩니다.

부스트 버전 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 만 사용 가능하도록 설정합니다.