24#include <openssl/opensslconf.h>
25#include <openssl/opensslv.h>
33#if OPENSSL_VERSION_NUMBER >= 0x30000000L
34 #define XRDTLS_HAVE_OSSL_STORE 1
35 #include <openssl/store.h>
36 #include <openssl/provider.h>
41#if !defined(OPENSSL_NO_ENGINE)
42 #define XRDTLS_HAVE_ENGINE 1
43 #include <openssl/engine.h>
46#include <openssl/bio.h>
47#include <openssl/crypto.h>
48#include <openssl/err.h>
49#include <openssl/conf.h>
50#include <openssl/ssl.h>
63#if OPENSSL_VERSION_NUMBER >= 0x30400010
64#define SSL_CTX_flush_sessions SSL_CTX_flush_sessions_ex
78#ifndef OPENSSL_NO_CONF
79bool EnsureOpenSSLConfigLoaded()
81 static std::once_flag configFlag;
82 static bool loadOK =
true;
84 std::call_once(configFlag, []() {
85#if OPENSSL_VERSION_NUMBER >= 0x10100000L
86 if (!OPENSSL_init_ssl(OPENSSL_INIT_LOAD_CONFIG,
nullptr))
89 OPENSSL_config(
nullptr);
95bool EnsureOpenSSLConfigLoaded()
101#if OPENSSL_VERSION_NUMBER >= 0x30000000L
104bool InitIsolatedPKCS11Context(OSSL_LIB_CTX **libCtx, OSSL_PROVIDER **pkcs11Prov, OSSL_PROVIDER **defaultProv)
107 *libCtx = OSSL_LIB_CTX_new();
114 const char *opensslConf = getenv(
"OPENSSL_CONF");
115 if (opensslConf && opensslConf[0]) {
117 if (!OSSL_LIB_CTX_load_config(*libCtx, opensslConf)) {
119 OSSL_LIB_CTX_free(*libCtx);
126 *defaultProv = OSSL_PROVIDER_load(*libCtx,
"default");
128 OSSL_LIB_CTX_free(*libCtx);
134 *pkcs11Prov = OSSL_PROVIDER_load(*libCtx,
"pkcs11");
136 OSSL_PROVIDER_unload(*defaultProv);
137 OSSL_LIB_CTX_free(*libCtx);
139 *defaultProv =
nullptr;
159#
if OPENSSL_VERSION_NUMBER >= 0x30000000L
160 , pkcs11LibCtx(0), pkcs11Provider(0)
166#if OPENSSL_VERSION_NUMBER >= 0x30000000L
167 if (pkcs11Provider) OSSL_PROVIDER_unload(pkcs11Provider);
168 if (pkcs11LibCtx) OSSL_LIB_CTX_free(pkcs11LibCtx);
184#if OPENSSL_VERSION_NUMBER >= 0x30000000L
185 OSSL_LIB_CTX *pkcs11LibCtx;
186 OSSL_PROVIDER *pkcs11Provider;
210 DBG_CTX(
"CRL refresh started.")
224 DBG_CTX(
"CRL refresh ending by request!");
230 DBG_CTX(
"CRL refresh will happen in " <<sleepTime <<
" seconds.");
240 if (!ctxImpl->
owner)
break;
251 if (!newctx || !newctx->
isOK())
252 {
XrdTls::Emsg(
"CrlRefresh:",
"Refresh of context failed!!!",
false);
259 doreplace = (ctxImpl->
ctxnew != 0);
260 if (doreplace)
delete ctxImpl->
ctxnew;
266 if (doreplace) {
DBG_CTX(
"CRL refresh created replacement x509 store.");}
267 else {
DBG_CTX(
"CRL refresh created new x509 store.");}
276 if (!keepctx)
delete ctxImpl;
295 time_t tStart, tWaited;
296 int flushT, waitT, hits, miss, sesn, tmos;
306 waitT = flushT = ctxImpl->
flushT;
311 DBG_CTX(
"Cache flusher started; interval="<<flushT<<
" seconds.");
317 tWaited= time(0) - tStart;
322 if (!ctxImpl->
owner)
break;
326 if (flushT != ctxImpl->
flushT && tWaited < ctxImpl->flushT-1)
327 {waitT = ctxImpl->
flushT - tWaited;
334 waitT = flushT = ctxImpl->
flushT;
339 sesn = SSL_CTX_sess_number(ctxImpl->
ctx);
340 hits = SSL_CTX_sess_hits(ctxImpl->
ctx);
341 miss = SSL_CTX_sess_misses(ctxImpl->
ctx);
342 tmos = SSL_CTX_sess_timeouts(ctxImpl->
ctx);
347 SSL_CTX_flush_sessions(ctxImpl->
ctx, tNow);
353 snprintf(mBuff,
sizeof(mBuff),
"sess=%d hits=%d miss=%d timeouts=%d",
354 sesn, hits, miss, tmos);
355 DBG_CTX(
"Cache flushed; " <<mBuff);
364 if (!keepctx)
delete ctxImpl;
394 0,
"Cache Flusher")))
396 snprintf(eBuff,
sizeof(eBuff),
397 "Unable to start cache flusher thread; rc=%d", rc);
405 SSL_CTX_set_session_cache_mode(pImpl->
ctx, SSL_SESS_CACHE_NO_AUTO_CLEAR);
423#if OPENSSL_VERSION_NUMBER < 0x10100000L && defined(OPENSSL_THREADS)
426#define XRDTLS_SET_CALLBACKS 1
435struct tlsmix<false> {
436 static unsigned long mixer(
unsigned long x) {
439 x *= 0xbf58476d1ce4e5b9UL;
441 x *= 0x94d049bb133111ebUL;
449 static unsigned long mixer(
unsigned long x) {
460unsigned long sslTLS_id_callback(
void)
469 return tlsmix<
sizeof(
unsigned long)==4>::mixer(x);
474void sslTLS_lock(
int mode,
int n,
const char *file,
int line)
479 if (mode & CRYPTO_LOCK) MutexVector[n].
Lock();
480 else MutexVector[n].
UnLock();
487#undef XRDTLS_SET_CALLBACKS
501#if OPENSSL_VERSION_NUMBER >= 0x10002000L
502const char *sslCiphers =
"ECDHE-ECDSA-AES128-GCM-SHA256:"
503 "ECDHE-RSA-AES128-GCM-SHA256:"
504 "ECDHE-ECDSA-AES256-GCM-SHA384:"
505 "ECDHE-RSA-AES256-GCM-SHA384:"
506 "ECDHE-ECDSA-CHACHA20-POLY1305:"
507 "ECDHE-RSA-CHACHA20-POLY1305:"
508 "DHE-RSA-AES128-GCM-SHA256:"
509 "DHE-RSA-AES256-GCM-SHA384";
511const char *sslCiphers =
"ALL:!LOW:!EXP:!MD5:!MD2";
516bool initTlsDone{
false };
529 if (initTlsDone)
return;
535 OpenSSL_add_all_algorithms();
536 SSL_load_error_strings();
537 OpenSSL_add_all_ciphers();
538#if OPENSSL_VERSION_NUMBER < 0x30000000L
539 ERR_load_BIO_strings();
541 ERR_load_crypto_strings();
545#ifdef XRDTLS_SET_CALLBACKS
547 int n = CRYPTO_num_locks();
550 CRYPTO_set_locking_callback(sslTLS_lock);
552 CRYPTO_set_id_callback(sslTLS_id_callback);
561void Fatal(std::string *
eMsg,
const char *msg,
bool sslmsg=
false)
577const char *GetTlsMethod(
const SSL_METHOD *&meth)
579#if OPENSSL_VERSION_NUMBER > 0x1010000fL
582 meth = SSLv23_method();
584 if (meth == 0)
return "No negotiable TLS method available.";
592bool VerPaths(
const char *cert,
const char *pkey,
593 const char *cadr,
const char *cafl, std::string &
eMsg)
595 static const mode_t cert_mode = S_IRUSR | S_IWUSR | S_IRWXG | S_IROTH;
596 static const mode_t pkey_mode = S_IRUSR | S_IWUSR;
597 static const mode_t cadr_mode = S_IRWXU | S_IRGRP | S_IXGRP
599 static const mode_t cafl_mode = S_IRUSR | S_IWUSR | S_IRWXG | S_IROTH;
606 {
eMsg =
"Unable to use CA cert directory ";
615 {
eMsg =
"Unable to use CA cert file ";
624 {
eMsg =
"Unable to use key file ";
634 {mode_t cmode = (pkey ? cert_mode : pkey_mode);
636 {
if (pkey)
eMsg =
"Unable to use cert file ";
637 else eMsg =
"Unable to use cert+key file ";
654int VerCB(
int aOK, X509_STORE_CTX *x509P)
657 {X509 *cert = X509_STORE_CTX_get_current_cert(x509P);
658 int depth = X509_STORE_CTX_get_error_depth(x509P);
659 int err = X509_STORE_CTX_get_error(x509P);
660 char name[512], info[1024];
662 X509_NAME_oneline(X509_get_subject_name(cert), name,
sizeof(name));
663 snprintf(info,
sizeof(info),
"Cert verification failed for DN=%s",name);
666 X509_NAME_oneline(X509_get_issuer_name(cert), name,
sizeof(name));
667 snprintf(info,
sizeof(info),
"Failing cert issuer=%s", name);
670 snprintf(info,
sizeof(info),
"Error %d at depth %d [%s]", err, depth,
671 X509_verify_cert_error_string(err));
685#define KILL_CTX(x) if (x) {SSL_CTX_free(x); x = 0;}
687#define FATAL(msg) {Fatal(eMsg, msg); KILL_CTX(pImpl->ctx); return;}
689#define FATAL_SSL(msg) {Fatal(eMsg, msg, true); KILL_CTX(pImpl->ctx); return;}
692 const char *caDir,
const char *caFile,
699 void Keep() {ctxLoc = 0;}
701 ctx_helper(SSL_CTX **ctxP) : ctxLoc(ctxP) {}
702 ~ctx_helper() {
if (ctxLoc && *ctxLoc)
703 {SSL_CTX_free(*ctxLoc); *ctxLoc = 0;}
707 } ctx_tracker(&pImpl->ctx);
709 static const uint64_t sslOpts = SSL_OP_ALL
712 | SSL_OP_NO_COMPRESSION
713#ifdef SSL_OP_IGNORE_UNEXPECTED_EOF
714 | SSL_OP_IGNORE_UNEXPECTED_EOF
716#if OPENSSL_VERSION_NUMBER >= 0x10101000L
717 | SSL_OP_NO_RENEGOTIATION
721 std::string certFN, eText;
735 if (!(
opts &
servr) && (dbg = getenv(
"XRDTLS_DEBUG")))
754 {
if (!caDir && !caFile)
755 {caDir = getenv(
"X509_CERT_DIR");
756 caFile = getenv(
"X509_CERT_FILE");
757 if (!caDir && !caFile)
758 FATAL(
"No CA cert specified; host identity cannot be verified.");
760 if (!key) key = getenv(
"X509_USER_KEY");
761 if (!cert) cert = getenv(
"X509_USER_PROXY");
764 long long int uid =
static_cast<long long int>(getuid());
765 certFN = std::string(
"/tmp/x509up_u") + std::to_string(uid);
766 if (!
stat(certFN.c_str(), &
Stat)) cert = certFN.c_str();
773 if (!VerPaths(cert, key, caDir, caFile, eText))
FATAL( eText.c_str());
778 pImpl->Parm.cert = cert;
782 if (key) pImpl->Parm.pkey = key;
783 if (caDir) pImpl->Parm.cadir = caDir;
784 if (caFile) pImpl->Parm.cafile = caFile;
785 pImpl->Parm.opts =
opts;
788 pImpl->Parm.crlRT =
static_cast<int>((
opts &
crlRF) >>
crlRS) * 60;
794 const SSL_METHOD *meth;
795 emsg = GetTlsMethod(meth);
798 pImpl->ctx = SSL_CTX_new(meth);
802 if (pImpl->ctx == 0)
FATAL_SSL(
"Unable to allocate TLS context!");
806 SSL_CTX_set_options(pImpl->ctx, sslOpts);
814 SSL_CTX_set_session_cache_mode(pImpl->ctx, SSL_SESS_CACHE_OFF);
820 if ((caDir || caFile) && !(
opts &
clcOF))
821 {
if (!SSL_CTX_load_verify_locations(pImpl->ctx, caFile, caDir))
822 FATAL_SSL(
"Unable to load the CA cert file or directory.");
825 SSL_CTX_set_verify_depth(pImpl->ctx, (vDepth ? vDepth : 9));
828 SSL_CTX_set_verify(pImpl->ctx, SSL_VERIFY_PEER, (LogVF ? VerCB : 0));
830 unsigned long xFlags = (
opts &
nopxy ? 0 : X509_V_FLAG_ALLOW_PROXY_CERTS);
832 {xFlags |= X509_V_FLAG_CRL_CHECK;
833 if (
opts &
crlFC) xFlags |= X509_V_FLAG_CRL_CHECK_ALL;
835 if (
opts) X509_STORE_set_flags(SSL_CTX_get_cert_store(pImpl->ctx),xFlags);
837 SSL_CTX_set_verify(pImpl->ctx, SSL_VERIFY_NONE, 0);
842 if (!SSL_CTX_set_cipher_list(pImpl->ctx, sslCiphers))
843 FATAL_SSL(
"Unable to set SSL cipher list; no supported ciphers.");
848#if SSL_CTRL_SET_ECDH_AUTO
849 SSL_CTX_set_ecdh_auto(pImpl->ctx, 1);
856 if (
opts &
artON) SSL_CTX_set_mode(pImpl->ctx, SSL_MODE_AUTO_RETRY);
868 if (!key) key = cert;
872 if (SSL_CTX_use_certificate_chain_file(pImpl->ctx, cert) != 1)
873 FATAL_SSL(
"Unable to create TLS context; invalid certificate.");
878 if (!EnsureOpenSSLConfigLoaded())
879 FATAL_SSL(
"Unable to load OpenSSL configuration; cannot initialize pkcs11.");
881#ifdef XRDTLS_HAVE_OSSL_STORE
885 OSSL_PROVIDER *defaultProv =
nullptr;
890 if (!InitIsolatedPKCS11Context(&pImpl->pkcs11LibCtx, &pImpl->pkcs11Provider, &defaultProv)) {
891 FATAL_SSL(
"Failed to initialize isolated PKCS11 context. Check OPENSSL_CONF and pkcs11-provider installation.");
895 OSSL_STORE_CTX *store_ctx = OSSL_STORE_open_ex(key, pImpl->pkcs11LibCtx,
nullptr,
896 nullptr,
nullptr,
nullptr,
nullptr,
nullptr);
898 if (defaultProv) OSSL_PROVIDER_unload(defaultProv);
899 FATAL_SSL(
"Failed to open PKCS11 URI in isolated context.");
902 EVP_PKEY *priv_key =
nullptr;
903 while (!OSSL_STORE_eof(store_ctx)) {
904 OSSL_STORE_INFO *info = OSSL_STORE_load(store_ctx);
906 int type = OSSL_STORE_INFO_get_type(info);
907 if (type == OSSL_STORE_INFO_PKEY) {
908 priv_key = OSSL_STORE_INFO_get1_PKEY(info);
909 OSSL_STORE_INFO_free(info);
912 OSSL_STORE_INFO_free(info);
915 OSSL_STORE_close(store_ctx);
916 if (defaultProv) OSSL_PROVIDER_unload(defaultProv);
919 FATAL_SSL(
"Failed to load private key from PKCS11 URI in isolated context.");
921 if (SSL_CTX_use_PrivateKey(pImpl->ctx, priv_key) != 1) {
922 EVP_PKEY_free(priv_key);
923 FATAL_SSL(
"Failed to have SSL context use private key");
925 EVP_PKEY_free(priv_key);
927#elif defined(XRDTLS_HAVE_ENGINE)
929 ENGINE *e = ENGINE_by_id(
"pkcs11");
931 const char* modulePath = getenv(
"PKCS11_MODULE_PATH");
932 if (modulePath && modulePath[0]) {
933 if (!ENGINE_ctrl_cmd_string(e,
"MODULE_PATH", modulePath, 0)) {
935 FATAL_SSL(
"Unable to configure pkcs11 engine MODULE_PATH");
938 if(!ENGINE_init(e)) {
940 FATAL_SSL(
"Unable to initialize pkcs11 engine");
943 FATAL_SSL(
"Unable to create pkcs11 engine");
945 auto priv_key = ENGINE_load_private_key(e, key,
nullptr,
nullptr);
948 FATAL_SSL(
"Failed to load private key through engine");
950 if (SSL_CTX_use_PrivateKey(pImpl->ctx, priv_key) != 1)
951 FATAL_SSL(
"Failed to have SSL context use private key");
952 EVP_PKEY_free(priv_key);
954 FATAL_SSL(
"PKCS11 support not available.");
957 }
else if (SSL_CTX_use_PrivateKey_file(pImpl->ctx, key, SSL_FILETYPE_PEM) != 1 )
958 FATAL_SSL(
"Unable to create TLS context; invalid private key.");
962 if (SSL_CTX_check_private_key(pImpl->ctx) != 1 )
963 FATAL_SSL(
"Unable to create TLS context; cert-key mismatch.");
982 if (pImpl->crlRunning | pImpl->flsRunning)
983 {pImpl->crlMutex.WriteLock();
985 pImpl->crlMutex.UnLock();
996 const char *cert = (my.
cert.size() ? my.
cert.c_str() : 0);
997 const char *pkey = (my.
pkey.size() ? my.
pkey.c_str() : 0);
998 const char *caD = (my.
cadir.size() ? my.
cadir.c_str() : 0);
999 const char *caF = (my.
cafile.size() ? my.
cafile.c_str() : 0);
1003 if (!full) caD = caF = 0;
1008 if(startCRLRefresh){
1018 if(pImpl->sessionCacheOpts != -1){
1020 xtc->
SessionCache(pImpl->sessionCacheOpts,pImpl->sessionCacheId.c_str(),pImpl->sessionCacheId.size());
1046 return &pImpl->Parm;
1058#ifndef OPENSSL_THREADS
1059 return "Installed OpenSSL lacks the required thread support!";
1074 return pImpl->ctx != 0;
1089#if OPENSSL_VERSION_NUMBER >= 0x10002000L
1097 pImpl->crlMutex.ReadLock();
1098 if (!(pImpl->ctxnew))
1099 {ssl = SSL_new(pImpl->ctx);
1100 pImpl->crlMutex.UnLock();
1107 pImpl->crlMutex.UnLock();
1108 pImpl->crlMutex.WriteLock();
1112 if (!(pImpl->ctxnew))
1113 {ssl = SSL_new(pImpl->ctx);
1114 pImpl->crlMutex.UnLock();
1120 DBG_CTX(
"Replacing x509 store with new contents.");
1137 SSL_CTX_free(pImpl->ctx);
1138 pImpl->ctx = ctxnew->pImpl->
ctx;
1143 ctxnew->pImpl->
ctx = 0;
1152 ssl = SSL_new(pImpl->ctx);
1156 pImpl->crlMutex.UnLock();
1165 return SSL_new(pImpl->ctx);
1179 pImpl->sessionCacheOpts =
opts;
1180 pImpl->sessionCacheId = id;
1184 if (pImpl->ctx == 0)
return 0;
1189 {
if (
opts &
scOff) sslopt = SSL_SESS_CACHE_OFF;
1190 else {
if (
opts &
scSrvr) sslopt = SSL_SESS_CACHE_SERVER;
1191 if (
opts &
scClnt) sslopt |= SSL_SESS_CACHE_CLIENT;
1197 if (!(
opts & doSet)) sslopt = SSL_CTX_get_session_cache_mode(pImpl->ctx);
1198 else {sslopt = SSL_CTX_set_session_cache_mode(pImpl->ctx, sslopt);
1199 if (
opts &
scOff) SSL_CTX_set_options(pImpl->ctx, SSL_OP_NO_TICKET);
1205 if (sslopt & SSL_SESS_CACHE_SERVER)
opts |=
scSrvr;
1206 if (sslopt & SSL_SESS_CACHE_CLIENT)
opts |=
scClnt;
1208 if (sslopt & SSL_SESS_CACHE_NO_AUTO_CLEAR)
opts |=
scKeep;
1209 opts |= (
static_cast<int>(pImpl->flushT) &
scFMax);
1213 if (
id && idlen > 0)
1214 {
if (!SSL_CTX_set_session_id_context(pImpl->ctx,
1215 (
unsigned const char *)
id,
1222 if (flushT && flushT != pImpl->flushT)
1236 if (pImpl->ctx && SSL_CTX_set_cipher_list(pImpl->ctx, ciphers))
return true;
1239 snprintf(eBuff,
sizeof(eBuff),
"Unable to set context ciphers '%s'",ciphers);
1240 Fatal(0, eBuff,
true);
1250 sslCiphers = ciphers;
1259#if OPENSSL_VERSION_NUMBER >= 0x10002000L
1267 {pImpl->crlMutex.WriteLock();
1268 refsec = pImpl->Parm.crlRT;
1269 pImpl->crlMutex.UnLock();
1279 pImpl->crlMutex.WriteLock();
1280 pImpl->Parm.crlRT = refsec;
1281 if (!pImpl->crlRunning)
1285 snprintf(eBuff,
sizeof(eBuff),
1286 "Unable to start CRL refresh thread; rc=%d", rc);
1288 pImpl->crlMutex.UnLock();
1290 }
else pImpl->crlRunning =
true;
1291 pImpl->crlMutex.UnLock();
1303 XrdTls::Emsg(
"CrlRefresh:",
"Refreshing CRLs only supported in "
1304 "OpenSSL version >= 1.02; CRL refresh disabled!",
false);
1315 return !(pImpl->Parm.cadir.empty()) || !(pImpl->Parm.cafile.empty());
1319 const std::string certPath = pImpl->Parm.cert;
1320 if(certPath.empty()) {
1324 time_t modificationTime;
1326 if (pImpl->lastCertModTime != modificationTime) {
1328 pImpl->lastCertModTime = modificationTime;
1336 bool LogVF = (pImpl->Parm.opts &
logVF) != 0;
1338 {pImpl->Parm.opts &=
~clcOF;
1339 SSL_CTX_set_verify(pImpl->ctx, SSL_VERIFY_PEER, (LogVF ? VerCB : 0));
1341 {pImpl->Parm.opts |=
clcOF;
1342 SSL_CTX_set_verify(pImpl->ctx, SSL_VERIFY_NONE, 0);
void Fatal(const char *op, const char *target)
int emsg(int rc, char *msg)
static int getModificationTime(const char *path, time_t &modificationTime)
static const char * ValPath(const char *path, mode_t allow, bool isdir)
static int Run(pthread_t *, void *(*proc)(void *), void *arg, int opts=0, const char *desc=0)
static pthread_t ID(void)
static void Snooze(int seconds)
static const int scIdErr
Info: Id not set, is too long.
XrdTlsContext * Clone(bool full=true, bool startCRLRefresh=false)
~XrdTlsContext()
Destructor.
static const uint64_t vdept
Mask to isolate vdept.
static const int crlRS
Bits to shift vdept.
int SessionCache(int opts=scNone, const char *id=0, int idlen=0)
static void SetDefaultCiphers(const char *ciphers)
XrdTlsContext(const char *cert=0, const char *key=0, const char *cadir=0, const char *cafile=0, uint64_t opts=0, std::string *eMsg=0)
static const uint64_t clcOF
Disable client certificate request.
static const int scClnt
Turn on cache client mode.
static const int DEFAULT_CRL_REF_INT_SEC
Default CRL refresh interval in seconds.
static const uint64_t servr
This is a server context.
static const uint64_t rfCRL
Turn on the CRL refresh thread.
static const int scKeep
Info: TLS-controlled flush disabled.
static const uint64_t nopxy
Do not allow proxy certs.
static const int scNone
Do not change any option settings.
static const uint64_t logVF
Log verify failures.
static const uint64_t crlFC
Full crl chain checking.
static const uint64_t crlON
Enables crl checking.
static const uint64_t artON
Auto retry Handshake.
static const int vdepS
Bits to shift vdept.
const CTX_Params * GetParams()
static const int scOff
Turn off cache.
static const char * Init()
bool newHostCertificateDetected()
bool SetContextCiphers(const char *ciphers)
bool SetCrlRefresh(int refsec=-1)
static const int scSrvr
Turn on cache server mode (default)
void SetTlsClientAuth(bool setting)
static const uint64_t crlRF
Mask to isolate crl refresh in min.
static const int dbgSIO
Turn debugging in for socket I/O.
static const int dbgSOK
Turn debugging in for socket operations.
static const int dbgOUT
Force msgs to stderr for easier client debug.
static void Emsg(const char *tid, const char *msg=0, bool flush=true)
static const int dbgALL
Turn debugging for everything.
static const int dbgCTX
Turn debugging in for context operations.
static void SetDebug(int opts, XrdSysLogger *logP=0)
void * Refresh(void *parg)
bool Setup_Flusher(XrdTlsContextImpl *pImpl, int flushT)
void * Flusher(void *parg)
XrdSysTrace SysTrace("TLS", 0)
XrdTlsContextImpl(XrdTlsContext *p)
std::string sessionCacheId
XrdTlsContext::CTX_Params Parm
std::string cafile
-> ca cert file.
uint64_t opts
Options as passed to the constructor.
std::string cadir
-> ca cert directory.
int crlRT
crl refresh interval time in seconds
std::string pkey
-> private key path.
std::string cert
-> certificate path.