static int tls_create_new_context(const char *cert_file, const char *key_file) { # ifdef HAVE_TLS_SERVER_METHOD if ((tls_ctx = SSL_CTX_new(TLS_server_method())) == NULL) { tls_error(__LINE__, 0); } # else if ((tls_ctx = SSL_CTX_new(SSLv23_server_method())) == NULL) { tls_error(__LINE__, 0); } # endif tls_init_options(); tls_init_cache(); tls_load_cert_file(cert_file, key_file); if (ssl_verify_client_cert) { tls_init_client_cert_verification(cert_file); } tls_init_ecdh_curve(); tls_init_dhparams(); return 0; }
int tls_init_library(void) { unsigned int rnd; tls_cnx_handshook = 0; tls_data_cnx_handshook = 0; SSL_library_init(); SSL_load_error_strings(); OpenSSL_add_all_algorithms(); while (RAND_status() == 0) { rnd = zrand(); RAND_seed(&rnd, (int) sizeof rnd); } if ((tls_ctx = SSL_CTX_new(SSLv23_server_method())) == NULL) { tls_error(__LINE__, 0); } # ifdef SSL_OP_CIPHER_SERVER_PREFERENCE SSL_CTX_set_options(tls_ctx, SSL_OP_CIPHER_SERVER_PREFERENCE); # endif # ifdef SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION SSL_CTX_set_options(tls_ctx, SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION); # endif SSL_CTX_set_options(tls_ctx, SSL_OP_NO_SSLv2); SSL_CTX_set_options(tls_ctx, SSL_OP_NO_SSLv3); # ifdef SSL_OP_NO_TLSv1 SSL_CTX_clear_options(tls_ctx, SSL_OP_NO_TLSv1); # endif # ifdef SSL_OP_NO_TLSv1_1 SSL_CTX_clear_options(tls_ctx, SSL_OP_NO_TLSv1_1); # endif # ifdef SSL_OP_NO_TLSv1_2 SSL_CTX_clear_options(tls_ctx, SSL_OP_NO_TLSv1_2); # endif if (tlsciphersuite != NULL) { if (SSL_CTX_set_cipher_list(tls_ctx, tlsciphersuite) != 1) { logfile(LOG_ERR, MSG_TLS_CIPHER_FAILED, tlsciphersuite); _EXIT(EXIT_FAILURE); } } if (SSL_CTX_use_certificate_chain_file(tls_ctx, cert_file) != 1) { die(421, LOG_ERR, MSG_FILE_DOESNT_EXIST ": [%s]", cert_file); } if (SSL_CTX_use_PrivateKey_file(tls_ctx, cert_file, SSL_FILETYPE_PEM) != 1) { tls_error(__LINE__, 0); } if (SSL_CTX_check_private_key(tls_ctx) != 1) { tls_error(__LINE__, 0); } tls_init_cache(); # ifdef SSL_CTRL_SET_ECDH_AUTO SSL_CTX_ctrl(tls_ctx, SSL_CTRL_SET_ECDH_AUTO, 1, NULL); # else tls_init_ecdh_curve(); # endif # ifdef SSL_CTRL_SET_DH_AUTO if (tls_init_dhparams() != 0) { SSL_CTX_ctrl(tls_ctx, SSL_CTRL_SET_DH_AUTO, 1, NULL); } # else if (tls_init_dhparams() != 0) { tls_init_dhparams_default(); } # endif # ifdef DISABLE_SSL_RENEGOTIATION SSL_CTX_set_info_callback(tls_ctx, ssl_info_cb); # endif SSL_CTX_set_verify_depth(tls_ctx, 6); if (ssl_verify_client_cert) { SSL_CTX_set_verify(tls_ctx, SSL_VERIFY_FAIL_IF_NO_PEER_CERT | SSL_VERIFY_PEER, NULL); if (SSL_CTX_load_verify_locations(tls_ctx, cert_file, NULL) != 1) { tls_error(__LINE__, 0); } } return 0; }