OpenVPN 3 Core Library
Loading...
Searching...
No Matches
sslctx.hpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2012- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12// Wrap the OpenSSL SSL API as defined in <openssl/ssl.h>
13// so that it can be used as the SSL layer by the OpenVPN core.
14
15#ifndef OPENVPN_OPENSSL_SSL_SSLCTX_H
16#define OPENVPN_OPENSSL_SSL_SSLCTX_H
17
18#include <map>
19#include <mutex>
20#include <string>
21#include <cstring>
22#include <cstdint>
23#include <sstream>
24#include <utility>
25
26#include <openssl/crypto.h>
27#include <openssl/ssl.h>
28#include <openssl/x509v3.h>
29#include <openssl/rsa.h>
30#include <openssl/dsa.h>
31#include <openssl/ec.h>
32#include <openssl/bn.h>
33#include <openssl/rand.h>
34#include <openssl/evp.h>
35#include <openssl/opensslv.h>
36#if OPENSSL_VERSION_NUMBER >= 0x30000000L
37#include <openssl/provider.h>
38#endif
39
66#if ENABLE_EXTERNAL_PKI
67#if OPENSSL_VERSION_NUMBER >= 0x30000000L
69#else
71#endif
72#endif
82
83
84#ifdef HAVE_JSON
86#endif
87
88// An SSL Context is essentially a configuration that can be used
89// to generate an arbitrary number of actual SSL connections objects.
90
91// OpenSSLContext is an SSL Context implementation that uses the
92// OpenSSL library as a backend.
93
94#if OPENSSL_VERSION_NUMBER < 0x30000000L
95using ssl_mac_ctx = ::HMAC_CTX;
96#else
97using ssl_mac_ctx = ::EVP_MAC_CTX;
98#endif
99
100namespace openvpn {
101
102// Represents an SSL configuration that can be used
103// to instantiate actual SSL sessions.
105{
106 using SSL_CTX_unique_ptr = std::unique_ptr<::SSL_CTX, decltype(&::SSL_CTX_free)>;
107
108 public:
111
112 enum
113 {
114 MAX_CIPHERTEXT_IN = 64 // maximum number of queued input ciphertext packets
115 };
116
127 class Config : public SSLConfigAPI
128 {
129 friend class OpenSSLContext;
130
131 // These can be OR-ed to provide different OpenSSL library configurations.
132 static constexpr unsigned short LIB_CTX_NO_PROVIDERS = 0;
133 static constexpr unsigned short LIB_CTX_LEGACY_PROVIDER = (1 << 0);
134
135#if OPENSSL_VERSION_NUMBER >= 0x30000000L
136 /* OpenSSL library context, used to load non-default providers etc,
137 * made mutable so const function can use/initialise the context.
138 *
139 * First field in this class so it gets destructed last*/
140 using TlsLibCtxType = std::remove_pointer<SSLLib::Ctx>::type;
141 using TlsLibCtxUPtr = std::unique_ptr<TlsLibCtxType, decltype(&::OSSL_LIB_CTX_free)>;
142 using SSLProviderUPtr = std::unique_ptr<OSSL_PROVIDER, decltype(&::OSSL_PROVIDER_unload)>;
143
153 class LibContext
154 {
155 public:
162 LibContext(unsigned short config)
163 : ctx_{OSSL_LIB_CTX_new(), &::OSSL_LIB_CTX_free}
164 {
165 if (!ctx_)
166 throw OpenSSLException("OpenSSLContext: OSSL_LIB_CTX_new failed");
167
168 if (config & LIB_CTX_LEGACY_PROVIDER)
169 {
170 SSLProviderUPtr legacy_provider{OSSL_PROVIDER_load(ctx_.get(), "legacy"), &::OSSL_PROVIDER_unload};
171
172 if (!legacy_provider)
173 throw OpenSSLException("OpenSSLContext: loading legacy provider failed");
174
175 SSLProviderUPtr default_provider{OSSL_PROVIDER_load(ctx_.get(), "default"), &::OSSL_PROVIDER_unload};
176
177 if (!default_provider)
178 throw OpenSSLException("OpenSSLContext: loading default provider failed");
179
180 providers_.emplace_back(std::move(legacy_provider));
181 providers_.emplace_back(std::move(default_provider));
182 }
183 }
184
186 SSLLib::Ctx ctx() const
187 {
188 return ctx_.get();
189 }
190
191 private:
192 TlsLibCtxUPtr ctx_;
193 std::vector<SSLProviderUPtr> providers_;
194 };
195#endif
196
197 public:
199
211 {
212 return SSLFactoryAPI::Ptr(new OpenSSLContext(this));
213 }
214
215 void set_mode(const Mode &mode_arg) override
216 {
217 mode = mode_arg;
218 }
219
220 const Mode &get_mode() const override
221 {
222 return mode;
223 }
224
225 // if this callback is defined, no private key needs to be loaded
226 void set_external_pki_callback(ExternalPKIBase *external_pki_arg, const std::string &alias) override
227 {
228 external_pki = external_pki_arg;
229 external_pki_alias = alias;
230 }
231
232 // server side
233 void set_session_ticket_handler(TLSSessionTicketBase *session_ticket_handler_arg) override
234 {
235 session_ticket_handler = session_ticket_handler_arg;
236 }
237
238 // client side
239 void set_client_session_tickets(const bool v) override
240 {
242 }
243
244 void enable_legacy_algorithms(const bool v) override
245 {
246 if (v)
248 else
249 lib_ctx_provider_config &= ~LIB_CTX_LEGACY_PROVIDER;
250 }
251
252 // server side
253 void set_sni_handler(SNI::HandlerBase *sni_handler_arg) override
254 {
255 sni_handler = sni_handler_arg;
256 }
257
258 // client side
259 void set_sni_name(const std::string &sni_name_arg) override
260 {
261 sni_name = sni_name_arg;
262 }
263
271 void set_cn_reject_handler(CommonNameReject *cn_reject_handler_arg) override
272 {
273 cn_reject_handler = cn_reject_handler_arg;
274 }
275
276 void set_private_key_password(const std::string &pwd) override
277 {
279 }
280
281 void load_ca(const std::string &ca_txt, bool strict) override
282 {
283 ca.parse_pem(ca_txt, "ca");
284 }
285
286 void load_crl(const std::string &crl_txt) override
287 {
288 ca.parse_pem(crl_txt, "crl");
289 }
290
291 void load_cert(const std::string &cert_txt) override
292 {
293 cert.parse_pem(cert_txt, "cert");
294 }
295
296 void load_cert(const std::string &cert_txt, const std::string &extra_certs_txt) override
297 {
299 if (!extra_certs_txt.empty())
300 CertCRLList::from_string(extra_certs_txt, "extra-certs", &extra_certs, nullptr);
301 }
302
303 void load_private_key(const std::string &key_txt) override
304 {
305 pkey.parse_pem(key_txt, "private key", ctx());
306 }
307
308 void load_dh(const std::string &dh_txt) override
309 {
310 dh.parse_pem(dh_txt);
311 }
312
313 std::string extract_ca() const override
314 {
315 return ca.certs.render_pem();
316 }
317
318 std::string extract_crl() const override
319 {
320 return ca.crls.render_pem();
321 }
322
323 std::string extract_cert() const override
324 {
325 return cert.render_pem();
326 }
327
328 std::vector<std::string> extract_extra_certs() const override
329 {
330 std::vector<std::string> ret;
331
332 for (const auto &cert : extra_certs)
333 ret.push_back(cert.render_pem());
334
335 return ret;
336 }
337
338 std::string extract_private_key() const override
339 {
340 return pkey.render_pem();
341 }
342
343 std::string extract_dh() const override
344 {
345 return dh.render_pem();
346 }
347
349 {
350 if (!pkey.defined())
351 return PKType::PK_NONE;
352 return pkey.key_type();
353 }
354
355 size_t private_key_length() const override
356 {
357 return pkey.key_length();
358 }
359
360 void set_frame(const Frame::Ptr &frame_arg) override
361 {
362 frame = frame_arg;
363 }
364
365 void set_debug_level(const int debug_level) override
366 {
367 set_log_level(debug_level);
368 }
369
370 void set_flags(const unsigned int flags_arg) override
371 {
372 flags = flags_arg;
373 }
374
375 void set_ns_cert_type(const NSCert::Type ns_cert_type_arg) override
376 {
377 ns_cert_type = ns_cert_type_arg;
378 }
379
381 {
383 }
384
385 void set_tls_remote(const std::string &tls_remote_arg) override
386 {
387 tls_remote = tls_remote_arg;
388 }
389
390 void set_tls_version_min(const TLSVersion::Type tvm) override
391 {
392 tls_version_min = tvm;
393 }
394
395 void set_tls_version_max(const TLSVersion::Type tvm) override
396 {
397 tls_version_max = tvm;
398 }
399
400 void set_tls_version_min_override(const std::string &override) override
401 {
403 }
404
406 {
407 tls_cert_profile = type;
408 }
409
410 void set_tls_cert_profile_override(const std::string &override) override
411 {
413 }
414
415 virtual void set_tls_cipher_list(const std::string &override)
416 {
417 if (!override.empty())
418 tls_cipher_list = override;
419 }
420
421 virtual void set_tls_ciphersuite_list(const std::string &override)
422 {
423 if (!override.empty())
424 tls_ciphersuite_list = override;
425 }
426
427 virtual void set_tls_groups(const std::string &groups)
428 {
429 if (!groups.empty())
430 tls_groups = groups;
431 }
432
433 void set_local_cert_enabled(const bool v) override
434 {
436 }
437
438 void set_x509_track(X509Track::ConfigSet x509_track_config_arg) override
439 {
440 x509_track_config = std::move(x509_track_config_arg);
441 }
442
443 void set_rng(const StrongRandomAPI::Ptr &rng_arg) override
444 {
445 // Not implemented because OpenSSL is hardcoded to use its own RNG.
446 }
447
448 std::string validate_cert(const std::string &cert_txt) const override
449 {
451 return cert.render_pem();
452 }
453
454 std::string validate_cert_list(const std::string &certs_txt) const override
455 {
456 CertCRLList certs(certs_txt, "cert list");
457 return certs.render_pem();
458 }
459
460 std::string validate_private_key(const std::string &key_txt) const override
461 {
462 OpenSSLPKI::PKey pkey(key_txt, "private key", ctx());
463 return pkey.render_pem();
464 }
465
466 std::string validate_dh(const std::string &dh_txt) const override
467 {
468 OpenSSLPKI::DH dh(dh_txt);
469 return dh.render_pem();
470 }
471
472 std::string validate_crl(const std::string &crl_txt) const override
473 {
474 OpenSSLPKI::CRL crl(crl_txt);
475 return crl.render_pem();
476 }
477
478 void load(const OptionList &opt, const unsigned int lflags) override
479 {
480 // client/server
481 if (lflags & LF_PARSE_MODE)
482 mode = opt.exists("client") ? Mode(Mode::CLIENT) : Mode(Mode::SERVER);
483
484 // possibly disable peer cert verification
486 && opt.exists("client-cert-not-required"))
488
489 // sni
490 {
491 const std::string name = opt.get_optional("sni", 1, 256);
492 if (!name.empty())
493 set_sni_name(name);
494 }
495
496 // ca
497 {
498 std::string ca_txt = opt.cat("ca");
499 if (lflags & LF_RELAY_MODE)
500 ca_txt += opt.cat("relay-extra-ca");
501 load_ca(ca_txt, true);
502 }
503
504 // CRL
505 {
506 const std::string crl_txt = opt.cat("crl-verify");
507 if (!crl_txt.empty())
508 load_crl(crl_txt);
509 }
510
511 // local cert/key
513 {
514 // cert
515 {
516 const std::string &cert_txt = opt.get("cert", 1, Option::MULTILINE);
517 const std::string ec_txt = opt.cat("extra-certs");
518 load_cert(cert_txt, ec_txt);
519 }
520
521 // private key
522 if (!external_pki)
523 {
524 const std::string &key_txt = opt.get("key", 1, Option::MULTILINE);
525 load_private_key(key_txt);
526 }
527 }
528
529 // DH
530 if (mode.is_server() && opt.exists("dh"))
531 {
532 const std::string &dh_txt = opt.get("dh", 1, Option::MULTILINE);
533 load_dh(dh_txt);
534 }
535
536 // relay mode
537 std::string relay_prefix;
538 if (lflags & LF_RELAY_MODE)
539 relay_prefix = "relay-";
540
541 // ns-cert-type
542 ns_cert_type = NSCert::ns_cert_type(opt, relay_prefix);
543
544 // parse remote-cert-x options
545 KUParse::remote_cert_tls(opt, relay_prefix, ku, eku);
546 KUParse::remote_cert_ku(opt, relay_prefix, ku);
547 KUParse::remote_cert_eku(opt, relay_prefix, eku);
548
549 // parse tls-remote
550 tls_remote = opt.get_optional(relay_prefix + "tls-remote", 1, 256);
551
552 // parse verify-x509-name
553 verify_x509_name.init(opt, relay_prefix);
554
555 // parse peer-fingerprint
558 flags |= SSLConst::VERIFY_PEER_FINGERPRINT; // make CA optional
559
560 // Parse tls-version-min option.
562
563 // parse tls-cert-profile
565
566 // Overrides for tls cipher suites
567 if (opt.exists("tls-cipher"))
568 tls_cipher_list = opt.get_optional("tls-cipher", 1, 256);
569
570 if (opt.exists("tls-ciphersuites"))
571 tls_ciphersuite_list = opt.get_optional("tls-ciphersuites", 1, 256);
572
573 if (opt.exists("tls-groups"))
574 tls_groups = opt.get_optional("tls-groups", 1, 256);
575
576 // unsupported cert checkers
577 {
578 }
579 }
580
581#ifdef OPENVPN_JSON_INTERNAL
582 // The get_string_ref methods require internal JSON and do not work with jsoncpp
583 SSLConfigAPI::Ptr json_override(const Json::Value &root, const bool load_cert_key) const override
584 {
585 static const char title[] = "json_override";
586
587 Config::Ptr ret(new Config);
588
589 // inherit from self
590 ret->mode = mode;
591 ret->dh = dh;
592 ret->frame = frame;
593 ret->flags = flags;
594 ret->local_cert_enabled = local_cert_enabled;
595
596 // ca
597 {
598 const std::string &ca_txt = json::get_string_ref(root, "ca", title);
599 ret->load_ca(ca_txt, true);
600 }
601
602 // CRL
603 {
604 const std::string crl_txt = json::get_string_optional(root, "crl_verify", std::string(), title);
605 if (!crl_txt.empty())
606 ret->load_crl(crl_txt);
607 }
608
609 // cert/key
610 if (load_cert_key && local_cert_enabled)
611 {
612 bool loaded_cert = false;
613
614 // cert/extra_certs
615 {
616 const std::string cert_txt = json::get_string_optional(root, "cert", std::string(), title);
617 if (!cert_txt.empty())
618 {
619 const std::string ec_txt = json::get_string_optional(root, "extra_certs", std::string(), title);
620 ret->load_cert(cert_txt, ec_txt);
621 loaded_cert = true;
622 }
623 else
624 {
625 ret->cert = cert;
626 ret->extra_certs = extra_certs;
627 }
628 }
629
630 // private key
631 if (loaded_cert && !external_pki)
632 {
633 const std::string &key_txt = json::get_string_ref(root, "key", title);
634 if (!key_txt.empty())
635 ret->load_private_key(key_txt);
636 else
637 ret->pkey = pkey;
638 }
639 }
640 else
641 {
642 // inherit from self
643 ret->cert = cert;
644 ret->extra_certs = extra_certs;
645 ret->pkey = pkey;
646 }
647
648 // ns_cert_type
649 {
650 const std::string ct = json::get_string_optional(root, "ns_cert_type", std::string(), title);
651 if (!ct.empty())
652 ret->ns_cert_type = NSCert::ns_cert_type(ct);
653 }
654
655 // ku, eku
656 {
657 const std::string ct = json::get_string_optional(root, "remote_cert_tls", std::string(), title);
658 if (!ct.empty())
659 KUParse::remote_cert_tls(ct, ret->ku, ret->eku);
660 }
661
662 // tls_version_min
663 {
664 const std::string tvm = json::get_string_optional(root, "tls_version_min", std::string(), title);
665 if (!tvm.empty())
666 ret->tls_version_min = TLSVersion::parse_tls_version_min(tvm, false, maxver());
667 }
668
669 // tls_cert_profile
670 {
671 const std::string prof = json::get_string_optional(root, "tls_cert_profile", std::string(), title);
672 if (!prof.empty())
673 ret->tls_cert_profile = TLSCertProfile::parse_tls_cert_profile(prof);
674 }
675
676 return ret;
677 }
678#endif
679
680 private:
682 {
683#if OPENSSL_VERSION_NUMBER >= 0x30000000L
685 return lib_ctx->ctx();
686#else
687 return nullptr;
688#endif
689 }
690
693 {
694#if OPENSSL_VERSION_NUMBER >= 0x30000000L
695 std::lock_guard guard{lib_ctx_mutex};
696
697 if (lib_ctx)
698 return;
699
700 auto it = lib_ctx_map.find(lib_ctx_provider_config);
701
702 if (it != lib_ctx_map.end())
703 {
704 auto cached_ctx = it->second.lock();
705
706 if (cached_ctx)
707 {
708 lib_ctx = std::move(cached_ctx);
709 return;
710 }
711 }
712
713 // There's either no cached library context, or the cached context expired.
714 lib_ctx = std::make_shared<LibContext>(lib_ctx_provider_config);
715 lib_ctx_map[lib_ctx_provider_config] = lib_ctx;
716#endif
717 }
718
720 {
721 // Return maximum TLS version supported by OpenSSL.
722 // Assume that presence of SSL_OP_NO_TLSvX macro indicates
723 // that local OpenSSL library implements TLSvX.
724#ifdef SSL_OP_NO_TLSv1_3
726#elif defined(SSL_OP_NO_TLSv1_2)
728#elif defined(SSL_OP_NO_TLSv1_1)
730#else
732#endif
733 }
734
735#if OPENSSL_VERSION_NUMBER >= 0x30000000L
736 /* The C++ standard says:
737 *
738 * 26.2.6 Associative containers [associative.reqmts]
739 *
740 * The insert and emplace members shall not affect the validity of iterators
741 * and references to the container, and the erase members shall invalidate
742 * only iterators and references to the erased elements.
743 *
744 * So we should be safe to return pointers / references to existing
745 * values.
746 */
747 static inline std::map<unsigned short, std::weak_ptr<LibContext>> lib_ctx_map;
748 mutable std::shared_ptr<LibContext> lib_ctx;
749 static inline std::mutex lib_ctx_mutex;
750#endif
752
754 CertCRLList ca; // from OpenVPN "ca" and "crl-verify" option
755 OpenSSLPKI::X509 cert; // from OpenVPN "cert" option
756 OpenSSLPKI::X509List extra_certs; // from OpenVPN "extra-certs" option
757 OpenSSLPKI::PKey pkey; // private key
758 OpenSSLPKI::DH dh; // diffie-hellman parameters (only needed in server mode)
761 TLSSessionTicketBase *session_ticket_handler = nullptr; // server side only
762 SNI::HandlerBase *sni_handler = nullptr; // server side only
765 unsigned int flags = 0; // defined in sslconsts.hpp
766 std::string sni_name; // client side only
768 std::vector<unsigned int> ku; // if defined, peer cert X509 key usage must match one of these values
769 std::string eku; // if defined, peer cert X509 extended key usage must match this OID/string
770 std::string tls_remote;
771 VerifyX509Name verify_x509_name; // --verify-x509-name feature
772 PeerFingerprints peer_fingerprints; // --peer-fingerprint
773 TLSVersion::Type tls_version_min{TLSVersion::Type::V1_2}; // minimum TLS version that we will negotiate
774 TLSVersion::Type tls_version_max{TLSVersion::Type::UNDEF}; // maximum TLS version that we will negotiate, use for testing only (NOT exposed via tls-version-max)
776 std::string tls_cipher_list;
778 std::string tls_groups;
782 };
783
784 // Represents an actual SSL session.
785 // Normally instantiated by OpenSSLContext::ssl().
786 class SSL : public SSLAPI
787 {
788 friend class OpenSSLContext;
789
790 public:
792
793 void start_handshake() override
794 {
795 SSL_do_handshake(ssl);
796 }
797
798 ssize_t write_cleartext_unbuffered(const void *data, const size_t size) override
799 {
800 const int status = BIO_write(ssl_bio, data, numeric_cast<int>(size));
801 if (status < 0)
802 {
803 if (status == -1 && BIO_should_retry(ssl_bio))
805
807 OPENVPN_THROW(OpenSSLException, "OpenSSLContext::SSL::write_cleartext: BIO_write failed, size=" << size << " status=" << status);
808 }
809 else
810 return status;
811 }
812
813 ssize_t read_cleartext(void *data, const size_t capacity) override
814 {
815 if (!overflow)
816 {
817 const int status = BIO_read(ssl_bio, data, numeric_cast<int>(capacity));
818 if (status <= 0)
819 {
820 if ((status == 0 || status == -1) && BIO_should_retry(ssl_bio))
822
824 OPENVPN_THROW(OpenSSLException, "OpenSSLContext::SSL::read_cleartext: BIO_read failed, cap=" << capacity << " status=" << status);
825 }
826 else
827 return status;
828 }
829 else
830 throw ssl_ciphertext_in_overflow();
831 }
832
833 bool read_cleartext_ready() const override
834 {
835 return !bmq_stream::memq_from_bio(ct_in)->empty() || SSL_pending(ssl) > 0;
836 }
837
838 void write_ciphertext(const BufferPtr &buf) override
839 {
841 if (in->size() < MAX_CIPHERTEXT_IN)
842 in->write_buf(buf);
843 else
844 overflow = true;
845 }
846
847 void write_ciphertext_unbuffered(const unsigned char *data, const size_t size) override
848 {
850 if (in->size() < MAX_CIPHERTEXT_IN)
851 in->write(data, size);
852 else
853 overflow = true;
854 }
855
856 bool read_ciphertext_ready() const override
857 {
859 }
860
862 {
864 }
865
866 std::string ssl_handshake_details() const override
867 {
869 }
870
871 bool export_keying_material(const std::string &label, unsigned char *dest, size_t size) override
872 {
873 return SSL_get_session(ssl) && SSL_export_keying_material(ssl, dest, size, label.c_str(), label.size(), nullptr, 0, 0) == 1;
874 }
875
881 bool did_full_handshake() override
882 {
884 return false;
886 return !SSL_session_reused(ssl);
887 }
888
889 const AuthCert::Ptr &auth_cert() const override
890 {
891 // Reused sessions don't call the cert verify callbacks,
892 // so we must use an alternative method to build authcert.
893 if (authcert && !authcert->defined())
895 return authcert;
896 }
897
898 void mark_no_cache() override
899 {
900 sess_cache_key.reset();
901 }
902
904 {
905 ssl_erase();
906 }
907
908 static void init_static()
909 {
911#if OPENSSL_VERSION_NUMBER < 0x30000010L && !defined(OPENSSL_NO_EC) && defined(ENABLE_EXTERNAL_PKI)
913#endif
914
915
916 ssl_data_index = SSL_get_ex_new_index(0, (char *)"OpenSSLContext::SSL", nullptr, nullptr, nullptr);
917 context_data_index = SSL_get_ex_new_index(0, (char *)"OpenSSLContext", nullptr, nullptr, nullptr);
918 }
919
920 static void uninit_static()
921 {
923 }
924
925 private:
926 SSL(const OpenSSLContext &ctx, const std::string *hostname, const std::string *cache_key)
927 {
928 ssl_clear();
929 try
930 {
931 // init SSL objects
932 ssl = SSL_new(ctx.ctx.get());
933 if (!ssl)
934 throw OpenSSLException("OpenSSLContext::SSL: SSL_new failed");
935
936 // release unneeded buffers
937 SSL_set_mode(ssl, SSL_MODE_RELEASE_BUFFERS);
938
939 // verify hostname
940 if (hostname && !(ctx.config->flags & SSLConst::NO_VERIFY_HOSTNAME))
941 {
942 X509_VERIFY_PARAM *param = SSL_get0_param(ssl);
943 X509_VERIFY_PARAM_set_hostflags(param, 0);
944 X509_VERIFY_PARAM_set1_host(param, hostname->c_str(), 0);
945 }
946
947 // init BIOs
948 ssl_bio = BIO_new(BIO_f_ssl());
949 if (!ssl_bio)
950 throw OpenSSLException("OpenSSLContext::SSL: BIO_new BIO_f_ssl failed");
951 ct_in = mem_bio(ctx.config->frame);
952 ct_out = mem_bio(ctx.config->frame);
953
954 // set client/server mode
955 if (ctx.config->mode.is_server())
956 {
957 SSL_set_accept_state(ssl);
958 authcert.reset(new AuthCert());
959 if (!ctx.config->x509_track_config.empty())
961 }
962 else if (ctx.config->mode.is_client())
963 {
964 if (cache_key && ctx.sess_cache)
965 {
966 // see if a cached session already exists for our cache_key
967 ctx.sess_cache->extract(*cache_key, [this](SSL_SESSION *sess)
968 {
969 if (!SSL_set_session(ssl, sess))
970 throw OpenSSLException("SSL_set_session failed"); });
971
972 // cache the session before its end-of-life if no errors occur
973 sess_cache_key.reset(new OpenSSLSessionCache::Key(*cache_key, ctx.sess_cache));
974 }
975 SSL_set_connect_state(ssl);
976
977 // client-side SNI
978 if (!ctx.config->sni_name.empty())
979 {
980 if (SSL_set_tlsext_host_name(ssl, ctx.config->sni_name.c_str()) != 1)
981 throw OpenSSLException("OpenSSLContext::SSL: SSL_set_tlsext_host_name failed (sni_name)");
982 }
983 else if ((ctx.config->flags & SSLConst::ENABLE_CLIENT_SNI) && hostname)
984 {
985 if (SSL_set_tlsext_host_name(ssl, hostname->c_str()) != 1)
986 throw OpenSSLException("OpenSSLContext::SSL: SSL_set_tlsext_host_name failed (hostname)");
987 }
988 }
989 else
990 OPENVPN_THROW(ssl_context_error, "OpenSSLContext::SSL: unknown client/server mode");
991
992 // effect SSL/BIO linkage
993 ssl_bio_linkage = true; // after this point, no need to explicitly BIO_free ct_in/ct_out
994 SSL_set_bio(ssl, ct_in, ct_out);
995 BIO_set_ssl(ssl_bio, ssl, BIO_NOCLOSE);
996
997 if (ssl_data_index < 0)
998 throw ssl_context_error("OpenSSLContext::SSL: ssl_data_index is uninitialized");
999 SSL_set_ex_data(ssl, ssl_data_index, this);
1000 set_parent(&ctx);
1001 }
1002 catch (...)
1003 {
1004 ssl_erase();
1005 throw;
1006 }
1007 }
1008
1010 {
1011 if (context_data_index < 0)
1012 throw ssl_context_error("OpenSSLContext::SSL: context_data_index is uninitialized");
1013 SSL_set_ex_data(ssl, context_data_index, (void *)ctx);
1014 }
1015
1016 void rebuild_authcert() const
1017 {
1018 ::X509 *cert = SSL_get_peer_certificate(ssl);
1019 if (cert)
1020 {
1021 // save the issuer cert fingerprint
1022 static_assert(sizeof(AuthCert::issuer_fp) == SHA_DIGEST_LENGTH, "size inconsistency");
1023
1024 unsigned int md_len = sizeof(AuthCert::issuer_fp);
1025 X509_digest(cert, EVP_sha1(), authcert->issuer_fp, &md_len);
1026
1027 // save the Common Name
1028 authcert->cn = OpenSSLPKI::x509_get_field(cert, NID_commonName);
1029
1030 // save the leaf cert serial number
1032
1033 authcert->defined_ = true;
1034
1035 X509_free(cert);
1036 }
1037 }
1038
1039 // Indicate no data available for our custom SSLv23 method
1040 static int ssl_pending_override(const ::SSL *)
1041 {
1042 return 0;
1043 }
1044
1045 static void print_ec_key_details(EVP_PKEY *pkey, std::ostream &os)
1046 {
1047 std::array<char, 1024> gname{};
1048 size_t gname_sz = gname.size();
1049
1050 const char *group = gname.data();
1051 if (!EVP_PKEY_get_group_name(pkey, gname.data(), gname_sz, &gname_sz))
1052 {
1053 group = "Error getting group name";
1054 }
1055 os << ", " << EVP_PKEY_get_bits(pkey) << " bit EC, group:" << group;
1056 }
1057
1058 // Print a one line summary of SSL/TLS session handshake.
1059 static std::string ssl_handshake_details(::SSL *ssl)
1060 {
1061 std::ostringstream os;
1062
1063 ::X509 *cert = SSL_get_peer_certificate(ssl);
1064
1065 if (cert)
1066 os << "peer certificate: CN=" << OpenSSLPKI::x509_get_field(cert, NID_commonName);
1067
1068 if (cert != nullptr)
1069 {
1070 EVP_PKEY *pkey = X509_get_pubkey(cert);
1071 if (pkey != nullptr)
1072 {
1073#ifndef OPENSSL_NO_EC
1074 if ((EVP_PKEY_id(pkey) == EVP_PKEY_EC))
1075 print_ec_key_details(pkey, os);
1076 else
1077#endif
1078 {
1079#if OPENSSL_VERSION_NUMBER < 0x30000000L
1080 int pkeyId = EVP_PKEY_id(pkey);
1081 const char *pkeySN = OBJ_nid2sn(pkeyId);
1082 if (!pkeySN)
1083 pkeySN = "(error getting public key type)";
1084
1085 // Nicer names instead of rsaEncryption and dsaEncryption
1086 if (pkeyId == EVP_PKEY_RSA)
1087 pkeySN = "RSA";
1088 else if (pkeyId == EVP_PKEY_DSA)
1089 pkeySN = "DSA";
1090#else /* OpenSSL >= 3 */
1091 const char *pkeySN = EVP_PKEY_get0_type_name(pkey);
1092 if (!pkeySN)
1093 {
1094 pkeySN = "(error getting public key type)";
1095 }
1096#endif /* if OPENSSL_VERSION_NUMBER < 0x30000000L */
1097
1098 os << ", " << EVP_PKEY_bits(pkey) << " bit " << pkeySN;
1099 }
1100 EVP_PKEY_free(pkey);
1101 }
1102 X509_free(cert);
1103 }
1104
1105 const SSL_CIPHER *ciph = SSL_get_current_cipher(ssl);
1106 if (ciph)
1107 {
1108 char *desc = SSL_CIPHER_description(ciph, nullptr, 0);
1109 if (!desc)
1110 {
1111 os << ", cipher: Error getting TLS cipher description from SSL_CIPHER_description";
1112 }
1113 else
1114 {
1115 std::string cipher_str(desc);
1116 // remove \n at the end and any other excess whitespace
1117 string::trim(cipher_str);
1118 os << ", cipher: " << cipher_str;
1119 OPENSSL_free(desc);
1120 }
1121 }
1122
1123 if (SSL_session_reused(ssl))
1124 os << " [REUSED]";
1125
1126#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1127 const char *key_agreement = SSL_get0_group_name(ssl);
1128 if (!key_agreement)
1129 {
1130 key_agreement = "(error fetching key-agreeement)";
1131 }
1132 os << ", key-agreement: " << key_agreement;
1133#endif
1134
1135 return os.str();
1136 }
1137
1139 {
1140 ssl_bio_linkage = false;
1141 ssl = nullptr;
1142 ssl_bio = nullptr;
1143 ct_in = nullptr;
1144 ct_out = nullptr;
1145 overflow = false;
1147 sess_cache_key.reset();
1148 }
1149
1151 {
1152 if (!ssl_bio_linkage)
1153 {
1154 if (ct_in)
1155 BIO_free(ct_in);
1156 if (ct_out)
1157 BIO_free(ct_out);
1158 }
1159
1160 BIO_free_all(ssl_bio);
1161 if (sess_cache_key)
1162 {
1163 SSL_set_shutdown(ssl, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN);
1164 sess_cache_key->commit(SSL_get1_session(ssl));
1165 }
1166 SSL_free(ssl);
1168 ssl_clear();
1169 }
1170
1171 static BIO *mem_bio(const Frame::Ptr &frame)
1172 {
1173 BIO *bio = BIO_new(bmq_stream::BIO_s_memq());
1174 if (!bio)
1175 throw OpenSSLException("OpenSSLContext::SSL: BIO_new failed on bmq_stream");
1177 return bio;
1178 }
1179
1180 ::SSL *ssl; // OpenSSL SSL object
1181 BIO *ssl_bio; // read/write cleartext from here
1182 BIO *ct_in; // write ciphertext to here
1183 BIO *ct_out; // read ciphertext from here
1190
1191 // Helps us to store pointer to self in ::SSL object
1192 inline static int ssl_data_index = -1;
1193 inline static int context_data_index = -1;
1194 };
1195
1197 static std::string translate_cipher_list(const std::string &cipherlist)
1198 {
1199 // OpenVPN 2.x accepts IANA ciphers instead in the cipher list, we need
1200 // to do the same
1201
1202 std::stringstream cipher_list_ss(cipherlist);
1203 std::string ciphersuite;
1204
1205 std::stringstream result;
1206
1207
1208 while (std::getline(cipher_list_ss, ciphersuite, ':'))
1209 {
1210 const tls_cipher_name_pair *pair = tls_get_cipher_name_pair(ciphersuite);
1211
1212 if (!result.str().empty())
1213 result << ":";
1214
1215 if (pair)
1216 {
1217 if (pair->iana_name != ciphersuite)
1218 {
1219 OVPN_LOG_INFO("OpenSSLContext: Deprecated cipher suite name '"
1220 << pair->openssl_name << "' please use IANA name ' "
1221 << pair->iana_name << "'");
1222 }
1223 result << pair->openssl_name;
1224 }
1225 else
1226 {
1227 result << ciphersuite;
1228 }
1229 }
1230
1231 return result.str();
1232 }
1233
1234 private:
1236 {
1237 const std::string sess_id_context = config->session_ticket_handler->session_id_context();
1238 if (!SSL_CTX_set_session_id_context(ctx.get(), (unsigned char *)sess_id_context.c_str(), numeric_cast<unsigned int>(sess_id_context.length())))
1239 throw OpenSSLException("OpenSSLContext: SSL_CTX_set_session_id_context failed");
1240
1241#if OPENSSL_VERSION_NUMBER < 0x30000000L
1242 if (!SSL_CTX_set_tlsext_ticket_key_cb(ctx.get(), tls_ticket_key_callback))
1243 throw OpenSSLException("OpenSSLContext: SSL_CTX_set_tlsext_ticket_key_cb failed");
1244#else
1245
1246 if (!SSL_CTX_set_tlsext_ticket_key_evp_cb(ctx.get(), tls_ticket_key_callback))
1247 throw OpenSSLException("OpenSSLContext: SSL_CTX_set_tlsext_ticket_evp_cb failed");
1248#endif
1249 }
1250
1252 : config(config_arg)
1253 {
1254 // Create new SSL_CTX for server or client mode
1255 if (config->mode.is_server())
1256 {
1257 ctx = SSL_CTX_unique_ptr{SSL_CTX_new_ex(libctx(), nullptr, ::TLS_server_method()), ::SSL_CTX_free};
1258 if (!ctx)
1259 throw OpenSSLException("OpenSSLContext: SSL_CTX_new_ex failed for server method");
1260
1261 // Set DH object
1262 if (config->dh.defined())
1263 {
1264#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1265 if (!SSL_CTX_set0_tmp_dh_pkey(ctx.get(), config->dh.obj_release()))
1266 throw OpenSSLException("OpenSSLContext: SSL_CTX_set0_tmp_dh_pkey failed");
1267#else
1268 if (!SSL_CTX_set_tmp_dh(ctx.get(), config->dh.obj()))
1269 throw OpenSSLException("OpenSSLContext: SSL_CTX_set_tmp_dh failed");
1270#endif
1271 }
1273 SSL_CTX_set_purpose(ctx.get(), X509_PURPOSE_SSL_SERVER);
1274
1275 // server-side SNI
1276 if (config->sni_handler)
1277 {
1278 SSL_CTX_set_client_hello_cb(ctx.get(), client_hello_callback, nullptr);
1279 }
1280 }
1281 else if (config->mode.is_client())
1282 {
1283 ctx = SSL_CTX_unique_ptr{SSL_CTX_new_ex(libctx(), nullptr, ::TLS_client_method()), &::SSL_CTX_free};
1284 if (!ctx)
1285 throw OpenSSLException("OpenSSLContext: SSL_CTX_new_ex failed for client method");
1286 }
1287 else
1288 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: unknown config->mode");
1289
1290 // Set SSL options
1292 {
1293 int vf = SSL_VERIFY_PEER;
1295 vf |= SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
1296 SSL_CTX_set_verify(ctx.get(),
1297 vf,
1301 SSL_CTX_set_verify_depth(ctx.get(), 16);
1302 }
1303
1304 /* Disable SSLv2 and SSLv3, might be a noop but does not hurt */
1305 long sslopt = SSL_OP_SINGLE_DH_USE | SSL_OP_SINGLE_ECDH_USE | SSL_OP_NO_COMPRESSION | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
1306
1307#ifdef SSL_OP_NO_RENEGOTIATION
1308 sslopt |= SSL_OP_NO_RENEGOTIATION;
1309#endif
1310
1311 if (config->mode.is_server())
1312 {
1313 SSL_CTX_set_session_cache_mode(ctx.get(), SSL_SESS_CACHE_OFF);
1315 {
1317 }
1318 else
1319 sslopt |= SSL_OP_NO_TICKET;
1320
1321 // send a client CA list to the client
1323 {
1324 for (const auto &e : config->ca.certs)
1325 {
1326 if (SSL_CTX_add_client_CA(ctx.get(), e.obj()) != 1)
1327 throw OpenSSLException("OpenSSLContext: SSL_CTX_add_client_CA failed");
1328 }
1329 }
1330 }
1331 else
1332 {
1334 {
1335 SSL_CTX_set_session_cache_mode(ctx.get(), SSL_SESS_CACHE_CLIENT);
1337 }
1338 else
1339 {
1340 SSL_CTX_set_session_cache_mode(ctx.get(), SSL_SESS_CACHE_OFF);
1341 sslopt |= SSL_OP_NO_TICKET;
1342 }
1343 }
1344#if OPENSSL_VERSION_NUMBER >= 0x10100000L
1346 {
1347 SSL_CTX_set_min_proto_version(ctx.get(), TLSVersion::toTLSVersion(config->tls_version_min));
1348 }
1349#else
1351 sslopt |= SSL_OP_NO_TLSv1;
1352#ifdef SSL_OP_NO_TLSv1_1
1354 sslopt |= SSL_OP_NO_TLSv1_1;
1355#endif
1356#ifdef SSL_OP_NO_TLSv1_2
1358 sslopt |= SSL_OP_NO_TLSv1_2;
1359#endif
1360#ifdef SSL_OP_NO_TLSv1_3
1362 sslopt |= SSL_OP_NO_TLSv1_3;
1363#endif
1364#endif
1365#if OPENSSL_VERSION_NUMBER >= 0x10100000L
1367 {
1368 SSL_CTX_set_max_proto_version(ctx.get(), TLSVersion::toTLSVersion(config->tls_version_max));
1369 }
1370#else
1372 sslopt |= SSL_OP_NO_TLSv1;
1373#ifdef SSL_OP_NO_TLSv1_1
1375 sslopt |= SSL_OP_NO_TLSv1_1;
1376#endif
1377#ifdef SSL_OP_NO_TLSv1_2
1379 sslopt |= SSL_OP_NO_TLSv1_2;
1380#endif
1381#ifdef SSL_OP_NO_TLSv1_3
1383 sslopt |= SSL_OP_NO_TLSv1_3;
1384#endif
1385#endif
1386 SSL_CTX_set_options(ctx.get(), sslopt);
1387
1388 if (!config->tls_groups.empty())
1389 {
1391 }
1392#ifdef TLS1_3_VERSION
1393 if (!config->tls_ciphersuite_list.empty())
1394 {
1395 if (!SSL_CTX_set_ciphersuites(ctx.get(), config->tls_ciphersuite_list.c_str()))
1396 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: SSL_CTX_set_ciphersuites_list failed");
1397 }
1398#endif
1399 std::string tls_cipher_list =
1400 /* default list as a basis */
1401 "DEFAULT"
1402 /* Disable export ciphers, low and medium */
1403 ":!EXP:!LOW:!MEDIUM"
1404 /* Disable static (EC)DH keys (no forward secrecy) */
1405 ":!kDH:!kECDH"
1406 /* Disable DSA private keys */
1407 ":!DSS"
1408 /* Disable RC4 cipher */
1409 ":!RC4"
1410 /* Disable MD5 */
1411 ":!MD5"
1412 /* Disable unsupported TLS modes */
1413 ":!PSK:!SRP:!kRSA"
1414 /* Disable SSLv2 cipher suites*/
1415 ":!SSLv2";
1416
1417 /* If we are using preferred, we also do not want to allow SHA1
1418 * cipher suites. This is also included in security level 4 of
1419 * OpenSSL*/
1421 tls_cipher_list += ":!SHA1";
1422
1423 if (!config->tls_cipher_list.empty())
1424 {
1425 tls_cipher_list = translate_cipher_list(config->tls_cipher_list);
1426 }
1427
1428 if (!SSL_CTX_set_cipher_list(ctx.get(), tls_cipher_list.c_str()))
1429 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: SSL_CTX_set_cipher_list failed");
1430#if OPENSSL_VERSION_NUMBER >= 0x10002000L && OPENSSL_VERSION_NUMBER < 0x10100000L
1431 SSL_CTX_set_ecdh_auto(ctx.get(), 1); // this method becomes a no-op in OpenSSL 1.1
1432#endif
1433
1434#if OPENSSL_VERSION_NUMBER >= 0x10100000L
1436 {
1438 OPENVPN_THROW(ssl_context_error,
1439 "OpenSSLContext: undefined tls-cert-profile");
1440 break;
1441#ifdef OPENVPN_ALLOW_INSECURE_CERTPROFILE
1442 case TLSCertProfile::INSECURE:
1443 SSL_CTX_set_security_level(ctx.get(), 0);
1444 break;
1445#endif
1447 SSL_CTX_set_security_level(ctx.get(), 1);
1448 break;
1450 SSL_CTX_set_security_level(ctx.get(), 2);
1451 break;
1453 SSL_CTX_set_security_level(ctx.get(), 3);
1454 break;
1455 default:
1456 OPENVPN_THROW(ssl_context_error,
1457 "OpenSSLContext: unexpected tls-cert-profile value");
1458 break;
1459 }
1460#else
1461 // when OpenSSL does not CertProfile support we force the user to set 'legacy'
1463 {
1464 OPENVPN_THROW(ssl_context_error,
1465 "OpenSSLContext: tls-cert-profile not supported by this OpenSSL build. Use 'legacy' instead");
1466 }
1467#endif
1468
1470 {
1471 // Set certificate
1472 if (!config->cert.defined())
1473 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: cert not defined");
1474 if (SSL_CTX_use_certificate(ctx.get(), config->cert.obj()) != 1)
1475 throw OpenSSLException("OpenSSLContext: SSL_CTX_use_certificate failed");
1476
1477 // Set private key
1478 if (config->external_pki)
1479 {
1480#ifdef ENABLE_EXTERNAL_PKI
1481#if OPENSSL_VERSION_NUMBER >= 0x30000010L
1483
1484#else
1485 auto certType = EVP_PKEY_id(X509_get0_pubkey(config->cert.obj()));
1486 if (certType == EVP_PKEY_RSA)
1487 {
1488 epki = std::make_shared<ExternalPKIImpl>(ExternalPKIRsaImpl(ctx.get(), config->cert.obj(), config->external_pki, config->external_pki_alias));
1489 }
1490#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(OPENSSL_NO_EC)
1491 else if (certType == EVP_PKEY_EC)
1492 {
1493 epki = std::make_shared<ExternalPKIImpl>(ExternalPKIECImpl(ctx.get(), config->cert.obj(), config->external_pki, config->external_pki_alias));
1494 }
1495#endif
1496 else
1497 {
1498 throw OpenSSLException("OpenSSLContext: pkey is neither RSA nor EC. Unsupported with external pki");
1499 }
1500#endif
1501#else
1502 throw OpenSSLException("OpenSSLContext: External PKI is not enabled in this build. ");
1503#endif
1504 }
1505 else
1506 {
1507 if (!config->pkey.defined())
1508 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: private key not defined");
1509 if (SSL_CTX_use_PrivateKey(ctx.get(), config->pkey.obj()) != 1)
1510 throw OpenSSLException("OpenSSLContext: SSL_CTX_use_PrivateKey failed");
1511
1512 // Check cert/private key compatibility
1513 if (!SSL_CTX_check_private_key(ctx.get()))
1514 throw OpenSSLException("OpenSSLContext: private key does not match the certificate");
1515 }
1516
1517 // Set extra certificates that are part of our own certificate
1518 // chain but shouldn't be included in the verify chain.
1519 if (config->extra_certs.defined())
1520 {
1521 for (const auto &e : config->extra_certs)
1522 {
1523 if (SSL_CTX_add_extra_chain_cert(ctx.get(), e.obj_dup()) != 1)
1524 throw OpenSSLException("OpenSSLContext: SSL_CTX_add_extra_chain_cert failed");
1525 }
1526 }
1527 }
1528
1529 // Set CAs/CRLs
1530 if (config->ca.certs.defined())
1533 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: CA not defined");
1534
1535 // Show handshake debugging info
1537 SSL_CTX_set_info_callback(ctx.get(), info_callback);
1538 }
1539
1540 public:
1541 // create a new SSL instance
1542 SSLAPI::Ptr ssl() override
1543 {
1544 return SSL::Ptr(new SSL(*this, nullptr, nullptr));
1545 }
1546
1547 // like ssl() above but verify hostname against cert CommonName and/or SubjectAltName
1548 SSLAPI::Ptr ssl(const std::string *hostname, const std::string *cache_key) override
1549 {
1550 return SSL::Ptr(new SSL(*this, hostname, cache_key));
1551 }
1552
1554 {
1555 SSLLib::Ctx lib_ctx = config->ctx();
1556#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1557 if (!lib_ctx)
1558 throw OpenSSLException("OpenSSLContext: library context is not initialised");
1559#endif
1560 return lib_ctx;
1561 }
1562
1563
1565 {
1566 OpenSSLPKI::X509Store store(cc);
1567 SSL_CTX_set_cert_store(ctx.get(), store.release());
1568 }
1569
1570 ~OpenSSLContext() = default;
1571
1572 const Mode &mode() const override
1573 {
1574 return config->mode;
1575 }
1576
1577 constexpr static bool support_key_material_export()
1578 {
1579 return true;
1580 }
1581
1582#ifdef UNIT_TEST
1583 static void load_cert_info_into_authcert(AuthCert &authcert, const std::string &cert_txt)
1584 {
1585 const OpenSSLPKI::X509 cert(cert_txt, "OpenSSLContext::load_cert_info_into_authcert");
1586
1587 // save the issuer cert fingerprint
1588 {
1589 unsigned int md_len = sizeof(AuthCert::issuer_fp);
1590 X509_digest(cert.obj(), EVP_sha1(), authcert.issuer_fp, &md_len);
1591 }
1592
1593 // save the Common Name
1594 authcert.cn = OpenSSLPKI::x509_get_field(cert.obj(), NID_commonName);
1595
1596 // save the cert serial number
1597 load_serial_number_into_authcert(authcert, cert.obj());
1598
1599 authcert.defined_ = true;
1600 }
1601#endif
1602
1603 private:
1604 // ns-cert-type verification
1605
1607 {
1608 return config->ns_cert_type != NSCert::NONE;
1609 }
1610
1611 bool verify_ns_cert_type(::X509 *cert) const
1612 {
1614 return X509_check_purpose(cert, X509_PURPOSE_SSL_SERVER, 0);
1616 return X509_check_purpose(cert, X509_PURPOSE_SSL_CLIENT, 0);
1617 return true;
1618 }
1619
1620
1621 void set_openssl_tls_groups(const std::string &tls_groups)
1622 {
1623#if OPENSSL_VERSION_NUMBER < 0x30000000L
1624 auto num_groups = std::count(tls_groups.begin(), tls_groups.end(), ':') + 1;
1625
1626 std::unique_ptr<int[]> glist(new int[num_groups]);
1627
1628 std::stringstream groups_ss(tls_groups);
1629 std::string group;
1630
1631 int glistlen = 0;
1632 while (std::getline(groups_ss, group, ':'))
1633 {
1634 /* Dance around that the fact that even though OpenSSL authors
1635 * call this group secp256r1 in their own source code, OpenSSL
1636 * externally only knows this by prime256v1 or P-256 */
1637 if (group == "secp256r1")
1638 {
1639 group = "prime256v1";
1640 }
1641
1642 int nid = OBJ_sn2nid(group.c_str());
1643 if (nid != 0)
1644 {
1645 glist[glistlen] = nid;
1646 glistlen++;
1647 }
1648 else
1649 {
1650 OVPN_LOG_INFO("OpenSSL -- warning ignoring unknown group '"
1651 << group << "' in tls-groups");
1652 }
1653 }
1654
1655 if (!SSL_CTX_set1_groups(ctx.get(), glist.get(), glistlen))
1656 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: SSL_CTX_set1_groups failed");
1657#else
1658 if (!SSL_CTX_set1_groups_list(ctx.get(), tls_groups.c_str()))
1659 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: SSL_CTX_set1_groups_list failed");
1660#endif
1661 }
1662
1663 // remote-cert-ku verification
1664
1666 {
1667 return !config->ku.empty();
1668 }
1669
1670 bool verify_x509_cert_ku(::X509 *cert) const
1671 {
1672 bool found = false;
1673 ASN1_BIT_STRING *ku = (ASN1_BIT_STRING *)X509_get_ext_d2i(cert, NID_key_usage, nullptr, nullptr);
1674
1675 if (ku)
1676 {
1677 // Extract key usage bits
1678 unsigned int nku = 0;
1679 {
1680 for (int i = 0; i < 8; i++)
1681 {
1682 if (ASN1_BIT_STRING_get_bit(ku, i))
1683 nku |= 1 << (7 - i);
1684 }
1685 }
1686
1687 // Fixup if no LSB bits
1688 if ((nku & 0xff) == 0)
1689 nku >>= 8;
1690
1691 // Validating certificate key usage
1692 {
1693 for (std::vector<unsigned int>::const_iterator i = config->ku.begin(); i != config->ku.end(); ++i)
1694 {
1695 if (nku == *i)
1696 {
1697 found = true;
1698 break;
1699 }
1700 }
1701 }
1702
1703 ASN1_BIT_STRING_free(ku);
1704 }
1705 return found;
1706 }
1707
1708 // remote-cert-eku verification
1709
1711 {
1712 return !config->eku.empty();
1713 }
1714
1715 bool verify_x509_cert_eku(::X509 *cert) const
1716 {
1717 bool found = false;
1718 EXTENDED_KEY_USAGE *eku = (EXTENDED_KEY_USAGE *)X509_get_ext_d2i(cert, NID_ext_key_usage, nullptr, nullptr);
1719
1720 if (eku)
1721 {
1722 // Validating certificate extended key usage
1723 for (int i = 0; !found && i < sk_ASN1_OBJECT_num(eku); i++)
1724 {
1725 ASN1_OBJECT *oid = sk_ASN1_OBJECT_value(eku, i);
1726 char oid_str[256];
1727
1728 if (!found && OBJ_obj2txt(oid_str, sizeof(oid_str), oid, 0) != -1)
1729 {
1730 // Compare EKU against string
1731 if (config->eku == oid_str)
1732 found = true;
1733 }
1734
1735 if (!found && OBJ_obj2txt(oid_str, sizeof(oid_str), oid, 1) != -1)
1736 {
1737 // Compare EKU against OID
1738 if (config->eku == oid_str)
1739 found = true;
1740 }
1741 }
1742
1743 sk_ASN1_OBJECT_pop_free(eku, ASN1_OBJECT_free);
1744 }
1745 return found;
1746 }
1747
1748 static void x509_track_extract_nid(const X509Track::Type xt_type,
1749 const int nid,
1750 ::X509 *cert,
1751 const int depth,
1752 X509Track::Set &xts)
1753 {
1754 const std::string value = OpenSSLPKI::x509_get_field(cert, nid);
1755 if (!value.empty())
1756 xts.emplace_back(xt_type, depth, OpenSSLPKI::x509_get_field(cert, nid));
1757 }
1758
1759 static void x509_track_extract_from_cert(::X509 *cert,
1760 const int depth,
1761 const X509Track::ConfigSet &cs,
1762 X509Track::Set &xts)
1763 {
1764 for (auto &c : cs)
1765 {
1766 if (c.depth_match(depth))
1767 {
1768 switch (c.type)
1769 {
1770 case X509Track::SERIAL:
1771 {
1772 std::string serial = OpenSSLPKI::x509_get_serial(cert);
1773 if (!serial.empty())
1774 xts.emplace_back(X509Track::SERIAL,
1775 depth,
1776 serial);
1777 }
1778 break;
1780 xts.emplace_back(X509Track::SERIAL_HEX,
1781 depth,
1783 break;
1784 case X509Track::SHA1:
1785 {
1786 unsigned char buf[EVP_MAX_MD_SIZE];
1787 unsigned int len = EVP_MAX_MD_SIZE;
1788 X509_digest(cert, EVP_sha1(), buf, &len);
1789 xts.emplace_back(X509Track::SHA1,
1790 depth,
1791 render_hex_sep(buf, len, ':', true));
1792 }
1793 break;
1794 case X509Track::CN:
1795 x509_track_extract_nid(X509Track::CN, NID_commonName, cert, depth, xts);
1796 break;
1797 case X509Track::C:
1798 x509_track_extract_nid(X509Track::C, NID_countryName, cert, depth, xts);
1799 break;
1800 case X509Track::L:
1801 x509_track_extract_nid(X509Track::L, NID_localityName, cert, depth, xts);
1802 break;
1803 case X509Track::ST:
1804 x509_track_extract_nid(X509Track::ST, NID_stateOrProvinceName, cert, depth, xts);
1805 break;
1806 case X509Track::O:
1807 x509_track_extract_nid(X509Track::O, NID_organizationName, cert, depth, xts);
1808 break;
1809 case X509Track::OU:
1810 x509_track_extract_nid(X509Track::OU, NID_organizationalUnitName, cert, depth, xts);
1811 break;
1812 case X509Track::EMAIL:
1813 x509_track_extract_nid(X509Track::EMAIL, NID_pkcs9_emailAddress, cert, depth, xts);
1814 break;
1815 default:
1816 break;
1817 }
1818 }
1819 }
1820 }
1821
1822 static void load_serial_number_into_authcert(AuthCert &authcert, ::X509 *cert)
1823 {
1824 const ASN1_INTEGER *ai = X509_get_serialNumber(cert);
1825 if (!ai)
1826 return;
1827 if (ai->type == V_ASN1_NEG_INTEGER) // negative serial number is considered to be undefined
1828 return;
1829 if (!is_safe_conversion<int>(authcert.serial.size()))
1830 return;
1831 BIGNUM *bn = ASN1_INTEGER_to_BN(ai, NULL);
1832 if (!bn)
1833 return;
1834
1835 BN_bn2binpad(bn, authcert.serial.number(), static_cast<int>(authcert.serial.size()));
1836 BN_free(bn);
1837 }
1838
1839 static std::string cert_status_line(int preverify_ok,
1840 int depth,
1841 int err,
1842 const std::string &signature,
1843 const std::string &subject)
1844 {
1845 std::string ret;
1846 ret.reserve(128);
1847 ret = "VERIFY";
1848 if (preverify_ok)
1849 ret += " OK";
1850 else
1851 ret += " FAIL";
1852 ret += ": depth=";
1853 ret += openvpn::to_string(depth);
1854 ret += ", ";
1855 if (!subject.empty())
1856 ret += subject;
1857 else
1858 ret += "NO_SUBJECT";
1859 ret += ", signature: " + signature;
1860 if (!preverify_ok)
1861 {
1862 ret += " [";
1863 ret += X509_verify_cert_error_string(err);
1864 ret += ']';
1865 }
1866 return ret;
1867 }
1868
1869 static AuthCert::Fail::Type cert_fail_code(const int openssl_err)
1870 {
1871 // NOTE: this method should never return OK
1872 switch (openssl_err)
1873 {
1874 case X509_V_ERR_CERT_HAS_EXPIRED:
1876 default:
1878 }
1879 }
1880
1881
1882 static int check_cert_warnings(const X509 *cert)
1883 {
1884 int nid = X509_get_signature_nid(cert);
1885
1886 switch (nid)
1887 {
1888 case NID_ecdsa_with_SHA1:
1889 case NID_dsaWithSHA:
1890 case NID_dsaWithSHA1:
1891 case NID_sha1WithRSAEncryption:
1893 case NID_md5WithRSA:
1894 case NID_md5WithRSAEncryption:
1896 default:
1897 return SSLAPI::TLS_WARN_NONE;
1898 }
1899 }
1900
1901 static int verify_callback_client(int preverify_ok, X509_STORE_CTX *ctx)
1902 {
1903 // get the OpenSSL SSL object
1904 ::SSL *ssl = (::SSL *)X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
1905
1906 // get OpenSSLContext
1907 const OpenSSLContext *self = (OpenSSLContext *)SSL_get_ex_data(ssl, SSL::context_data_index);
1908
1909 // get OpenSSLContext::SSL
1910 SSL *self_ssl = (SSL *)SSL_get_ex_data(ssl, SSL::ssl_data_index);
1911
1912 // get depth
1913 const int depth = X509_STORE_CTX_get_error_depth(ctx);
1914
1915 // get current certificate
1916 X509 *current_cert = X509_STORE_CTX_get_current_cert(ctx);
1917
1918 // log subject
1919 const std::string subject = OpenSSLPKI::x509_get_subject(current_cert);
1921 {
1922 // don't log self-signed leaf-cert errors with peer-fingerprint validation
1923 int err = X509_STORE_CTX_get_error(ctx);
1924 if (preverify_ok
1925 || err != X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
1927 {
1928 auto sign_alg = OpenSSLPKI::x509_get_signature_algorithm(current_cert);
1929 OVPN_LOG_INFO(cert_status_line(preverify_ok, depth, err, sign_alg, subject));
1930 // Output the certificates itself for debug logging
1932 }
1933 }
1934
1935 // Add warnings if Cert parameters are wrong
1936 self_ssl->tls_warnings |= self->check_cert_warnings(current_cert);
1937
1938 // If a verification error occured in the certificate chain, we
1939 // never override the result of the verification.
1940 if (depth != 0)
1941 return preverify_ok;
1942
1943 // peer-fingerprint
1945 if (self->config->peer_fingerprints)
1946 {
1947 // might override the OpenSSL verification result to "true"
1948 // since we only care about the fingerprint and not the
1949 // certificate chain.
1950 preverify_ok = self->config->peer_fingerprints.match(fp);
1951 if (!preverify_ok)
1952 {
1953 OVPN_LOG_INFO("VERIFY FAIL -- bad peer-fingerprint in leaf certificate");
1954 }
1955 }
1956
1957 // verify ns-cert-type
1958 if (self->ns_cert_type_defined() && !self->verify_ns_cert_type(current_cert))
1959 {
1960 OVPN_LOG_INFO("VERIFY FAIL -- bad ns-cert-type in leaf certificate");
1961 preverify_ok = false;
1962 }
1963
1964 // verify X509 key usage
1965 if (self->x509_cert_ku_defined() && !self->verify_x509_cert_ku(current_cert))
1966 {
1967 OVPN_LOG_INFO("VERIFY FAIL -- bad X509 key usage in leaf certificate");
1968 preverify_ok = false;
1969 }
1970
1971 // verify X509 extended key usage
1972 if (self->x509_cert_eku_defined() && !self->verify_x509_cert_eku(current_cert))
1973 {
1974 OVPN_LOG_INFO("VERIFY FAIL -- bad X509 extended key usage in leaf certificate");
1975 preverify_ok = false;
1976 }
1977
1978 // verify-x509-name
1979 const VerifyX509Name &verify_x509 = self->config->verify_x509_name;
1980 if (verify_x509.get_mode() != VerifyX509Name::VERIFY_X509_NONE)
1981 {
1982 std::string name;
1984 name = OpenSSLPKI::x509_get_subject(current_cert, true);
1985 else
1986 name = OpenSSLPKI::x509_get_field(current_cert, NID_commonName);
1987
1988 if (!verify_x509.verify(name))
1989 {
1990 OVPN_LOG_INFO("VERIFY FAIL -- verify-x509-name failed");
1991 preverify_ok = false;
1992 }
1993 }
1994
1995 // verify tls-remote
1996 if (!self->config->tls_remote.empty())
1997 {
1998 const std::string subj = TLSRemote::sanitize_x509_name(subject);
1999 const std::string common_name = TLSRemote::sanitize_common_name(OpenSSLPKI::x509_get_field(current_cert, NID_commonName));
2000 TLSRemote::log(self->config->tls_remote, subj, common_name);
2001 if (!TLSRemote::test(self->config->tls_remote, subj, common_name))
2002 {
2003 OVPN_LOG_INFO("VERIFY FAIL -- tls-remote match failed");
2004 preverify_ok = false;
2005 }
2006 }
2007
2008 return preverify_ok;
2009 }
2010
2011 static int verify_callback_server(int preverify_ok, X509_STORE_CTX *ctx)
2012 {
2013 // get the OpenSSL SSL object
2014 ::SSL *ssl = (::SSL *)X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
2015
2016 // get OpenSSLContext
2017 const OpenSSLContext *self = (OpenSSLContext *)SSL_get_ex_data(ssl, SSL::context_data_index);
2018
2019 // get OpenSSLContext::SSL
2020 SSL *self_ssl = (SSL *)SSL_get_ex_data(ssl, SSL::ssl_data_index);
2021
2022 // get error code
2023 const int err = X509_STORE_CTX_get_error(ctx);
2024
2025 // get depth
2026 const int depth = X509_STORE_CTX_get_error_depth(ctx);
2027
2028 // get current certificate
2029 X509 *current_cert = X509_STORE_CTX_get_current_cert(ctx);
2030
2031 // log subject
2033 {
2034 // don't log self-signed leaf-cert errors with peer-fingerprint validation
2035 int err = X509_STORE_CTX_get_error(ctx);
2036 if (preverify_ok
2037 || err != X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
2039 {
2040 const auto sign_alg = OpenSSLPKI::x509_get_signature_algorithm(current_cert);
2041 const auto subject = OpenSSLPKI::x509_get_subject(current_cert);
2042 OVPN_LOG_INFO(cert_status_line(preverify_ok, depth, err, sign_alg, subject));
2043 }
2044 }
2045
2046 // record cert error in authcert
2047 if (!preverify_ok && self_ssl->authcert)
2048 self_ssl->authcert->add_fail(depth,
2049 cert_fail_code(err),
2050 X509_verify_cert_error_string(err));
2051
2052 // Note on X509_STORE_CTX_set_error: see ssl/statem/statem_lib.c in
2053 // OpenSSL source for mapping from X509_STORE_CTX_set_error() codes
2054 // to TLS alert codes.
2055 if (depth == 1) // issuer cert
2056 {
2057 // save the issuer cert fingerprint
2058 if (self_ssl->authcert)
2059 {
2060 static_assert(sizeof(AuthCert::issuer_fp) == SHA_DIGEST_LENGTH, "size inconsistency");
2061 unsigned int digest_len = sizeof(AuthCert::issuer_fp);
2062 if (!X509_digest(current_cert, EVP_sha1(), self_ssl->authcert->issuer_fp, &digest_len))
2063 preverify_ok = false;
2064 }
2065 }
2066 else if (depth == 0) // leaf cert
2067 {
2068 // peer-fingerprint
2070 if (self->config->peer_fingerprints && !self->config->peer_fingerprints.match(fp))
2071 {
2072 OVPN_LOG_INFO("VERIFY FAIL -- bad peer-fingerprint in leaf certificate");
2073 if (self_ssl->authcert)
2074 self_ssl->authcert->add_fail(depth,
2076 "bad peer-fingerprint in leaf certificate");
2077 X509_STORE_CTX_set_error(ctx, X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE); // alert code: SSL_R_TLSV1_ALERT_UNKNOWN_CA
2078 preverify_ok = false;
2079 }
2080
2081 // verify ns-cert-type
2082 if (self->ns_cert_type_defined() && !self->verify_ns_cert_type(current_cert))
2083 {
2084 OVPN_LOG_INFO("VERIFY FAIL -- bad ns-cert-type in leaf certificate");
2085 if (self_ssl->authcert)
2086 self_ssl->authcert->add_fail(depth,
2088 "bad ns-cert-type in leaf certificate");
2089 X509_STORE_CTX_set_error(ctx, X509_V_ERR_INVALID_PURPOSE); // alert code: SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE
2090 preverify_ok = false;
2091 }
2092
2093 // verify X509 key usage
2094 if (self->x509_cert_ku_defined() && !self->verify_x509_cert_ku(current_cert))
2095 {
2096 OVPN_LOG_INFO("VERIFY FAIL -- bad X509 key usage in leaf certificate");
2097 if (self_ssl->authcert)
2098 self_ssl->authcert->add_fail(depth,
2100 "bad X509 key usage in leaf certificate");
2101 X509_STORE_CTX_set_error(ctx, X509_V_ERR_INVALID_PURPOSE); // alert code: SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE
2102 preverify_ok = false;
2103 }
2104
2105 // verify X509 extended key usage
2106 if (self->x509_cert_eku_defined() && !self->verify_x509_cert_eku(current_cert))
2107 {
2108 OVPN_LOG_INFO("VERIFY FAIL -- bad X509 extended key usage in leaf certificate");
2109 if (self_ssl->authcert)
2110 self_ssl->authcert->add_fail(depth,
2112 "bad X509 extended key usage in leaf certificate");
2113 X509_STORE_CTX_set_error(ctx, X509_V_ERR_INVALID_PURPOSE); // alert code: SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE
2114 preverify_ok = false;
2115 }
2116
2117 // get the Common name
2118 std::string cn = OpenSSLPKI::x509_get_field(current_cert, NID_commonName);
2119
2120 // early rejection of Common Name?
2121 if (self->config->cn_reject_handler)
2122 {
2123 try
2124 {
2125 if (self->config->cn_reject_handler->reject(cn))
2126 {
2127 OVPN_LOG_INFO("VERIFY FAIL -- early rejection of leaf cert Common Name");
2128 X509_STORE_CTX_set_error(ctx, X509_V_ERR_CERT_REJECTED); // alert code: SSL_R_SSLV3_ALERT_BAD_CERTIFICATE
2129 preverify_ok = false;
2130 }
2131 }
2132 catch (const std::exception &e)
2133 {
2134 OVPN_LOG_INFO("VERIFY FAIL -- early rejection of leaf cert Common Name due to handler exception: " << e.what());
2135 X509_STORE_CTX_set_error(ctx, X509_V_ERR_CERT_REJECTED); // alert code: SSL_R_SSLV3_ALERT_BAD_CERTIFICATE
2136 preverify_ok = false;
2137 }
2138 }
2139
2140 if (self_ssl->authcert)
2141 {
2142 // save the Common Name
2143 self_ssl->authcert->cn = std::move(cn); // NOTE: cn is consumed!
2144
2145 // save the leaf cert serial number
2146 load_serial_number_into_authcert(*self_ssl->authcert, current_cert);
2147
2148 self_ssl->authcert->defined_ = true;
2149 }
2150 }
2151
2152 // x509-track enabled?
2153 if (self_ssl->authcert && self_ssl->authcert->x509_track)
2154 x509_track_extract_from_cert(current_cert,
2155 depth,
2157 *self_ssl->authcert->x509_track);
2158
2159 return preverify_ok || self->deferred_cert_verify_failsafe(*self_ssl);
2160 }
2161
2162 // Print debugging information on SSL/TLS session negotiation.
2163 static void info_callback(const ::SSL *s, int where, int ret)
2164 {
2165 if (where & SSL_CB_LOOP)
2166 {
2167 OVPN_LOG_INFO("SSL state ("
2168 << ((where & SSL_ST_CONNECT)
2169 ? "connect"
2170 : (where & SSL_ST_ACCEPT
2171 ? "accept"
2172 : "undefined"))
2173 << "): " << SSL_state_string_long(s));
2174 }
2175 if (where & SSL_CB_ALERT)
2176 {
2177 OVPN_LOG_INFO("SSL alert ("
2178 << (where & SSL_CB_READ ? "read" : "write") << "): "
2179 << SSL_alert_type_string_long(ret) << ": "
2180 << SSL_alert_desc_string_long(ret));
2181 }
2182 }
2183
2184 static int tls_ticket_key_callback(::SSL *ssl,
2185 unsigned char key_name[16],
2186 unsigned char iv[EVP_MAX_IV_LENGTH],
2187 ::EVP_CIPHER_CTX *ctx,
2188 ssl_mac_ctx *hctx,
2189 int enc)
2190 {
2191 // get OpenSSLContext
2192 const OpenSSLContext *self = (OpenSSLContext *)SSL_get_ex_data(ssl, SSL::context_data_index);
2193 if (!self)
2194 return -1;
2195
2196 // get user-defined session ticket handler
2198 if (!t)
2199 return -1;
2200
2201 if (enc)
2202 {
2203 // create new ticket
2206
2207 switch (t->create_session_ticket_key(name, key))
2208 {
2210 case TLSSessionTicketBase::TICKET_EXPIRING: // doesn't really make sense for enc==1?
2211 return 0;
2213 if (!RAND_bytes(iv, EVP_MAX_IV_LENGTH))
2214 return -1;
2215 if (!tls_ticket_init_cipher_hmac(key, iv, ctx, hctx, enc))
2216 return -1;
2217 static_assert(TLSSessionTicketBase::Name::SIZE == 16, "unexpected name size");
2218 std::memcpy(key_name, name.value_, TLSSessionTicketBase::Name::SIZE);
2219 // OPENVPN_LOG("tls_ticket_key_callback: created ticket");
2220 return 1;
2221 default:
2222 // OPENVPN_LOG("tls_ticket_key_callback: create: bad ticket");
2223 return -1;
2224 }
2225 }
2226 else
2227 {
2228 // lookup existing ticket
2229 static_assert(TLSSessionTicketBase::Name::SIZE == 16, "unexpected name size");
2230 const TLSSessionTicketBase::Name name(key_name);
2232
2233 switch (t->lookup_session_ticket_key(name, key))
2234 {
2236 if (!tls_ticket_init_cipher_hmac(key, iv, ctx, hctx, enc))
2237 return -1;
2238 // OPENVPN_LOG("tls_ticket_key_callback: found ticket");
2239 return 1;
2241 if (!tls_ticket_init_cipher_hmac(key, iv, ctx, hctx, enc))
2242 return -1;
2243 // OPENVPN_LOG("tls_ticket_key_callback: expiring ticket");
2244 return 2;
2246 // OPENVPN_LOG("tls_ticket_key_callback: lookup: no ticket");
2247 return 0;
2248 default:
2249 // OPENVPN_LOG("tls_ticket_key_callback: lookup: bad ticket");
2250 return -1;
2251 }
2252 }
2253 }
2254
2256 unsigned char iv[EVP_MAX_IV_LENGTH],
2257 ::EVP_CIPHER_CTX *ctx,
2258 ssl_mac_ctx *mctx,
2259 const int enc)
2260 {
2261 static_assert(TLSSessionTicketBase::Key::CIPHER_KEY_SIZE == 32, "unexpected cipher key size");
2262 if (!EVP_CipherInit_ex(ctx, EVP_aes_256_cbc(), nullptr, key.cipher_value_, iv, enc))
2263 return false;
2264#if OPENSSL_VERSION_NUMBER >= 0x30000000L
2265 OSSL_PARAM params[]{
2266
2267 /* The OSSL_PARAM_construct_utf8_string needs a non const str */
2268 OSSL_PARAM_construct_utf8_string("digest", (char *)"sha256", 0),
2269 OSSL_PARAM_construct_end()};
2270
2271 if (!EVP_MAC_init(mctx, key.hmac_value_, TLSSessionTicketBase::Key::HMAC_KEY_SIZE, params))
2272 return false;
2273#else
2274 if (!HMAC_Init_ex(mctx, key.hmac_value_, TLSSessionTicketBase::Key::HMAC_KEY_SIZE, EVP_sha256(), nullptr))
2275 return false;
2276#endif
2277 return true;
2278 }
2279
2282 {
2283 if (!RAND_bytes(name.value_, TLSSessionTicketBase::Name::SIZE))
2284 return false;
2286 return false;
2288 return false;
2289 return true;
2290 }
2291
2292 static int client_hello_callback(::SSL *s, int *al, void *)
2293 {
2294 std::string sni_name;
2295
2296 // get OpenSSLContext
2297 OpenSSLContext *self = (OpenSSLContext *)SSL_get_ex_data(s, SSL::context_data_index);
2298
2299 // get OpenSSLContext::SSL
2300 SSL *self_ssl = (SSL *)SSL_get_ex_data(s, SSL::ssl_data_index);
2301
2302 try
2303 {
2304 // get the SNI from the client hello
2305 sni_name = client_hello_get_sni(s);
2306
2307 // process the SNI name, if provided
2308 if (!sni_name.empty())
2309 {
2310 // save the SNI name in authcert
2311 if (self_ssl->authcert)
2312 self_ssl->authcert->sni = sni_name;
2313
2314 // ignore the SNI if no handler was provided
2315 if (self->config->sni_handler)
2316 {
2317 // get an alternative SSLFactoryAPI from the sni_handler
2318 SSLFactoryAPI::Ptr fapi;
2319 try
2320 {
2322 fapi = self->config->sni_handler->sni_hello(sni_name, sm, self->config);
2323 if (self_ssl->authcert)
2324 self_ssl->authcert->sni_metadata = std::move(sm);
2325 }
2326 catch (const std::exception &e)
2327 {
2328 OPENVPN_LOG("SNI HANDLER ERROR: " << e.what());
2329 return sni_error(e.what(), SSL_AD_INTERNAL_ERROR, self, self_ssl, al);
2330 }
2331 if (!fapi)
2332 return sni_error("SNI name not found", SSL_AD_UNRECOGNIZED_NAME, self, self_ssl, al);
2333
2334 // make sure that returned SSLFactoryAPI is an OpenSSLContext
2335 self_ssl->sni_ctx = fapi.dynamic_pointer_cast<OpenSSLContext>();
2336 if (!self_ssl->sni_ctx)
2337 throw Exception("sni_handler returned wrong kind of SSLFactoryAPI");
2338
2339 // don't modify SSL CTX if the returned SSLFactoryAPI is ourself
2340 if (fapi.get() != self)
2341 {
2342 SSL_set_SSL_CTX(s, self_ssl->sni_ctx->ctx.get());
2343 self_ssl->set_parent(self_ssl->sni_ctx.get());
2344 }
2345 }
2346 }
2347 return SSL_CLIENT_HELLO_SUCCESS;
2348 }
2349 catch (const std::exception &e)
2350 {
2351 OPENVPN_LOG("SNI exception in OpenSSLContext, SNI=" << sni_name << " : " << e.what());
2352 *al = SSL_AD_INTERNAL_ERROR;
2353 return SSL_CLIENT_HELLO_ERROR;
2354 }
2355 }
2356
2357 static int sni_error(std::string err,
2358 const int ssl_ad_error,
2359 OpenSSLContext *self,
2360 SSL *self_ssl,
2361 int *al)
2362 {
2363 if (self_ssl->authcert)
2364 self_ssl->authcert->add_fail(0, AuthCert::Fail::SNI_ERROR, std::move(err));
2365 if (self->deferred_cert_verify_failsafe(*self_ssl))
2366 return SSL_CLIENT_HELLO_SUCCESS;
2367 *al = ssl_ad_error;
2368 return SSL_CLIENT_HELLO_ERROR;
2369 }
2370
2371 static size_t sni_get_len(ConstBuffer &buf)
2372 {
2373 size_t ret = buf.pop_front() << 8;
2374 ret += buf.pop_front();
2375 return ret;
2376 }
2377
2378 static std::string client_hello_get_sni(::SSL *s)
2379 {
2380 const unsigned char *p;
2381 size_t remaining;
2382 if (!SSL_client_hello_get0_ext(s, TLSEXT_TYPE_server_name, &p, &remaining))
2383 return std::string();
2384
2385 // For safety, map a ConstBuffer onto returned OpenSSL TLSEXT_TYPE_server_name data.
2386 ConstBuffer buf(p, remaining, true);
2387
2388 // Extract the length of the supplied list of names,
2389 // and check that it matches size of remaining data
2390 // in buf.
2391 {
2392 const size_t len = sni_get_len(buf);
2393 if (len != buf.size())
2394 throw Exception("bad name list size");
2395 }
2396
2397 // Next byte must be TLSEXT_NAMETYPE_host_name.
2398 if (buf.pop_front() != TLSEXT_NAMETYPE_host_name)
2399 throw Exception("expecting TLSEXT_NAMETYPE_host_name");
2400
2401 // Now try to extract the SNI name.
2402 {
2403 const size_t len = sni_get_len(buf);
2404 if (len > buf.size())
2405 throw Exception("bad name size");
2407 throw Exception("invalid UTF-8");
2408 return std::string((const char *)buf.c_data(), len);
2409 }
2410 }
2411
2412 // Return true if we should continue with authentication
2413 // even though there was an error, because the user has
2414 // enabled SSLConst::DEFERRED_CERT_VERIFY and wants the
2415 // error to be logged in authcert so that it can be handled
2416 // by a higher layer.
2418 {
2420 && ssl.authcert // failsafe: don't defer error unless
2421 && ssl.authcert->is_fail(); // authcert has recorded it
2422 }
2423
2424 /* The order of epki and config is important here. epki holds a library
2425 * context that is need for the certificate (cert) object from config
2426 * with external key as that internally refrences the library context
2427 * and must not be destructed before the objects referencing it have
2428 * been destructed */
2429 std::shared_ptr<ExternalPKIImpl> epki = nullptr;
2431
2432 SSL_CTX_unique_ptr ctx{nullptr, &SSL_CTX_free};
2434};
2435
2436inline const std::string get_ssl_library_version()
2437{
2438 return OpenSSL_version(OPENSSL_VERSION);
2439}
2440} // namespace openvpn
2441#endif
const std::uint8_t * number() const
Definition authcert.hpp:234
static constexpr size_t size()
Definition authcert.hpp:244
bool defined() const
Definition authcert.hpp:365
SNI::Metadata::UPtr sni_metadata
Definition authcert.hpp:523
std::string sni
Definition authcert.hpp:516
std::string cn
Definition authcert.hpp:517
std::uint8_t issuer_fp[20]
Definition authcert.hpp:519
std::unique_ptr< X509Track::Set > x509_track
Definition authcert.hpp:522
void add_fail(const size_t depth, const Fail::Type new_code, std::string reason)
Definition authcert.hpp:477
std::string render_pem() const
Definition cclist.hpp:52
void parse_pem(const std::string &content, const std::string &title)
Definition cclist.hpp:42
static void from_string(const std::string &content, const std::string &title, OpenSSLPKI::X509List *cert_list, OpenSSLPKI::CRLList *crl_list=nullptr)
Definition cclist.hpp:131
virtual bool reject(const std::string &cn)=0
const T * c_data() const
Returns a const pointer to the start of the buffer.
Definition buffer.hpp:1193
size_t size() const
Returns the size of the buffer in T objects.
Definition buffer.hpp:1241
T pop_front()
Removes and returns the first element from the buffer.
Definition buffer.hpp:1255
static void init_static()
Definition extpki.hpp:301
bool empty() const
Definition memq.hpp:37
size_t size() const
Definition memq.hpp:32
BufferPtr read_buf()
Definition memq.hpp:60
void write_buf(const BufferPtr &bp)
Definition memq.hpp:54
void set_frame(const Frame::Ptr &frame)
void write(const unsigned char *data, size_t size)
bool is_server() const
Definition mode.hpp:36
bool is_client() const
Definition mode.hpp:40
std::string validate_cert_list(const std::string &certs_txt) const override
Definition sslctx.hpp:454
std::vector< unsigned int > ku
Definition sslctx.hpp:768
ExternalPKIBase * external_pki
Definition sslctx.hpp:759
std::string extract_ca() const override
Definition sslctx.hpp:313
void load(const OptionList &opt, const unsigned int lflags) override
Definition sslctx.hpp:478
void enable_legacy_algorithms(const bool v) override
Definition sslctx.hpp:244
OpenSSLPKI::X509List extra_certs
Definition sslctx.hpp:756
virtual void set_tls_cipher_list(const std::string &override)
Definition sslctx.hpp:415
void initialise_lib_context() const
For OpenSSL 3.x, set up a library context if one is not already set up.
Definition sslctx.hpp:692
void set_tls_remote(const std::string &tls_remote_arg) override
Definition sslctx.hpp:385
VerifyX509Name verify_x509_name
Definition sslctx.hpp:771
void set_tls_version_min_override(const std::string &override) override
Definition sslctx.hpp:400
std::string extract_crl() const override
Definition sslctx.hpp:318
void load_private_key(const std::string &key_txt) override
Definition sslctx.hpp:303
TLSSessionTicketBase * session_ticket_handler
Definition sslctx.hpp:761
void set_tls_version_min(const TLSVersion::Type tvm) override
Definition sslctx.hpp:390
const Mode & get_mode() const override
Definition sslctx.hpp:220
virtual void set_tls_groups(const std::string &groups)
Definition sslctx.hpp:427
void set_rng(const StrongRandomAPI::Ptr &rng_arg) override
Definition sslctx.hpp:443
X509Track::ConfigSet x509_track_config
Definition sslctx.hpp:779
TLSCertProfile::Type tls_cert_profile
Definition sslctx.hpp:775
void set_remote_cert_tls(const KUParse::TLSWebType wt) override
Definition sslctx.hpp:380
void set_tls_cert_profile_override(const std::string &override) override
Definition sslctx.hpp:410
void set_x509_track(X509Track::ConfigSet x509_track_config_arg) override
Definition sslctx.hpp:438
void load_cert(const std::string &cert_txt, const std::string &extra_certs_txt) override
Definition sslctx.hpp:296
static constexpr unsigned short LIB_CTX_NO_PROVIDERS
Definition sslctx.hpp:132
void set_frame(const Frame::Ptr &frame_arg) override
Definition sslctx.hpp:360
unsigned short lib_ctx_provider_config
Definition sslctx.hpp:751
SNI::HandlerBase * sni_handler
Definition sslctx.hpp:762
size_t private_key_length() const override
Definition sslctx.hpp:355
std::string extract_private_key() const override
Definition sslctx.hpp:338
void load_ca(const std::string &ca_txt, bool strict) override
Definition sslctx.hpp:281
PKType::Type private_key_type() const override
Definition sslctx.hpp:348
void set_tls_version_max(const TLSVersion::Type tvm) override
Definition sslctx.hpp:395
TLSVersion::Type tls_version_max
Definition sslctx.hpp:774
void set_flags(const unsigned int flags_arg) override
Definition sslctx.hpp:370
void set_session_ticket_handler(TLSSessionTicketBase *session_ticket_handler_arg) override
Definition sslctx.hpp:233
TLSVersion::Type tls_version_min
Definition sslctx.hpp:773
void set_sni_handler(SNI::HandlerBase *sni_handler_arg) override
Definition sslctx.hpp:253
static TLSVersion::Type maxver()
Definition sslctx.hpp:719
std::string extract_dh() const override
Definition sslctx.hpp:343
void set_cn_reject_handler(CommonNameReject *cn_reject_handler_arg) override
Definition sslctx.hpp:271
void load_cert(const std::string &cert_txt) override
Definition sslctx.hpp:291
std::string extract_cert() const override
Definition sslctx.hpp:323
std::string validate_private_key(const std::string &key_txt) const override
Definition sslctx.hpp:460
std::string validate_cert(const std::string &cert_txt) const override
Definition sslctx.hpp:448
SSLFactoryAPI::Ptr new_factory() override
Return a pointer-like object that refers to a ssl factory.
Definition sslctx.hpp:210
void set_local_cert_enabled(const bool v) override
Definition sslctx.hpp:433
void set_client_session_tickets(const bool v) override
Definition sslctx.hpp:239
void set_sni_name(const std::string &sni_name_arg) override
Definition sslctx.hpp:259
SSLLib::Ctx ctx() const
Definition sslctx.hpp:681
std::string validate_dh(const std::string &dh_txt) const override
Definition sslctx.hpp:466
CommonNameReject * cn_reject_handler
Definition sslctx.hpp:763
void set_tls_cert_profile(const TLSCertProfile::Type type) override
Definition sslctx.hpp:405
void set_mode(const Mode &mode_arg) override
Definition sslctx.hpp:215
void load_dh(const std::string &dh_txt) override
Definition sslctx.hpp:308
PeerFingerprints peer_fingerprints
Definition sslctx.hpp:772
std::vector< std::string > extract_extra_certs() const override
Definition sslctx.hpp:328
void set_debug_level(const int debug_level) override
Definition sslctx.hpp:365
virtual void set_tls_ciphersuite_list(const std::string &override)
Definition sslctx.hpp:421
void load_crl(const std::string &crl_txt) override
Definition sslctx.hpp:286
void set_external_pki_callback(ExternalPKIBase *external_pki_arg, const std::string &alias) override
Definition sslctx.hpp:226
void set_ns_cert_type(const NSCert::Type ns_cert_type_arg) override
Definition sslctx.hpp:375
void set_private_key_password(const std::string &pwd) override
Definition sslctx.hpp:276
static constexpr unsigned short LIB_CTX_LEGACY_PROVIDER
Definition sslctx.hpp:133
std::string validate_crl(const std::string &crl_txt) const override
Definition sslctx.hpp:472
const AuthCert::Ptr & auth_cert() const override
Definition sslctx.hpp:889
ssize_t write_cleartext_unbuffered(const void *data, const size_t size) override
Definition sslctx.hpp:798
bool export_keying_material(const std::string &label, unsigned char *dest, size_t size) override
Definition sslctx.hpp:871
void start_handshake() override
Definition sslctx.hpp:793
OpenSSLContext::Ptr sni_ctx
Definition sslctx.hpp:1186
BufferPtr read_ciphertext() override
Definition sslctx.hpp:861
bool read_cleartext_ready() const override
Definition sslctx.hpp:833
static int ssl_pending_override(const ::SSL *)
Definition sslctx.hpp:1040
void write_ciphertext(const BufferPtr &buf) override
Definition sslctx.hpp:838
static std::string ssl_handshake_details(::SSL *ssl)
Definition sslctx.hpp:1059
bool did_full_handshake() override
Returns the cached/reused status of the session.
Definition sslctx.hpp:881
std::string ssl_handshake_details() const override
Definition sslctx.hpp:866
void set_parent(const OpenSSLContext *ctx)
Definition sslctx.hpp:1009
bool read_ciphertext_ready() const override
Definition sslctx.hpp:856
OpenSSLSessionCache::Key::UPtr sess_cache_key
Definition sslctx.hpp:1185
ssize_t read_cleartext(void *data, const size_t capacity) override
Definition sslctx.hpp:813
void write_ciphertext_unbuffered(const unsigned char *data, const size_t size) override
Definition sslctx.hpp:847
static void uninit_static()
Definition sslctx.hpp:920
void mark_no_cache() override
Definition sslctx.hpp:898
static BIO * mem_bio(const Frame::Ptr &frame)
Definition sslctx.hpp:1171
SSL(const OpenSSLContext &ctx, const std::string *hostname, const std::string *cache_key)
Definition sslctx.hpp:926
static void print_ec_key_details(EVP_PKEY *pkey, std::ostream &os)
Definition sslctx.hpp:1045
static void info_callback(const ::SSL *s, int where, int ret)
Definition sslctx.hpp:2163
static bool tls_ticket_init_cipher_hmac(const TLSSessionTicketBase::Key &key, unsigned char iv[EVP_MAX_IV_LENGTH], ::EVP_CIPHER_CTX *ctx, ssl_mac_ctx *mctx, const int enc)
Definition sslctx.hpp:2255
static constexpr bool support_key_material_export()
Definition sslctx.hpp:1577
static void load_serial_number_into_authcert(AuthCert &authcert, ::X509 *cert)
Definition sslctx.hpp:1822
static int verify_callback_client(int preverify_ok, X509_STORE_CTX *ctx)
Definition sslctx.hpp:1901
bool ns_cert_type_defined() const
Definition sslctx.hpp:1606
std::shared_ptr< ExternalPKIImpl > epki
Definition sslctx.hpp:2429
void setup_server_ticket_callback() const
Definition sslctx.hpp:1235
static std::string client_hello_get_sni(::SSL *s)
Definition sslctx.hpp:2378
static int check_cert_warnings(const X509 *cert)
Definition sslctx.hpp:1882
static std::string cert_status_line(int preverify_ok, int depth, int err, const std::string &signature, const std::string &subject)
Definition sslctx.hpp:1839
bool x509_cert_ku_defined() const
Definition sslctx.hpp:1665
SSLAPI::Ptr ssl() override
Definition sslctx.hpp:1542
static int client_hello_callback(::SSL *s, int *al, void *)
Definition sslctx.hpp:2292
static void x509_track_extract_nid(const X509Track::Type xt_type, const int nid, ::X509 *cert, const int depth, X509Track::Set &xts)
Definition sslctx.hpp:1748
const Mode & mode() const override
Definition sslctx.hpp:1572
void set_openssl_tls_groups(const std::string &tls_groups)
Definition sslctx.hpp:1621
static int sni_error(std::string err, const int ssl_ad_error, OpenSSLContext *self, SSL *self_ssl, int *al)
Definition sslctx.hpp:2357
OpenSSLSessionCache::Ptr sess_cache
Definition sslctx.hpp:2433
static size_t sni_get_len(ConstBuffer &buf)
Definition sslctx.hpp:2371
static std::string translate_cipher_list(const std::string &cipherlist)
Definition sslctx.hpp:1197
static int tls_ticket_key_callback(::SSL *ssl, unsigned char key_name[16], unsigned char iv[EVP_MAX_IV_LENGTH], ::EVP_CIPHER_CTX *ctx, ssl_mac_ctx *hctx, int enc)
Definition sslctx.hpp:2184
static void x509_track_extract_from_cert(::X509 *cert, const int depth, const X509Track::ConfigSet &cs, X509Track::Set &xts)
Definition sslctx.hpp:1759
static AuthCert::Fail::Type cert_fail_code(const int openssl_err)
Definition sslctx.hpp:1869
bool verify_x509_cert_eku(::X509 *cert) const
Definition sslctx.hpp:1715
void update_trust(const CertCRLList &cc)
Definition sslctx.hpp:1564
bool verify_x509_cert_ku(::X509 *cert) const
Definition sslctx.hpp:1670
SSLAPI::Ptr ssl(const std::string *hostname, const std::string *cache_key) override
Definition sslctx.hpp:1548
bool x509_cert_eku_defined() const
Definition sslctx.hpp:1710
OpenSSLContext(Config *config_arg)
Definition sslctx.hpp:1251
bool verify_ns_cert_type(::X509 *cert) const
Definition sslctx.hpp:1611
std::unique_ptr<::SSL_CTX, decltype(&::SSL_CTX_free)> SSL_CTX_unique_ptr
Definition sslctx.hpp:106
SSLLib::Ctx libctx() override
Definition sslctx.hpp:1553
static int verify_callback_server(int preverify_ok, X509_STORE_CTX *ctx)
Definition sslctx.hpp:2011
bool deferred_cert_verify_failsafe(const SSL &ssl) const
Definition sslctx.hpp:2417
static bool randomize_name_key(TLSSessionTicketBase::Name &name, TLSSessionTicketBase::Key &key)
Definition sslctx.hpp:2280
SSL_CTX_unique_ptr ctx
Definition sslctx.hpp:2432
std::string render_pem() const
Definition crl.hpp:154
std::string render_pem() const
Definition crl.hpp:98
void parse_pem(const std::string &dh_txt)
Definition dh-compat.hpp:94
std::string render_pem() const
size_t key_length() const
Definition pkey.hpp:114
void set_private_key_password(const std::string &pwd)
Definition pkey.hpp:124
::EVP_PKEY * obj() const
Definition pkey.hpp:87
void parse_pem(const std::string &pkey_txt, const std::string &title, SSLLib::Ctx libctx)
Definition pkey.hpp:129
PKType::Type key_type() const
Definition pkey.hpp:92
bool defined() const
Definition pkey.hpp:83
std::string render_pem() const
Definition pkey.hpp:144
std::string render_pem() const
Definition x509.hpp:163
::X509 * obj() const
Definition x509.hpp:82
void parse_pem(const std::string &cert_txt, const std::string &title)
Definition x509.hpp:92
bool defined() const
Definition x509.hpp:77
std::string render_pem() const
Definition x509.hpp:106
std::unique_ptr< Key > UPtr
std::string get_optional(const std::string &name, size_t index, const size_t max_len) const
Definition options.hpp:1330
std::string cat(const std::string &name) const
Definition options.hpp:1274
const Option & get(const std::string &name) const
Definition options.hpp:1245
bool exists(const std::string &name) const
Definition options.hpp:1313
void reset() noexcept
Points this RCPtr<T> to nullptr safely.
Definition rc.hpp:290
RCPtr< U > dynamic_pointer_cast() const noexcept
Returns a "RCPtr<U>" that points to our T object.
Definition rc.hpp:422
T * get() const noexcept
Returns the raw pointer to the object T, or nullptr.
Definition rc.hpp:321
virtual SSLFactoryAPI::Ptr sni_hello(const std::string &sni_name, SNI::Metadata::UPtr &sni_metadata, SSLConfigAPI::Ptr default_factory) const =0
std::unique_ptr< Metadata > UPtr
uint32_t tls_warnings
Definition sslapi.hpp:79
RCPtr< SSLFactoryAPI > Ptr
Definition sslapi.hpp:91
unsigned char hmac_value_[HMAC_KEY_SIZE]
unsigned char cipher_value_[CIPHER_KEY_SIZE]
static constexpr size_t CIPHER_KEY_SIZE
static constexpr size_t HMAC_KEY_SIZE
virtual std::string session_id_context() const =0
virtual Status create_session_ticket_key(Name &name, Key &key) const =0
virtual Status lookup_session_ticket_key(const Name &name, Key &key) const =0
void init(const OptionList &opt, const std::string &relay_prefix)
bool verify(const std::string &value) const
static std::shared_ptr< XKeyExternalPKIImpl > create(SSL_CTX *ssl_ctx, ::X509 *cert, ExternalPKIBase *external_pki, std::string alias)
Definition xkey.hpp:126
int log_level() const
return the current logging level for all logging
Definition logger.hpp:61
static SSL_CTX * SSL_CTX_new_ex(void *libctx, const char *propq, const SSL_METHOD *meth)
Definition compat.hpp:92
#define EVP_PKEY_get_bits
Definition compat.hpp:101
static void OSSL_LIB_CTX_free(void *libctx)
Definition compat.hpp:98
static int EVP_PKEY_get_group_name(EVP_PKEY *pkey, char *gname, size_t gname_sz, size_t *gname_len)
Definition compat.hpp:28
#define OPENVPN_THROW(exc, stuff)
#define OPENVPN_LOG(args)
#define OVPN_LOG_TRACE(args)
Definition logger.hpp:227
#define OVPN_LOG_INFO(args)
Definition logger.hpp:224
void remote_cert_ku(const OptionList &opt, const std::string &relay_prefix, std::vector< unsigned int > &ku)
Definition kuparse.hpp:89
void remote_cert_tls(const TLSWebType wt, std::vector< unsigned int > &ku, std::string &eku)
Definition kuparse.hpp:33
void remote_cert_eku(const OptionList &opt, const std::string &relay_prefix, std::string &eku)
Definition kuparse.hpp:115
Type ns_cert_type(const std::string &ct)
Definition nscert.hpp:31
static std::size_t x509_fingerprint_size()
static std::string x509_get_serial_hex(::X509 *cert)
static std::string x509_get_field(::X509 *cert, const int nid)
static std::string X509_get_pem_encoding(::X509 *cert)
static std::string x509_get_serial(::X509 *cert)
static std::vector< uint8_t > x509_get_fingerprint(const ::X509 *cert)
static std::string x509_get_subject(::X509 *cert, bool new_format=false)
static std::string x509_get_signature_algorithm(const ::X509 *cert)
void apply_override(Type &type, const std::string &override)
Type default_if_undef(const Type type)
Type parse_tls_cert_profile(const std::string &profile_name)
std::string sanitize_x509_name(const std::string &str)
bool test(const std::string &tls_remote, const std::string &subject, const std::string &common_name)
std::string sanitize_common_name(const std::string &str)
void log(const std::string &tls_remote, const std::string &subject, const std::string &common_name)
int toTLSVersion(const Type version)
Definition tlsver.hpp:20
void apply_override(Type &tvm, const std::string &override)
Definition tlsver.hpp:88
Type parse_tls_version_min(const std::string &ver, const bool or_highest, const Type max_version)
Definition tlsver.hpp:57
bool is_valid_utf8_uchar_buf(const unsigned char *source, size_t size, const size_t max_len_flags=0)
Definition unicode.hpp:41
BIO_METHOD * BIO_s_memq(void)
MemQ * memq_from_bio(BIO *b)
std::string get_string_optional(const Json::Value &root, const NAME &name, const std::string &default_value, const TITLE &title)
constexpr int LOG_LEVEL_INFO
Definition logger.hpp:20
void trim(std::string &str)
Definition string.hpp:557
void openssl_clear_error_stack()
Definition error.hpp:239
std::string to_string(const T &t)
Convert a value to a string.
Definition to_string.hpp:45
const tls_cipher_name_pair * tls_get_cipher_name_pair(const std::string &ciphername)
std::string render_hex_sep(const unsigned char *data, size_t size, const char sep, const bool caps=false)
Definition hexstr.hpp:178
const std::string get_ssl_library_version()
Definition sslctx.hpp:1701
::HMAC_CTX ssl_mac_ctx
Definition sslctx.hpp:95
bool match(const PeerFingerprint &fp) const
const std::string cert_txt
static const char config[]