27RCSID(
"$Id: befef48724883868a6eafaf29b867af146629f8d $")
31#define LOG_PREFIX "tls"
33#include <freeradius-devel/tls/log.h>
34#include <freeradius-devel/tls/strerror.h>
35#include <freeradius-devel/util/base16.h>
36#include <freeradius-devel/util/debug.h>
37#include <freeradius-devel/util/misc.h>
38#include <freeradius-devel/util/strerror.h>
39#include <freeradius-devel/util/syserror.h>
46#include <openssl/rand.h>
47#include <openssl/dh.h>
48#include <openssl/x509v3.h>
49#include <openssl/provider.h>
51#ifndef OPENSSL_NO_ECDH
52static int ctx_ecdh_curve_set(SSL_CTX *ctx,
char const *ecdh_curve,
bool disable_single_dh_use)
56 if (!disable_single_dh_use) {
57 SSL_CTX_set_options(ctx, SSL_OP_SINGLE_ECDH_USE);
60 if (!ecdh_curve || !*ecdh_curve)
return 0;
62 list = strdup(ecdh_curve);
63 if (SSL_CTX_set1_curves_list(ctx, list) == 0) {
65 ERROR(
"Unknown ecdh_curve \"%s\"", ecdh_curve);
76static int ctx_dh_params_load(SSL_CTX *ctx,
char *
file)
95 if (EVP_default_properties_is_fips_enabled(NULL)) {
96 WARN(
LOG_PREFIX ": Ignoring user-selected DH parameters in FIPS mode. Using defaults.");
100 if ((bio = BIO_new_file(
file,
"r")) == NULL) {
101 ERROR(
"Unable to open DH file - %s",
file);
105 dh = PEM_read_bio_Parameters(bio, &dh);
108 WARN(
"Unable to set DH parameters. DH cipher suites may not work!");
109 WARN(
"Fix this by generating the DH parameter file");
113 ret = SSL_CTX_set0_tmp_dh_pkey(ctx, dh);
116 ERROR(
"Unable to set DH parameters");
123static int tls_ctx_verify_chain_member(
fr_unix_time_t *expires_first, X509 **self_signed,
124 SSL_CTX *ctx, X509 *to_verify,
125 fr_tls_chain_verify_mode_t verify_mode)
129 STACK_OF(X509) *chain;
132 leaf = SSL_CTX_get0_certificate(ctx);
134 ERROR(
"Chain does not contain a valid leaf certificate");
138 if (!SSL_CTX_get0_chain_certs(ctx, &chain)) {
139 fr_tls_log(NULL,
"Failed retrieving chain certificates");
143 switch (fr_tls_cert_is_valid(NULL, ¬_after, to_verify)) {
145 fr_tls_chain_marker_log(NULL,
L_ERR, chain, leaf, to_verify);
146 PERROR(
"Malformed certificate");
151 switch (verify_mode) {
152 case FR_TLS_CHAIN_VERIFY_SOFT:
153 fr_tls_chain_marker_log(NULL,
L_WARN, chain, leaf, to_verify);
154 PWARN(
"Certificate validation failed");
157 case FR_TLS_CHAIN_VERIFY_HARD:
158 fr_tls_chain_marker_log(NULL,
L_ERR, chain, leaf, to_verify);
159 PERROR(
"Certificate validation failed");
171 switch (verify_mode) {
172 case FR_TLS_CHAIN_VERIFY_SOFT:
173 case FR_TLS_CHAIN_VERIFY_HARD:
189 if (X509_name_cmp(X509_get_subject_name(to_verify),
190 X509_get_issuer_name(to_verify)) == 0) {
192 switch (verify_mode) {
193 case FR_TLS_CHAIN_VERIFY_SOFT:
194 WARN(
"Found multiple self-signed certificates in chain");
195 WARN(
"First certificate was:");
196 fr_tls_chain_marker_log(NULL,
L_WARN,
197 chain, leaf, *self_signed);
199 WARN(
"Second certificate was:");
200 fr_tls_chain_marker_log(NULL,
L_WARN,
201 chain, leaf, to_verify);
204 case FR_TLS_CHAIN_VERIFY_HARD:
205 ERROR(
"Found multiple self-signed certificates in chain");
206 ERROR(
"First certificate was:");
207 fr_tls_chain_marker_log(NULL,
L_ERR,
208 chain, leaf, *self_signed);
210 ERROR(
"Second certificate was:");
211 fr_tls_chain_marker_log(NULL,
L_ERR,
212 chain, leaf, to_verify);
219 *self_signed = to_verify;
233 (
fr_unix_time_gt(*expires_first, not_after))) *expires_first = not_after;
238static int tls_ctx_load_cert_chain(SSL_CTX *ctx, fr_tls_chain_conf_t *chain,
bool allow_multi_self_signed)
245 fr_assert(chain->certificate_file && chain->private_key_file);
250 memcpy(&password, &chain->password,
sizeof(password));
251 SSL_CTX_set_default_passwd_cb_userdata(ctx, password);
257 SSL_CTX_set_default_passwd_cb(ctx, fr_tls_session_password_cb);
259 switch (chain->file_format) {
260 case SSL_FILETYPE_PEM:
261 if (!(SSL_CTX_use_certificate_chain_file(ctx, chain->certificate_file))) {
262 fr_tls_log(NULL,
"Failed reading certificate file \"%s\"",
263 chain->certificate_file);
268 case SSL_FILETYPE_ASN1:
269 if (!(SSL_CTX_use_certificate_file(ctx, chain->certificate_file, chain->file_format))) {
270 fr_tls_log(NULL,
"Failed reading certificate file \"%s\"",
271 chain->certificate_file);
281 if (!(SSL_CTX_use_PrivateKey_file(ctx, chain->private_key_file, chain->file_format))) {
282 fr_tls_log(NULL,
"Failed reading private key file \"%s\"",
283 chain->private_key_file);
295 extra_cnt = talloc_array_length(chain->ca_files);
296 for (i = 0; i < extra_cnt; i++) {
299 char const *filename = chain->ca_files[i];
301 fp = fopen(filename,
"r");
310 switch (chain->file_format) {
311 case SSL_FILETYPE_PEM:
312 cert = PEM_read_X509(fp, NULL, NULL, NULL);
315 case SSL_FILETYPE_ASN1:
316 cert = d2i_X509_fp(fp, NULL);
327 fr_tls_log(NULL,
"Failed reading certificate file \"%s\"", filename);
330 SSL_CTX_add0_chain_cert(ctx, cert);
341 if (!SSL_CTX_check_private_key(ctx)) {
342 ERROR(
"Private key does not match the certificate public key");
356 X509 *self_signed = NULL;
357 STACK_OF(X509) *our_chain;
360 if (tls_ctx_verify_chain_member(&expires_first, &self_signed,
361 ctx, SSL_CTX_get0_certificate(ctx),
362 chain->verify_mode) < 0)
return -1;
364 if (!SSL_CTX_get0_chain_certs(ctx, &our_chain)) {
365 fr_tls_log(NULL,
"Failed retrieving chain certificates");
369 if (allow_multi_self_signed) self_signed = NULL;
373 for (i = sk_X509_num(our_chain); i > 0 ; i--) {
379 if (tls_ctx_verify_chain_member(&expires_first, &self_signed,
380 ctx, sk_X509_value(our_chain, i - 1),
381 chain->verify_mode) < 0)
return -1;
383 if (allow_multi_self_signed) self_signed = NULL;
392 chain->valid_until = expires_first;
396 int mode = SSL_BUILD_CHAIN_FLAG_CHECK;
398 if (!chain->include_root_ca) mode |= SSL_BUILD_CHAIN_FLAG_NO_ROOT;
406 switch (chain->verify_mode) {
407 case FR_TLS_CHAIN_VERIFY_NONE:
408 mode |= SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR | SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR;
409 (void)SSL_CTX_build_cert_chain(ctx, mode);
417 case FR_TLS_CHAIN_VERIFY_SOFT:
418 if (!SSL_CTX_build_cert_chain(ctx, mode)) {
419 fr_tls_strerror_printf(NULL);
420 PWARN(
"Failed verifying chain");
424 case FR_TLS_CHAIN_VERIFY_HARD:
425 if (!SSL_CTX_build_cert_chain(ctx, mode)) {
426 fr_tls_strerror_printf(NULL);
427 PERROR(
"Failed verifying chain");
440static inline CC_HINT(always_inline)
441int tls_ctx_version_set(
443 int *ctx_options, SSL_CTX *ctx, fr_tls_conf_t
const *
conf)
457 if (
conf->tls_max_version > (
float) 0.0) {
460 if (
conf->tls_min_version >
conf->tls_max_version) {
465 ERROR(
"tls_min_version (%f) must be <= tls_max_version (%f)",
466 (
double)
conf->tls_min_version, (
double)
conf->tls_max_version);
471 if (
conf->tls_max_version < (
float) 1.0) {
472 ERROR(
"tls_max_version must be >= 1.0 as SSLv2 and SSLv3 are permanently disabled");
476# ifdef TLS1_4_VERSION
477 else if (
conf->tls_max_version >= (
float) 1.4) max_version = TLS1_4_VERSION;
479# ifdef TLS1_3_VERSION
480 else if (
conf->tls_max_version >= (
float) 1.3) max_version = TLS1_3_VERSION;
482 else if (
conf->tls_max_version >= (
float) 1.2) max_version = TLS1_2_VERSION;
483 else if (
conf->tls_max_version >= (
float) 1.1) max_version = TLS1_1_VERSION;
484 else max_version = TLS1_VERSION;
489 if (max_version < TLS1_2_VERSION) {
490 WARN(
"TLS 1.0 and 1.1 are insecure and SHOULD NOT be used");
491 WARN(
"tls_max_version SHOULD be 1.2 or greater");
494 if (!SSL_CTX_set_max_proto_version(ctx, max_version)) {
495 fr_tls_log(NULL,
"Failed setting TLS maximum version");
503 if (
conf->tls_min_version < (
float) 1.0) {
504 ERROR(
"tls_min_version must be >= 1.0 as SSLv2 and SSLv3 are permanently disabled");
507# ifdef TLS1_4_VERSION
508 else if (
conf->tls_min_version >= (
float) 1.4) min_version = TLS1_4_VERSION;
510# ifdef TLS1_3_VERSION
511 else if (
conf->tls_min_version >= (
float) 1.3) min_version = TLS1_3_VERSION;
513 else if (
conf->tls_min_version >= (
float) 1.2) min_version = TLS1_2_VERSION;
514 else if (
conf->tls_min_version >= (
float) 1.1) min_version = TLS1_1_VERSION;
515 else min_version = TLS1_VERSION;
520 if (min_version < TLS1_2_VERSION) {
521 WARN(
"TLS 1.0 and 1.1 are insecure and SHOULD NOT be used");
522 WARN(
"tls_min_version SHOULD be 1.2 or greater");
525 if (!SSL_CTX_set_min_proto_version(ctx, min_version)) {
526 fr_tls_log(NULL,
"Failed setting TLS minimum version");
546SSL_CTX *fr_tls_ctx_alloc(fr_tls_conf_t
const *
conf,
bool client)
549 X509_STORE *cert_vpstore;
550 X509_STORE *verify_store;
553 ctx = SSL_CTX_new(TLS_method());
555 fr_tls_log(NULL,
"Failed creating TLS context");
563 SSL_CTX_set_ex_data(ctx, FR_TLS_EX_INDEX_CONF,
UNCONST(
void *,
conf));
568#ifdef PSK_MAX_IDENTITY_LEN
573 if (
conf->psk_query) {
574 if (!*
conf->psk_query) {
575 ERROR(
"Invalid PSK Configuration: psk_query cannot be empty");
581 if (
conf->psk_identity && *
conf->psk_identity) {
582 ERROR(
"Invalid PSK Configuration: psk_identity and psk_query cannot be used at the same time.");
586 if (
conf->psk_password && *
conf->psk_password) {
587 ERROR(
"Invalid PSK Configuration: psk_hexphrase and psk_query cannot be used at the same time.");
592 ERROR(
"Invalid PSK Configuration: psk_query cannot be used for outgoing connections");
599 }
else if (
conf->psk_identity) {
600 if (!*
conf->psk_identity) {
601 ERROR(
"Invalid PSK Configuration: psk_identity is empty");
606 if (!
conf->psk_password || !*
conf->psk_password) {
607 ERROR(
"Invalid PSK Configuration: psk_identity is set, but there is no psk_hexphrase");
611 }
else if (
conf->psk_password) {
612 ERROR(
"Invalid PSK Configuration: psk_hexphrase is set, but there is no psk_identity");
619 if (!client && (
conf->psk_identity ||
conf->psk_query)) {
620 SSL_CTX_set_psk_server_callback(ctx, fr_tls_session_psk_server_cb);
627 if (
conf->psk_identity && *
conf->psk_identity) {
628 size_t psk_len, hex_len;
632 SSL_CTX_set_psk_client_callback(ctx, fr_tls_session_psk_client_cb);
635 if (!
conf->psk_password)
goto error;
637 psk_len = strlen(
conf->psk_password);
638 if (strlen(
conf->psk_password) > (2 * PSK_MAX_PSK_LEN)) {
639 ERROR(
"psk_hexphrase is too long (max %d)", PSK_MAX_PSK_LEN);
650 if (psk_len != (2 * hex_len)) {
651 ERROR(
"psk_hexphrase is not all hex");
665 int mode = SSL_MODE_ASYNC;
676 mode |= SSL_MODE_NO_AUTO_CHAIN;
679 mode |= SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER;
680 mode |= SSL_MODE_AUTO_RETRY;
683 if (mode) SSL_CTX_set_mode(ctx, mode);
693 MEM(verify_store = X509_STORE_new());
696 SSL_CTX_set0_verify_cert_store(ctx, verify_store);
699 SSL_CTX_set_ex_data(ctx, FR_TLS_EX_CTX_INDEX_VERIFY_STORE, verify_store);
704 if (
conf->ca_file ||
conf->ca_path) {
711 if (!X509_STORE_load_locations(verify_store,
conf->ca_file,
conf->ca_path)) {
712 fr_tls_log(NULL,
"Failed reading Trusted root CA list \"%s\"",
725 X509_STORE_set_purpose(verify_store, X509_PURPOSE_SSL_CLIENT);
734 if (
conf->ca_file) SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(
conf->ca_file));
736 X509_STORE_set_default_paths(verify_store);
743 size_t chains_conf = talloc_array_length(
conf->chains);
757 for (i = 0; i < chains_conf; i++) {
758 if (tls_ctx_load_cert_chain(ctx,
conf->chains[i],
false) < 0)
goto error;
770 size_t chains_set = 0;
777 for (ret = SSL_CTX_set_current_cert(ctx, SSL_CERT_SET_FIRST);
779 ret = SSL_CTX_set_current_cert(ctx, SSL_CERT_SET_NEXT)) chains_set++;
785 DEBUG3(
"Found %zu server certificate chain(s)", chains_set);
787 if (chains_set != chains_conf) {
788 WARN(
"Number of chains configured (%zu) does not match chains set (%zu)",
789 chains_conf, chains_set);
790 if (chains_conf > chains_set)
WARN(
"Only one chain per key type is allowed, "
791 "check config for duplicates");
794 for (ret = SSL_CTX_set_current_cert(ctx, SSL_CERT_SET_FIRST);
796 ret = SSL_CTX_set_current_cert(ctx, SSL_CERT_SET_NEXT)) {
797 STACK_OF(X509) *our_chain;
800 our_cert = SSL_CTX_get0_certificate(ctx);
808 if (!SSL_CTX_get0_chain_certs(ctx, &our_chain)) {
809 fr_tls_log(NULL,
"Failed retrieving chain certificates");
815 (void)SSL_CTX_set_current_cert(ctx, SSL_CERT_SET_FIRST);
819#ifdef PSK_MAX_IDENTITY_LEN
822 if (tls_ctx_version_set(&ctx_options, ctx,
conf) < 0)
goto error;
831 if (!
conf->disable_single_dh_use) {
832 ctx_options |= SSL_OP_SINGLE_DH_USE;
835#ifdef SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS
839 if (
conf->allow_renegotiation) {
840 ctx_options |= SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS;
850 ctx_options |= SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS;
857 if (
conf->cipher_server_preference) ctx_options |= SSL_OP_CIPHER_SERVER_PREFERENCE;
859 SSL_CTX_set_options(ctx, ctx_options);
871 if (
conf->padding_block_size) SSL_CTX_set_block_padding(ctx,
conf->padding_block_size);
876#ifndef OPENSSL_NO_ECDH
877 if (ctx_ecdh_curve_set(ctx,
conf->ecdh_curve,
conf->disable_single_dh_use) < 0)
goto error;
882 SSL_CTX_set_info_callback(ctx, fr_tls_session_info_cb);
887#ifdef X509_V_FLAG_CRL_CHECK_ALL
888 if (
conf->verify.check_crl) {
889 cert_vpstore = SSL_CTX_get_cert_store(ctx);
890 if (cert_vpstore == NULL) {
891 fr_tls_log(NULL,
"Error reading Certificate Store");
894 X509_STORE_set_flags(cert_vpstore, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);
895#ifdef X509_V_FLAG_USE_DELTAS
903 X509_STORE_set_flags(cert_vpstore, X509_V_FLAG_USE_DELTAS);
914 if (
conf->verify_depth) {
915 SSL_CTX_set_verify_depth(ctx,
conf->verify_depth);
918#ifdef HAVE_OPENSSL_OCSP_H
922 if (
conf->staple.enable) {
931 if (
conf->cipher_list) {
932 if (!SSL_CTX_set_cipher_list(ctx,
conf->cipher_list)) {
933 fr_tls_log(NULL,
"Failed setting cipher list");
948 fr_tls_log(NULL,
"Failed creating temporary SSL session");
952 DEBUG3(
"Configured ciphers (by priority)");
954 while ((cipher = SSL_get_cipher_list(ssl, i))) {
955 DEBUG3(
"[%u] %s", i, cipher);
966 if (ctx_dh_params_load(ctx,
UNCONST(
char *,
conf->dh_file)) < 0)
goto error;
974 SSL_CTX_set_dh_auto(ctx, 1);
980 if (fr_tls_cache_ctx_init(ctx, &
conf->cache) < 0)
goto error;
985 if ((getenv(
"SSLKEYLOGFILE") != NULL) || (
conf->keylog_file && *
conf->keylog_file)) {
986 SSL_CTX_set_keylog_callback(ctx, fr_tls_session_keylog_cb);
static int const char char buffer[256]
#define fr_base16_decode(_err, _out, _in, _no_trailing)
#define UNCONST(_type, _ptr)
Remove const qualification from a pointer.
#define USES_APPLE_DEPRECATED_API
#define DIAG_UNKNOWN_PRAGMAS
#define FR_DBUFF_TMP(_start, _len_or_end)
Creates a compound literal to pass into functions which accept a dbuff.
#define DEBUG_ENABLED2
True if global debug level 1-2 messages are enabled.
#define DEBUG_ENABLED3
True if global debug level 1-3 messages are enabled.
@ L_DBG
Only displayed when debugging is enabled.
int fr_tls_ocsp_staple_cb(SSL *ssl, void *data)
#define FR_SBUFF_IN(_start, _len_or_end)
char const * fr_syserror(int num)
Guaranteed to be thread-safe version of strerror.
#define fr_unix_time_ispos(_a)
#define fr_unix_time_gt(_a, _b)
#define fr_unix_time_wrap(_time)
char const * fr_tls_utils_x509_pkey_type(X509 *cert)
Returns a friendly identifier for the public key type of a certificate.