@@ -4392,6 +4392,75 @@ TEST(SSLClientServerTest, SSLConnectTimeout) {
43924392 svr.stop();
43934393 t.join();
43944394}
4395+
4396+ TEST (SSLClientServerTest, CustomizeServerSSLCtx) {
4397+ auto setup_ssl_ctx_callback = [](SSL_CTX &ssl_ctx) {
4398+ SSL_CTX_set_options (&ssl_ctx, SSL_OP_NO_COMPRESSION);
4399+ SSL_CTX_set_options (&ssl_ctx,
4400+ SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
4401+ SSL_CTX_set_options (&ssl_ctx, SSL_OP_NO_SSLv2);
4402+ SSL_CTX_set_options (&ssl_ctx, SSL_OP_NO_SSLv3);
4403+ SSL_CTX_set_options (&ssl_ctx, SSL_OP_NO_TLSv1);
4404+ SSL_CTX_set_options (&ssl_ctx, SSL_OP_NO_TLSv1_1);
4405+ auto ciphers = " ECDHE-RSA-AES128-SHA256:"
4406+ " ECDHE-DSS-AES128-SHA256:"
4407+ " ECDHE-RSA-AES256-SHA256:"
4408+ " ECDHE-DSS-AES256-SHA256:" ;
4409+ SSL_CTX_set_cipher_list (&ssl_ctx, ciphers);
4410+ if (SSL_CTX_use_certificate_chain_file (&ssl_ctx, SERVER_CERT_FILE) != 1 ||
4411+ SSL_CTX_use_PrivateKey_file (&ssl_ctx, SERVER_PRIVATE_KEY_FILE,
4412+ SSL_FILETYPE_PEM) != 1 ) {
4413+ return false ;
4414+ }
4415+ SSL_CTX_load_verify_locations (&ssl_ctx, CLIENT_CA_CERT_FILE,
4416+ CLIENT_CA_CERT_DIR);
4417+ SSL_CTX_set_verify (
4418+ &ssl_ctx,
4419+ SSL_VERIFY_PEER |
4420+ SSL_VERIFY_FAIL_IF_NO_PEER_CERT, // SSL_VERIFY_CLIENT_ONCE,
4421+ nullptr );
4422+ return true ;
4423+ };
4424+ SSLServer svr (setup_ssl_ctx_callback);
4425+ ASSERT_TRUE (svr.is_valid ());
4426+
4427+ svr.Get (" /test" , [&](const Request &req, Response &res) {
4428+ res.set_content (" test" , " text/plain" );
4429+ svr.stop ();
4430+ ASSERT_TRUE (true );
4431+
4432+ auto peer_cert = SSL_get_peer_certificate (req.ssl );
4433+ ASSERT_TRUE (peer_cert != nullptr );
4434+
4435+ auto subject_name = X509_get_subject_name (peer_cert);
4436+ ASSERT_TRUE (subject_name != nullptr );
4437+
4438+ std::string common_name;
4439+ {
4440+ char name[BUFSIZ];
4441+ auto name_len = X509_NAME_get_text_by_NID (subject_name, NID_commonName,
4442+ name, sizeof (name));
4443+ common_name.assign (name, static_cast <size_t >(name_len));
4444+ }
4445+
4446+ EXPECT_EQ (" Common Name" , common_name);
4447+
4448+ X509_free (peer_cert);
4449+ });
4450+
4451+ thread t = thread ([&]() { ASSERT_TRUE (svr.listen (HOST, PORT)); });
4452+ std::this_thread::sleep_for (std::chrono::milliseconds (1 ));
4453+
4454+ SSLClient cli (HOST, PORT, CLIENT_CERT_FILE, CLIENT_PRIVATE_KEY_FILE);
4455+ cli.enable_server_certificate_verification (false );
4456+ cli.set_connection_timeout (30 );
4457+
4458+ auto res = cli.Get (" /test" );
4459+ ASSERT_TRUE (res);
4460+ ASSERT_EQ (200 , res->status );
4461+
4462+ t.join ();
4463+ }
43954464#endif
43964465
43974466#ifdef _WIN32
0 commit comments