37 std::shared_ptr<CA> peer_ca_,
38 const std::optional<ccf::crypto::Pem>& own_cert_ = std::nullopt,
39 const std::optional<ccf::crypto::Pem>& own_pkey_ = std::nullopt,
40 const std::optional<std::string>& peer_hostname_ = std::nullopt,
41 bool auth_required_ =
true) :
43 peer_hostname(peer_hostname_),
44 auth_required(auth_required_)
46 if (own_cert_.has_value() && own_pkey_.has_value())
55 own_pkey = std::make_shared<ccf::crypto::KeyPair_OpenSSL>(*own_pkey_);
60 for (
auto it = certs.begin() + 1; it != certs.end(); ++it)
65 CHECK1(sk_X509_push(chain, cert));
74 void use(SSL* ssl, SSL_CTX* ssl_ctx)
76 if (peer_hostname.has_value())
79 SSL_set_tlsext_host_name(ssl, peer_hostname->c_str());
84 peer_ca->use(ssl_ctx);
89 int opts = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
90 auto cb = [](
int ok, x509_store_ctx_st*) {
94 SSL_CTX_set_verify(ssl_ctx, opts, cb);
95 SSL_set_verify(ssl, opts, cb);
105 auto cb = [](int, x509_store_ctx_st*) {
return 1; };
106 SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER, cb);
107 SSL_set_verify(ssl, SSL_VERIFY_PEER, cb);
113 SSL_CTX_use_cert_and_key(ssl_ctx, own_cert, *own_pkey, chain, 1));
114 CHECK1(SSL_use_cert_and_key(ssl, own_cert, *own_pkey, chain, 1));