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