Squid Web Cache master
Loading...
Searching...
No Matches
support.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2025 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9/* DEBUG: section 83 SSL accelerator support */
10
11#ifndef SQUID_SRC_SSL_SUPPORT_H
12#define SQUID_SRC_SSL_SUPPORT_H
13
14#if USE_OPENSSL
15
16#include "anyp/forward.h"
17#include "base/CbDataList.h"
18#include "base/TypeTraits.h"
19#include "comm/forward.h"
20#include "compat/openssl.h"
21#include "dns/forward.h"
22#include "ip/Address.h"
23#include "sbuf/SBuf.h"
24#include "security/Session.h"
25#include "ssl/gadgets.h"
26
27#if HAVE_OPENSSL_X509V3_H
28#include <openssl/x509v3.h>
29#endif
30#if HAVE_OPENSSL_ERR_H
31#include <openssl/err.h>
32#endif
33#if HAVE_OPENSSL_ENGINE_H
34#include <openssl/engine.h>
35#endif
36#include <queue>
37#include <map>
38#include <optional>
39#include <variant>
40
46// Maximum certificate validation callbacks. OpenSSL versions exceeding this
47// limit are deemed stuck in an infinite validation loop (OpenSSL bug #3090)
48// and will trigger the SQUID_X509_V_ERR_INFINITE_VALIDATION error.
49// Can be set to a number up to UINT32_MAX
50#ifndef SQUID_CERT_VALIDATION_ITERATION_MAX
51#define SQUID_CERT_VALIDATION_ITERATION_MAX 16384
52#endif
53
54namespace AnyP
55{
56class PortCfg;
57};
58
59namespace Ipc
60{
61class MemMap;
62}
63
64namespace Ssl
65{
66
69int AskPasswordCb(char *buf, int size, int rwflag, void *userdata);
70
73void Initialize();
74
75class CertValidationResponse;
77
80
83
87
90
91} //namespace Ssl
92
94const char *sslGetUserEmail(SSL *ssl);
95
97const char *sslGetUserAttribute(SSL *ssl, const char *attribute_name);
98
100const char *sslGetCAAttribute(SSL *ssl, const char *attribute_name);
101
104
107
108namespace Ssl
109{
111typedef char const *GETX509ATTRIBUTE(X509 *, const char *);
112typedef SBuf GETX509PEM(X509 *);
113
116
119
122
125
126extern const EVP_MD *DefaultSignHash;
127
133
138extern std::vector<const char *>BumpModeStr;
139
144inline const char *bumpMode(int bm)
145{
146 return (0 <= bm && bm < Ssl::bumpEnd) ? Ssl::BumpModeStr.at(bm) : nullptr;
147}
148
150typedef std::multimap<SBuf, X509 *> CertsIndexedList;
151
166
170bool loadCerts(const char *certsFile, Ssl::CertsIndexedList &list);
171
176bool loadSquidUntrusted(const char *path);
177
183
190void SSL_add_untrusted_cert(SSL *ssl, X509 *cert);
191
193const char *findIssuerUri(X509 *cert);
194
198Security::CertPointer findIssuerCertificate(X509 *cert, const STACK_OF(X509) *serverCertificates, const Security::ContextPointer &context);
199
205bool missingChainCertificatesUrls(std::queue<SBuf> &URIs, const STACK_OF(X509) &serverCertificates, const Security::ContextPointer &context);
206
211bool generateUntrustedCert(Security::CertPointer & untrustedCert, Security::PrivateKeyPointer & untrustedPkey, Security::CertPointer const & cert, Security::PrivateKeyPointer const & pkey);
212
214typedef std::multimap<SBuf, X509 *> CertsIndexedList;
215
220bool loadCerts(const char *certsFile, Ssl::CertsIndexedList &list);
221
227bool loadSquidUntrusted(const char *path);
228
235
241
250
257
263
269
275
281bool configureSSL(SSL *ssl, CertificateProperties const &properties, AnyP::PortCfg &port);
282
288bool configureSSLUsingPkeyAndCertFromMemory(SSL *ssl, const char *data, AnyP::PortCfg &port);
289
295void useSquidUntrusted(SSL_CTX *sslContext);
296
299{
300public:
302 bool match(const Ssl::GeneralName &) const;
303
304protected:
305 // The methods below implement public match() API for each of the
306 // GeneralName variants. For each public match() method call, exactly one of
307 // these methods is called.
308
309 virtual bool matchDomainName(const Dns::DomainName &) const = 0;
310 virtual bool matchIp(const Ip::Address &) const = 0;
311};
312
315bool HasMatchingSubjectName(X509 &, const GeneralNameMatcher &);
316
318bool HasSubjectName(X509 &, const AnyP::Host &);
319
328int asn1timeToString(ASN1_TIME *tm, char *buf, int len);
329
335void setClientSNI(SSL *ssl, const char *fqdn);
336
341void InRamCertificateDbKey(const Ssl::CertificateProperties &certProperties, SBuf &key);
342
348BIO *BIO_new_SBuf(SBuf *buf);
349
357
358// TODO: Move other ssl_ex_index_* validation-related information here.
364public:
368
371
374
375 /* input parameters */
376
381
382 /* output parameters */
383
388 bool hidMissingIssuer = false;
389};
390
391} //namespace Ssl
392
393#if _SQUID_WINDOWS_
394
395#if defined(__cplusplus)
396
398namespace Squid
399{
403inline
404int SSL_set_fd(SSL *ssl, int fd)
405{
406 return ::SSL_set_fd(ssl, _get_osfhandle(fd));
407}
408
410#define SSL_set_fd(ssl,fd) Squid::SSL_set_fd(ssl,fd)
411
412} /* namespace Squid */
413
414#else
415
417#define SSL_set_fd(s,f) (SSL_set_fd(s, _get_osfhandle(f)))
418
419#endif /* __cplusplus */
420
421#endif /* _SQUID_WINDOWS_ */
422
423#endif /* USE_OPENSSL */
424#endif /* SQUID_SRC_SSL_SUPPORT_H */
425
int size
Definition ModDevPoll.cc:70
either a domain name (as defined in DNS RFC 1034) or an IP address
Definition Host.h:25
Definition SBuf.h:94
char at(size_type pos) const
Definition SBuf.h:253
TLS squid.conf settings for a remote server peer.
Definition PeerOptions.h:26
TLS squid.conf settings for a listening port.
an algorithm for checking/testing/comparing X.509 certificate names
Definition support.h:299
bool match(const Ssl::GeneralName &) const
whether the given name satisfies algorithm conditions
Definition support.cc:84
virtual bool matchIp(const Ip::Address &) const =0
virtual bool matchDomainName(const Dns::DomainName &) const =0
static VerifyCallbackParameters & At(Security::Connection &)
Definition support.cc:647
static VerifyCallbackParameters * New(Security::Connection &)
Definition support.cc:635
static VerifyCallbackParameters * Find(Security::Connection &)
Definition support.cc:629
convenience base for any class with pure virtual method(s)
Definition TypeTraits.h:19
static int port
void useSquidUntrusted(SSL_CTX *sslContext)
Definition support.cc:1441
Security::ContextPointer GenerateSslContext(CertificateProperties const &, Security::ServerOptions &, bool trusted)
Definition support.cc:1052
GETX509PEM GetX509PEM
Definition support.h:121
std::vector< const char * > BumpModeStr
Definition support.cc:46
const char * bumpMode(int bm)
Definition support.h:144
SBuf sslGetUserCertificatePEM(SSL *ssl)
Definition support.cc:987
bool configureSSL(SSL *ssl, CertificateProperties const &properties, AnyP::PortCfg &port)
Definition support.cc:1098
bool generateUntrustedCert(Security::CertPointer &untrustedCert, Security::PrivateKeyPointer &untrustedPkey, Security::CertPointer const &cert, Security::PrivateKeyPointer const &pkey)
Definition support.cc:1463
void chainCertificatesToSSLContext(Security::ContextPointer &, Security::ServerOptions &)
Definition support.cc:1066
void InRamCertificateDbKey(const Ssl::CertificateProperties &certProperties, SBuf &key)
Definition support.cc:1486
const char * sslGetUserAttribute(SSL *ssl, const char *attribute_name)
Definition support.cc:954
BIO * BIO_new_SBuf(SBuf *buf)
Definition support.cc:1563
Security::ContextPointer createSSLContext(Security::CertPointer &x509, Security::PrivateKeyPointer &pkey, Security::ServerOptions &)
Create SSL context and apply ssl certificate and private key to it.
Definition support.cc:1021
bool verifySslCertificate(const Security::ContextPointer &, CertificateProperties const &)
Definition support.cc:1141
bool configureSSLUsingPkeyAndCertFromMemory(SSL *ssl, const char *data, AnyP::PortCfg &port)
Definition support.cc:1121
bool loadCerts(const char *certsFile, Ssl::CertsIndexedList &list)
Definition support.cc:1216
int asn1timeToString(ASN1_TIME *tm, char *buf, int len)
Definition support.cc:248
const char * sslGetCAAttribute(SSL *ssl, const char *attribute_name)
Definition support.cc:967
Security::ContextPointer GenerateSslContextUsingPkeyAndCertFromMemory(const char *data, Security::ServerOptions &, bool trusted)
Definition support.cc:1038
GETX509ATTRIBUTE GetX509Fingerprint
Definition support.h:124
SBuf sslGetUserCertificateChainPEM(SSL *ssl)
Definition support.cc:998
void configureUnconfiguredSslContext(Security::ContextPointer &, Ssl::CertSignAlgorithm signAlgorithm, AnyP::PortCfg &)
Definition support.cc:1091
void setClientSNI(SSL *ssl, const char *fqdn)
Definition support.cc:1166
bool loadSquidUntrusted(const char *path)
Definition support.cc:1447
const char * sslGetUserEmail(SSL *ssl)
Definition support.cc:981
BumpMode
Definition support.h:132
GETX509ATTRIBUTE GetX509UserAttribute
Definition support.h:115
void unloadSquidUntrusted()
Definition support.cc:1453
char const * GETX509ATTRIBUTE(X509 *, const char *)
Definition support.h:111
GETX509ATTRIBUTE GetX509CAAttribute
Definition support.h:118
@ bumpTerminate
Definition support.h:132
@ bumpEnd
Definition support.h:132
@ bumpPeek
Definition support.h:132
@ bumpClientFirst
Definition support.h:132
@ bumpNone
Definition support.h:132
@ bumpStare
Definition support.h:132
@ bumpSplice
Definition support.h:132
@ bumpBump
Definition support.h:132
@ bumpServerFirst
Definition support.h:132
CertSignAlgorithm
Definition gadgets.h:169
Definition forward.h:15
std::shared_ptr< SSL_CTX > ContextPointer
Definition Context.h:29
SSL Connection
Definition Session.h:49
long ParsedPortFlags
Definition forward.h:204
Definition Xaction.cc:40
bool HasMatchingSubjectName(X509 &, const GeneralNameMatcher &)
Definition support.cc:307
bool HasSubjectName(X509 &, const AnyP::Host &)
whether at least one common or alternate subject name matches the given one
Definition support.cc:338
SBuf GETX509PEM(X509 *)
Definition support.h:112
void DisablePeerVerification(Security::ContextPointer &)
Definition support.cc:528
bool InitClientContext(Security::ContextPointer &, Security::PeerOptions &, Security::ParsedPortFlags)
initialize a TLS client context with OpenSSL specific settings
Definition support.cc:806
RefCount< CertValidationResponse > CertValidationResponsePointer
Definition support.h:76
void SSL_add_untrusted_cert(SSL *ssl, X509 *cert)
bool VerifyConnCertificates(Security::Connection &, const Ssl::X509_STACK_Pointer &extraCerts)
Definition support.cc:537
Security::CertPointer findIssuerCertificate(X509 *cert, const STACK_OF(X509) *serverCertificates, const Security::ContextPointer &context)
Definition support.cc:1303
bool missingChainCertificatesUrls(std::queue< SBuf > &URIs, const STACK_OF(X509) &serverCertificates, const Security::ContextPointer &context)
Definition support.cc:1329
void Initialize()
Definition support.cc:747
const EVP_MD * DefaultSignHash
Definition support.cc:44
int AskPasswordCb(char *buf, int size, int rwflag, void *userdata)
Definition support.cc:131
void MaybeSetupRsaCallback(Security::ContextPointer &)
if required, setup callback for generating ephemeral RSA keys
Definition support.cc:238
const char * findIssuerUri(X509 *cert)
finds certificate issuer URI in the Authority Info Access extension
Definition support.cc:1186
std::unique_ptr< STACK_OF(X509), sk_X509_free_wrapper > X509_STACK_Pointer
Definition gadgets.h:53
std::multimap< SBuf, X509 * > CertsIndexedList
certificates indexed by issuer name
Definition support.h:150
void ConfigurePeerVerification(Security::ContextPointer &, const Security::ParsedPortFlags)
set the certificate verify callback for a context
Definition support.cc:501
bool InitServerContext(Security::ContextPointer &, AnyP::PortCfg &)
initialize a TLS server context with OpenSSL specific settings
Definition support.cc:797
STACK_OF(X509) *X509_STORE_CTX_get0_untrusted(X509_STORE_CTX *ctx)
Definition openssl.h:237