|
|
@@ -279,6 +279,12 @@ void init_ssl(void)
|
|
|
ssl_opts = SSL_OP_ALL;
|
|
|
sslprm.allowDH = 0;
|
|
|
#endif
|
|
|
+#ifdef SSL_OP_NO_RENEGOTIATION
|
|
|
+ ssl_opts |= SSL_OP_NO_RENEGOTIATION;
|
|
|
+#endif
|
|
|
+#ifdef SSL_OP_CIPHER_SERVER_PREFERENCE
|
|
|
+ ssl_opts |= SSL_OP_CIPHER_SERVER_PREFERENCE;
|
|
|
+#endif
|
|
|
|
|
|
if (sslprm.log_opts & SSL_LogStartup)
|
|
|
log_ssl_startup();
|
|
|
@@ -422,6 +428,18 @@ void init_ssl(void)
|
|
|
|
|
|
SSL_CTX_set_options(ctx, ssl_opts);
|
|
|
|
|
|
+ if (sslprm.cacert_file != NULL) {
|
|
|
+ if (!SSL_CTX_load_verify_locations(ctx, sslprm.cacert_file, NULL)) {
|
|
|
+ while ((x = ERR_get_error_line_data(NULL, NULL, NULL, NULL)) != 0) {
|
|
|
+ logit(LOG_ERR, "Error: could not use CA certificate file '%s': %s\n",
|
|
|
+ sslprm.cacert_file, ERR_reason_error_string(x));
|
|
|
+ }
|
|
|
+ SSL_CTX_free(ctx);
|
|
|
+ logit(LOG_ERR, "Error: could not use CA certificate '%s'", sslprm.cacert_file);
|
|
|
+ exit(STATE_CRITICAL);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (sslprm.cert_file != NULL) {
|
|
|
if (!SSL_CTX_use_certificate_chain_file(ctx, sslprm.cert_file)) {
|
|
|
SSL_CTX_free(ctx);
|
|
|
@@ -441,22 +459,29 @@ void init_ssl(void)
|
|
|
SSL_CTX_free(ctx);
|
|
|
exit(STATE_CRITICAL);
|
|
|
}
|
|
|
+ if (!SSL_CTX_check_private_key(ctx)) {
|
|
|
+ while ((x = ERR_get_error()) != 0) {
|
|
|
+ ERR_error_string(x, errstr);
|
|
|
+ logit(LOG_ERR, "Error: could not use certificate/private key pair: %s",
|
|
|
+ errstr);
|
|
|
+ }
|
|
|
+ SSL_CTX_free(ctx);
|
|
|
+ exit(STATE_CRITICAL);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (sslprm.client_certs != 0) {
|
|
|
+ if (sslprm.cacert_file == NULL) {
|
|
|
+ logit(LOG_ERR, "Error: CA certificate required for client verification.");
|
|
|
+ if ((sslprm.client_certs & Require_Cert) != 0) {
|
|
|
+ SSL_CTX_free(ctx);
|
|
|
+ exit(STATE_CRITICAL);
|
|
|
+ }
|
|
|
+ }
|
|
|
vrfy = SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE;
|
|
|
if ((sslprm.client_certs & Require_Cert) != 0)
|
|
|
vrfy |= SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
|
|
|
SSL_CTX_set_verify(ctx, vrfy, verify_callback);
|
|
|
- if (!SSL_CTX_load_verify_locations(ctx, sslprm.cacert_file, NULL)) {
|
|
|
- while ((x = ERR_get_error_line_data(NULL, NULL, NULL, NULL)) != 0) {
|
|
|
- logit(LOG_ERR, "Error: could not use CA certificate file '%s': %s\n",
|
|
|
- sslprm.cacert_file, ERR_reason_error_string(x));
|
|
|
- }
|
|
|
- SSL_CTX_free(ctx);
|
|
|
- logit(LOG_ERR, "Error: could not use CA certificate '%s'", sslprm.cacert_file);
|
|
|
- exit(STATE_CRITICAL);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
if (!sslprm.allowDH) {
|