Skip to content

Commit 000b3e8

Browse files
authored
Merge pull request #901 from Matus-p/feature/ssl_load_cert_dynamic
[Added] TLS: natsOptions_LoadCertificatesChainDynamic
2 parents 5bfaffc + 3a4c3c9 commit 000b3e8

File tree

13 files changed

+506
-137
lines changed

13 files changed

+506
-137
lines changed

src/conn.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -761,9 +761,14 @@ _makeTLSConn(natsConnection *nc)
761761
#endif
762762
if ((s == NATS_OK) && (SSL_do_handshake(ssl) != 1))
763763
{
764-
s = nats_setError(NATS_SSL_ERROR,
765-
"SSL handshake error: %s",
766-
(nc->errStr[0] != '\0' ? nc->errStr : NATS_SSL_ERR_REASON_STRING));
764+
// check if there is already set NATS_SSL_ERROR from _sslCertCallback
765+
nats_GetLastError(&s);
766+
if (s != NATS_SSL_ERROR)
767+
{
768+
s = nats_setError(NATS_SSL_ERROR,
769+
"SSL handshake error: %s",
770+
(nc->errStr[0] != '\0' ? nc->errStr : NATS_SSL_ERR_REASON_STRING));
771+
}
767772
}
768773
// Make sure that if nc-errStr was set in _collectSSLErr but
769774
// the overall handshake is ok, then we clear the error

src/nats.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2663,6 +2663,24 @@ natsOptions_LoadCertificatesChain(natsOptions *opts,
26632663
const char *certsFileName,
26642664
const char *keyFileName);
26652665

2666+
/** \brief Loads the certificate chain and key from a file on every connection attempt.
2667+
*
2668+
* Similar to #natsOptions_LoadCertificatesChain expect that instead of loading
2669+
* from file just once, the key and certificate is read on every connection attempt.
2670+
* This is useful when the certificate is renewed and the application
2671+
* needs to pick up the new certificate without restarting.
2672+
*
2673+
* @see natsOptions_LoadCertificatesChain()
2674+
*
2675+
* @param opts the pointer to the #natsOptions object.
2676+
* @param certsFileName the file containing the client certificates.
2677+
* @param keyFileName the file containing the client private key.
2678+
*/
2679+
NATS_EXTERN natsStatus
2680+
natsOptions_LoadCertificatesChainDynamic(natsOptions *opts,
2681+
const char *certsFileName,
2682+
const char *keyFileName);
2683+
26662684
/** \brief Sets the client certificate and key.
26672685
*
26682686
* Similar to #natsOptions_LoadCertificatesChain expect that instead

src/natsp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ typedef struct __natsSSLCtx
196196
SSL_CTX *ctx;
197197
char *expectedHostname;
198198
bool skipVerify;
199+
char *certFileName;
200+
char *keyFileName;
199201

200202
#ifdef NATS_WITH_EXPERIMENTAL
201203
SSL_verify_cb callback;

src/opts.c

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,8 @@ natsSSLCtx_release(natsSSLCtx *ctx)
233233
if (refs == 0)
234234
{
235235
NATS_FREE(ctx->expectedHostname);
236+
NATS_FREE(ctx->certFileName);
237+
NATS_FREE(ctx->keyFileName);
236238
SSL_CTX_free(ctx->ctx);
237239
natsMutex_Destroy(ctx->lock);
238240
NATS_FREE(ctx);
@@ -556,6 +558,78 @@ natsOptions_LoadCertificatesChain(natsOptions *opts,
556558
return s;
557559
}
558560

561+
static int
562+
_sslCertCallback(SSL* ssl, void* arg)
563+
{
564+
natsSSLCtx *ctx = (natsSSLCtx*)arg;
565+
if (ctx == NULL)
566+
return 0;
567+
568+
// delete any certificates associated with the SSL object
569+
SSL_certs_clear(ssl);
570+
571+
if (SSL_use_certificate_chain_file(ssl, ctx->certFileName) != 1)
572+
{
573+
nats_setError(NATS_SSL_ERROR,
574+
"Error loading certificate chain '%s': %s",
575+
ctx->certFileName,
576+
NATS_SSL_ERR_REASON_STRING);
577+
return 0;
578+
}
579+
580+
if (SSL_use_PrivateKey_file(ssl, ctx->keyFileName, SSL_FILETYPE_PEM) != 1)
581+
{
582+
nats_setError(NATS_SSL_ERROR,
583+
"Error loading private key '%s': %s",
584+
ctx->keyFileName,
585+
NATS_SSL_ERR_REASON_STRING);
586+
return 0;
587+
}
588+
589+
return 1;
590+
}
591+
592+
natsStatus
593+
natsOptions_LoadCertificatesChainDynamic(natsOptions *opts,
594+
const char *certFileName,
595+
const char *keyFileName)
596+
{
597+
natsStatus s = NATS_OK;
598+
599+
if (nats_IsStringEmpty(certFileName) || nats_IsStringEmpty(keyFileName))
600+
{
601+
return nats_setError(NATS_INVALID_ARG, "%s",
602+
"certificate and key file names can't be NULL nor empty");
603+
}
604+
605+
LOCK_AND_CHECK_OPTIONS(opts, 0);
606+
607+
s = _getSSLCtx(opts);
608+
if (s == NATS_OK)
609+
{
610+
NATS_FREE(opts->sslCtx->certFileName);
611+
opts->sslCtx->certFileName = NATS_STRDUP(certFileName);
612+
if (opts->sslCtx->certFileName == NULL)
613+
s = nats_setDefaultError(NATS_NO_MEMORY);
614+
}
615+
if (s == NATS_OK)
616+
{
617+
NATS_FREE(opts->sslCtx->keyFileName);
618+
opts->sslCtx->keyFileName = NATS_STRDUP(keyFileName);
619+
if (opts->sslCtx->keyFileName == NULL)
620+
s = nats_setDefaultError(NATS_NO_MEMORY);
621+
}
622+
if (s == NATS_OK)
623+
{
624+
nats_sslRegisterThreadForCleanup();
625+
SSL_CTX_set_cert_cb(opts->sslCtx->ctx, _sslCertCallback, opts->sslCtx);
626+
}
627+
628+
UNLOCK_OPTS(opts);
629+
630+
return s;
631+
}
632+
559633
natsStatus
560634
natsOptions_SetCertificatesChain(natsOptions *opts, const char *certStr, const char *keyStr)
561635
{

test/certs/ca.pem

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
-----BEGIN CERTIFICATE-----
2-
MIIEkDCCA3igAwIBAgIUSZwW7btc9EUbrMWtjHpbM0C2bSEwDQYJKoZIhvcNAQEL
2+
MIIEkDCCA3igAwIBAgIUNqvYsS3NkSQC/FntFcUL5rBfEs8wDQYJKoZIhvcNAQEL
33
BQAwcTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExEDAOBgNVBAoM
44
B1N5bmFkaWExEDAOBgNVBAsMB25hdHMuaW8xKTAnBgNVBAMMIENlcnRpZmljYXRl
5-
IEF1dGhvcml0eSAyMDIyLTA4LTI3MB4XDTIyMDgyNzIwMjMwMloXDTMyMDgyNDIw
6-
MjMwMlowcTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExEDAOBgNV
5+
IEF1dGhvcml0eSAyMDI1LTA4LTIwMB4XDTI1MDgyMDE4NDIwMVoXDTM1MDgxODE4
6+
NDIwMVowcTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExEDAOBgNV
77
BAoMB1N5bmFkaWExEDAOBgNVBAsMB25hdHMuaW8xKTAnBgNVBAMMIENlcnRpZmlj
8-
YXRlIEF1dGhvcml0eSAyMDIyLTA4LTI3MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
9-
MIIBCgKCAQEAqilVqyY8rmCpTwAsLF7DEtWEq37KbljBWVjmlp2Wo6TgMd3b537t
10-
6iO8+SbI8KH75i63RcxV3Uzt1/L9Yb6enDXF52A/U5ugmDhaa+Vsoo2HBTbCczmp
11-
qndp7znllQqn7wNLv6aGSvaeIUeYS5Dmlh3kt7Vqbn4YRANkOUTDYGSpMv7jYKSu
12-
1ee05Rco3H674zdwToYto8L8V7nVMrky42qZnGrJTaze+Cm9tmaIyHCwUq362CxS
13-
dkmaEuWx11MOIFZvL80n7ci6pveDxe5MIfwMC3/oGn7mbsSqidPMcTtjw6ey5NEu
14-
Z0UrC/2lL1FtF4gnVMKUSaEhU2oKjj0ZAQIDAQABo4IBHjCCARowHQYDVR0OBBYE
15-
FP7Pfz4u7sSt6ltviEVsx4hIFIs6MIGuBgNVHSMEgaYwgaOAFP7Pfz4u7sSt6ltv
16-
iEVsx4hIFIs6oXWkczBxMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5p
8+
YXRlIEF1dGhvcml0eSAyMDI1LTA4LTIwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
9+
MIIBCgKCAQEAzXEVV4DpCyJXTjnKaDIR/d029wrR9Bn7XyDPhwUpxUV+dBBFYyMb
10+
Vjuu6Pz/Wyfw0H0J0Y0x8o5ScHEZmrGqgxV6Oqi5I5KVuzouYlk+U50eRqQ2wcVs
11+
dbA3I/cHYZYlEezXYjhPF7FlXfTIn7zuIR+K4FFfGe6tu2b9XkNTnksEDAleKyl9
12+
jaa79GEqDVPK2+kHGg5Z5ayngp9slFKhgRB97zryjq31eg+M03NW1nsavh9/P+UP
13+
33ERAro7lYvuKz4iWw7Wov86p6I4lhX3q4N0Exl0fW6zK2qCIxFA4GnKMONRbz7n
14+
WL5DoB3wPTjBr0dSN0s1dtbqY1RfmLpU/wIDAQABo4IBHjCCARowHQYDVR0OBBYE
15+
FLAMCZXqFT8jjuq8TID2Ejk6VnsoMIGuBgNVHSMEgaYwgaOAFLAMCZXqFT8jjuq8
16+
TID2Ejk6VnsooXWkczBxMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5p
1717
YTEQMA4GA1UECgwHU3luYWRpYTEQMA4GA1UECwwHbmF0cy5pbzEpMCcGA1UEAwwg
18-
Q2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMjItMDgtMjeCFEmcFu27XPRFG6zFrYx6
19-
WzNAtm0hMAwGA1UdEwQFMAMBAf8wOgYJYIZIAYb4QgENBC0WK25hdHMuaW8gbmF0
18+
Q2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMjUtMDgtMjCCFDar2LEtzZEkAvxZ7RXF
19+
C+awXxLPMAwGA1UdEwQFMAMBAf8wOgYJYIZIAYb4QgENBC0WK25hdHMuaW8gbmF0
2020
cy1zZXJ2ZXIgdGVzdC1zdWl0ZSB0cmFuc2llbnQgQ0EwDQYJKoZIhvcNAQELBQAD
21-
ggEBAHDCHLQklYZlnzHDaSwxgGSiPUrCf2zhk2DNIYSDyBgdzrIapmaVYQRrCBtA
22-
j/4jVFesgw5WDoe4TKsyha0QeVwJDIN8qg2pvpbmD8nOtLApfl0P966vcucxDwqO
23-
dQWrIgNsaUdHdwdo0OfvAlTfG0v/y2X0kbL7h/el5W9kWpxM/rfbX4IHseZL2sLq
24-
FH69SN3FhMbdIm1ldrcLBQVz8vJAGI+6B9hSSFQWljssE0JfAX+8VW/foJgMSx7A
25-
vBTq58rLkAko56Jlzqh/4QT+ckayg9I73v1Q5/44jP1mHw35s5ZrzpDQt2sVv4l5
26-
lwRPJFXMwe64flUs9sM+/vqJaIY=
21+
ggEBAERioFrhz1F27ERygpxgeWifp7+x7DwgroPY50QZcfCLPJ8A/wMSf/9BHXSp
22+
HDh8sFoCFhNpa10pwa6t2m/IOGwH8uJjCyL71MLwQe0pyCYeat6Vde793d843Dh/
23+
23Y44nT7Vp9MZK73/UjgLQk69iJh9wEjE/LK/teUBD28VEAuDImG8ae6b8pW07B0
24+
GxzqZx6CLCd1859YZy0wUWDlE3f9kTQ74QoVEPpvwj3IiK7N8TPnn6gnYjgqcpm9
25+
LJG2KWiRXSf5Ee8LcWC32nH7Mp9Ufijk2cvxbxSIgfg2cZOqdoa9Sr9ExwTnjeaF
26+
SNdZKkZz9siXP/U2V17eNEnJXWI=
2727
-----END CERTIFICATE-----

test/certs/client-cert.pem

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ Certificate:
22
Data:
33
Version: 3 (0x2)
44
Serial Number:
5-
38:4c:16:24:9b:04:1c:b3:db:e0:4c:3c:ed:b7:40:7d:68:b5:fa:1f
5+
67:89:cf:80:a0:f2:68:05:1d:c8:9e:c1:f6:4b:d6:1a:0b:78:c1:aa
66
Signature Algorithm: sha256WithRSAEncryption
7-
Issuer: C=US, ST=California, O=Synadia, OU=nats.io, CN=Certificate Authority 2022-08-27
7+
Issuer: C=US, ST=California, O=Synadia, OU=nats.io, CN=Certificate Authority 2025-08-20
88
Validity
9-
Not Before: Aug 27 20:23:02 2022 GMT
10-
Not After : Aug 24 20:23:02 2032 GMT
9+
Not Before: Aug 20 18:42:01 2025 GMT
10+
Not After : Aug 18 18:42:01 2035 GMT
1111
Subject: C=US, ST=California, O=Synadia, OU=nats.io, CN=localhost
1212
Subject Public Key Info:
1313
Public Key Algorithm: rsaEncryption
14-
RSA Public-Key: (2048 bit)
14+
Public-Key: (2048 bit)
1515
Modulus:
1616
00:ac:9c:3e:9d:3b:7a:12:56:85:78:ca:df:9c:fc:
1717
0c:7e:5e:f2:4f:22:33:46:81:38:53:d7:a7:25:8f:
@@ -40,10 +40,9 @@ Certificate:
4040
X509v3 Subject Key Identifier:
4141
1F:14:EF:2B:53:AB:28:4A:93:42:98:AE:85:06:0F:B4:7D:DC:36:AE
4242
X509v3 Authority Key Identifier:
43-
keyid:FE:CF:7F:3E:2E:EE:C4:AD:EA:5B:6F:88:45:6C:C7:88:48:14:8B:3A
44-
DirName:/C=US/ST=California/O=Synadia/OU=nats.io/CN=Certificate Authority 2022-08-27
45-
serial:49:9C:16:ED:BB:5C:F4:45:1B:AC:C5:AD:8C:7A:5B:33:40:B6:6D:21
46-
43+
keyid:B0:0C:09:95:EA:15:3F:23:8E:EA:BC:4C:80:F6:12:39:3A:56:7B:28
44+
DirName:/C=US/ST=California/O=Synadia/OU=nats.io/CN=Certificate Authority 2025-08-20
45+
serial:36:AB:D8:B1:2D:CD:91:24:02:FC:59:ED:15:C5:0B:E6:B0:5F:12:CF
4746
X509v3 Subject Alternative Name:
4847
DNS:localhost, IP Address:127.0.0.1, IP Address:0:0:0:0:0:0:0:1, email:[email protected]
4948
Netscape Cert Type:
@@ -53,27 +52,28 @@ Certificate:
5352
X509v3 Extended Key Usage:
5453
TLS Web Client Authentication
5554
Signature Algorithm: sha256WithRSAEncryption
56-
60:43:0b:c6:11:0b:96:ae:03:dc:77:26:9a:4a:bd:6a:d7:03:
57-
ec:43:16:2d:ba:8c:e5:50:fa:57:a9:1f:2f:a4:15:c3:a8:13:
58-
b9:d3:59:2a:97:7c:ae:ce:a9:f8:44:e4:97:ee:7d:09:dc:74:
59-
38:80:94:cf:47:e0:84:52:2a:91:44:8a:85:55:da:42:6a:f1:
60-
91:1a:6e:5a:63:e6:0b:61:3c:0d:b0:aa:17:b8:77:94:32:20:
61-
4d:20:8f:84:56:64:ae:ef:d8:8d:42:b5:52:4d:b0:1c:46:97:
62-
bc:4c:77:8c:3f:a3:73:43:87:27:71:62:e7:fe:02:de:a1:27:
63-
77:be:86:29:8f:62:a1:d9:e7:ea:61:33:73:f4:1f:0a:12:14:
64-
68:eb:7d:8c:71:5b:42:e7:48:10:c9:df:30:3b:5b:eb:69:29:
65-
b6:95:bc:09:fc:01:b0:be:fc:9f:ee:c4:f3:df:a0:01:c5:68:
66-
20:f5:2f:f8:e7:1c:a5:4c:a8:a8:a2:20:a1:d2:0f:f6:f6:c4:
67-
0d:f5:26:fd:ea:8b:b5:06:a9:9e:17:35:47:f7:fd:6e:78:3d:
68-
5f:7a:87:ed:21:b2:4e:e9:6a:d1:d9:ed:0e:cf:43:61:83:7c:
69-
fe:0d:b1:ad:ff:fa:2d:2b:36:9d:99:9c:20:48:21:0d:36:c8:
70-
dd:b6:0a:d8
55+
Signature Value:
56+
9d:22:66:cb:9b:16:a9:ea:3d:88:18:ae:3f:33:d0:73:4d:e3:
57+
0b:b0:b6:b8:85:aa:27:35:fa:61:6e:22:0f:ac:bd:bd:12:2e:
58+
ad:99:32:ab:51:59:f4:5e:77:9b:e1:ea:33:87:a1:be:09:f6:
59+
65:43:22:c1:2e:a1:5d:0f:96:27:ac:44:ed:56:67:da:83:5c:
60+
72:fe:4a:49:58:47:2c:12:f8:46:5b:01:7a:13:04:67:06:a5:
61+
4d:a0:a0:2f:bd:4d:de:e7:04:92:de:16:ef:40:32:02:a8:fb:
62+
64:31:e4:40:1f:f9:46:b5:fb:58:f3:61:a9:d4:a1:42:ed:d7:
63+
34:bf:b6:95:3a:55:c9:25:ce:4f:b1:5e:45:8c:3a:09:b3:27:
64+
2c:25:ee:0b:e3:c9:4b:bd:40:9d:b0:d8:28:fa:06:df:4a:a8:
65+
e9:de:c4:a8:51:85:37:d6:32:3b:71:f0:68:fb:59:76:e2:f5:
66+
be:3b:b4:00:e9:82:f1:27:4c:30:21:de:4b:ee:0b:10:7f:bf:
67+
77:a4:40:09:69:e7:5e:62:e0:35:a6:e4:b7:e1:86:19:b1:34:
68+
b3:25:73:f2:f7:75:a4:1c:71:90:b7:7d:bd:77:1c:b0:e7:3b:
69+
4a:f5:fc:16:58:96:2f:f4:9f:0a:6f:9b:50:00:dc:a6:23:08:
70+
0a:54:01:af
7171
-----BEGIN CERTIFICATE-----
72-
MIIE5zCCA8+gAwIBAgIUOEwWJJsEHLPb4Ew87bdAfWi1+h8wDQYJKoZIhvcNAQEL
72+
MIIE5zCCA8+gAwIBAgIUZ4nPgKDyaAUdyJ7B9kvWGgt4waowDQYJKoZIhvcNAQEL
7373
BQAwcTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExEDAOBgNVBAoM
7474
B1N5bmFkaWExEDAOBgNVBAsMB25hdHMuaW8xKTAnBgNVBAMMIENlcnRpZmljYXRl
75-
IEF1dGhvcml0eSAyMDIyLTA4LTI3MB4XDTIyMDgyNzIwMjMwMloXDTMyMDgyNDIw
76-
MjMwMlowWjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExEDAOBgNV
75+
IEF1dGhvcml0eSAyMDI1LTA4LTIwMB4XDTI1MDgyMDE4NDIwMVoXDTM1MDgxODE4
76+
NDIwMVowWjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExEDAOBgNV
7777
BAoMB1N5bmFkaWExEDAOBgNVBAsMB25hdHMuaW8xEjAQBgNVBAMMCWxvY2FsaG9z
7878
dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKycPp07ehJWhXjK35z8
7979
DH5e8k8iM0aBOFPXpyWP1+4WE+JnSYj2lJnwqabb/noXyePfMXNxOHA6lh6Ze10H
@@ -83,17 +83,17 @@ VW4uZZOakFQDbQ3mRNb3wNfY4ccewpujbojxfFgIop8TzFu5ESwdI286rkeaD2rO
8383
h8si/3AcSO264L7wvJ7g3FnbpXQlWLNhBPYzKGsHJWAPcpMWbJ+wrUoY954pHrdh
8484
NBcCAwEAAaOCAYwwggGIMAkGA1UdEwQCMAAwOQYJYIZIAYb4QgENBCwWKm5hdHMu
8585
aW8gbmF0cy1zZXJ2ZXIgdGVzdC1zdWl0ZSBjZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQU
86-
HxTvK1OrKEqTQpiuhQYPtH3cNq4wga4GA1UdIwSBpjCBo4AU/s9/Pi7uxK3qW2+I
87-
RWzHiEgUizqhdaRzMHExCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlh
86+
HxTvK1OrKEqTQpiuhQYPtH3cNq4wga4GA1UdIwSBpjCBo4AUsAwJleoVPyOO6rxM
87+
gPYSOTpWeyihdaRzMHExCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlh
8888
MRAwDgYDVQQKDAdTeW5hZGlhMRAwDgYDVQQLDAduYXRzLmlvMSkwJwYDVQQDDCBD
89-
ZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAyMi0wOC0yN4IUSZwW7btc9EUbrMWtjHpb
90-
M0C2bSEwOwYDVR0RBDQwMoIJbG9jYWxob3N0hwR/AAABhxAAAAAAAAAAAAAAAAAA
89+
ZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAyNS0wOC0yMIIUNqvYsS3NkSQC/FntFcUL
90+
5rBfEs8wOwYDVR0RBDQwMoIJbG9jYWxob3N0hwR/AAABhxAAAAAAAAAAAAAAAAAA
9191
AAABgQ1kZXJla0BuYXRzLmlvMBEGCWCGSAGG+EIBAQQEAwIHgDALBgNVHQ8EBAMC
92-
BaAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGBDC8YR
93-
C5auA9x3JppKvWrXA+xDFi26jOVQ+lepHy+kFcOoE7nTWSqXfK7OqfhE5JfufQnc
94-
dDiAlM9H4IRSKpFEioVV2kJq8ZEablpj5gthPA2wqhe4d5QyIE0gj4RWZK7v2I1C
95-
tVJNsBxGl7xMd4w/o3NDhydxYuf+At6hJ3e+himPYqHZ5+phM3P0HwoSFGjrfYxx
96-
W0LnSBDJ3zA7W+tpKbaVvAn8AbC+/J/uxPPfoAHFaCD1L/jnHKVMqKiiIKHSD/b2
97-
xA31Jv3qi7UGqZ4XNUf3/W54PV96h+0hsk7patHZ7Q7PQ2GDfP4Nsa3/+i0rNp2Z
98-
nCBIIQ02yN22Ctg=
92+
BaAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAJ0iZsub
93+
FqnqPYgYrj8z0HNN4wuwtriFqic1+mFuIg+svb0SLq2ZMqtRWfRed5vh6jOHob4J
94+
9mVDIsEuoV0PliesRO1WZ9qDXHL+SklYRywS+EZbAXoTBGcGpU2goC+9Td7nBJLe
95+
Fu9AMgKo+2Qx5EAf+Ua1+1jzYanUoULt1zS/tpU6Vcklzk+xXkWMOgmzJywl7gvj
96+
yUu9QJ2w2Cj6Bt9KqOnexKhRhTfWMjtx8Gj7WXbi9b47tADpgvEnTDAh3kvuCxB/
97+
v3ekQAlp515i4DWm5LfhhhmxNLMlc/L3daQccZC3fb13HLDnO0r1/BZYli/0nwpv
98+
m1AA3KYjCApUAa8=
9999
-----END CERTIFICATE-----

test/certs/client-cert2.pem

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
Certificate:
2+
Data:
3+
Version: 3 (0x2)
4+
Serial Number:
5+
25:06:c5:d0:c3:41:74:d3:04:85:b0:62:db:24:78:6b:56:36:36:b2
6+
Signature Algorithm: sha256WithRSAEncryption
7+
Issuer: C=US, ST=California, O=Synadia, OU=nats.io, CN=Certificate Authority 2025-08-20
8+
Validity
9+
Not Before: Aug 20 18:42:01 2025 GMT
10+
Not After : Aug 18 18:42:01 2035 GMT
11+
Subject: C=US, ST=California, O=Synadia, OU=nats.io, CN=localhost
12+
Subject Public Key Info:
13+
Public Key Algorithm: rsaEncryption
14+
Public-Key: (2048 bit)
15+
Modulus:
16+
00:cf:e9:75:d4:83:e2:c6:24:06:b2:98:dd:da:ea:
17+
8f:84:e5:57:46:51:97:80:9e:cb:42:39:f7:3a:28:
18+
3a:8f:e8:16:bd:ec:77:f8:28:dd:0a:62:17:7f:66:
19+
a1:76:89:8b:f4:b1:35:b8:7a:c3:d8:9d:a0:32:38:
20+
f4:bc:be:ad:66:95:b1:7b:af:f4:5b:b4:51:9f:79:
21+
c6:0e:9f:dd:56:1a:a2:5d:d8:35:d2:81:64:d1:ef:
22+
20:19:90:e2:a5:13:be:a9:a8:5e:41:75:88:eb:dc:
23+
50:8b:36:f8:05:8c:89:62:2b:24:37:98:49:c6:4c:
24+
e3:fc:e4:1b:92:37:67:fb:12:47:fd:29:4b:08:5c:
25+
11:e2:aa:23:c2:9b:e4:c2:fa:f1:4f:12:73:8b:7b:
26+
0a:64:53:19:aa:a0:35:67:ab:b7:4e:f8:fb:3c:07:
27+
ba:62:e4:d2:67:b1:17:e1:9b:e4:95:5d:3e:5e:55:
28+
b3:af:94:9e:f3:2d:e8:85:ba:1f:d2:25:c6:4c:e0:
29+
9d:e4:17:87:7f:a8:35:26:47:1e:14:12:dd:19:9f:
30+
b1:17:79:97:8a:a1:c4:18:b7:7e:5a:4c:96:fb:36:
31+
70:d1:81:5a:dc:72:e1:f3:83:6c:5e:a8:18:d6:d0:
32+
86:43:bf:f4:e9:ef:a7:78:a1:78:56:47:8e:b7:32:
33+
74:5b
34+
Exponent: 65537 (0x10001)
35+
X509v3 extensions:
36+
X509v3 Basic Constraints:
37+
CA:FALSE
38+
Netscape Comment:
39+
nats.io nats-server test-suite certificate
40+
X509v3 Subject Key Identifier:
41+
F2:EE:0B:2B:52:66:45:42:BD:09:33:CA:33:53:41:03:09:40:35:62
42+
X509v3 Authority Key Identifier:
43+
keyid:B0:0C:09:95:EA:15:3F:23:8E:EA:BC:4C:80:F6:12:39:3A:56:7B:28
44+
DirName:/C=US/ST=California/O=Synadia/OU=nats.io/CN=Certificate Authority 2025-08-20
45+
serial:36:AB:D8:B1:2D:CD:91:24:02:FC:59:ED:15:C5:0B:E6:B0:5F:12:CF
46+
X509v3 Subject Alternative Name:
47+
DNS:localhost, IP Address:127.0.0.1, IP Address:0:0:0:0:0:0:0:1, email:[email protected]
48+
Netscape Cert Type:
49+
SSL Client
50+
X509v3 Key Usage:
51+
Digital Signature, Key Encipherment
52+
X509v3 Extended Key Usage:
53+
TLS Web Client Authentication
54+
Signature Algorithm: sha256WithRSAEncryption
55+
Signature Value:
56+
10:4b:23:c2:8f:34:33:09:b6:0f:65:2d:45:e1:06:eb:65:85:
57+
e2:ff:b2:51:07:40:cb:2d:80:46:09:fc:5c:de:d3:0f:1e:2b:
58+
5f:b0:95:3e:d0:cf:37:d6:53:ce:64:3f:3c:06:81:24:af:44:
59+
b2:6c:8a:c9:53:08:d7:8a:23:4a:03:7e:56:07:42:1b:57:8b:
60+
19:20:8a:e4:2a:53:39:e6:db:39:9f:47:e5:dd:fc:29:65:4c:
61+
19:0e:79:0b:8c:d2:99:f5:31:14:67:72:1a:14:0f:8c:2c:c7:
62+
7a:b8:e1:c1:5d:32:e8:84:34:0c:2e:7b:a8:0f:38:79:c3:18:
63+
2c:47:7f:9f:db:7a:12:7b:ae:e5:70:aa:8b:90:17:e4:c6:ba:
64+
84:ab:93:ec:9e:28:1f:00:3a:8d:d1:ed:83:37:2f:e8:66:1f:
65+
c0:ba:9f:35:d3:81:3e:fd:86:6e:65:b7:6d:76:b5:51:d2:09:
66+
8a:5f:fb:23:61:c3:74:3b:5e:4b:48:73:aa:06:78:62:77:4c:
67+
61:23:2b:a2:64:74:6c:f0:3f:7c:ae:b9:5b:27:5f:58:40:8f:
68+
8a:73:5f:bf:2a:02:71:7c:14:23:9a:b3:4b:74:06:fd:f8:46:
69+
b7:55:7c:87:b2:e3:d6:da:0e:9a:ec:87:0b:34:64:ec:ab:ff:
70+
2d:92:44:86
71+
-----BEGIN CERTIFICATE-----
72+
MIIE5jCCA86gAwIBAgIUJQbF0MNBdNMEhbBi2yR4a1Y2NrIwDQYJKoZIhvcNAQEL
73+
BQAwcTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExEDAOBgNVBAoM
74+
B1N5bmFkaWExEDAOBgNVBAsMB25hdHMuaW8xKTAnBgNVBAMMIENlcnRpZmljYXRl
75+
IEF1dGhvcml0eSAyMDI1LTA4LTIwMB4XDTI1MDgyMDE4NDIwMVoXDTM1MDgxODE4
76+
NDIwMVowWjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExEDAOBgNV
77+
BAoMB1N5bmFkaWExEDAOBgNVBAsMB25hdHMuaW8xEjAQBgNVBAMMCWxvY2FsaG9z
78+
dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM/pddSD4sYkBrKY3drq
79+
j4TlV0ZRl4Cey0I59zooOo/oFr3sd/go3QpiF39moXaJi/SxNbh6w9idoDI49Ly+
80+
rWaVsXuv9Fu0UZ95xg6f3VYaol3YNdKBZNHvIBmQ4qUTvqmoXkF1iOvcUIs2+AWM
81+
iWIrJDeYScZM4/zkG5I3Z/sSR/0pSwhcEeKqI8Kb5ML68U8Sc4t7CmRTGaqgNWer
82+
t074+zwHumLk0mexF+Gb5JVdPl5Vs6+UnvMt6IW6H9IlxkzgneQXh3+oNSZHHhQS
83+
3RmfsRd5l4qhxBi3flpMlvs2cNGBWtxy4fODbF6oGNbQhkO/9Onvp3iheFZHjrcy
84+
dFsCAwEAAaOCAYswggGHMAkGA1UdEwQCMAAwOQYJYIZIAYb4QgENBCwWKm5hdHMu
85+
aW8gbmF0cy1zZXJ2ZXIgdGVzdC1zdWl0ZSBjZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQU
86+
8u4LK1JmRUK9CTPKM1NBAwlANWIwga4GA1UdIwSBpjCBo4AUsAwJleoVPyOO6rxM
87+
gPYSOTpWeyihdaRzMHExCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlh
88+
MRAwDgYDVQQKDAdTeW5hZGlhMRAwDgYDVQQLDAduYXRzLmlvMSkwJwYDVQQDDCBD
89+
ZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAyNS0wOC0yMIIUNqvYsS3NkSQC/FntFcUL
90+
5rBfEs8wOgYDVR0RBDMwMYIJbG9jYWxob3N0hwR/AAABhxAAAAAAAAAAAAAAAAAA
91+
AAABgQxpdmFuQG5hdHMuaW8wEQYJYIZIAYb4QgEBBAQDAgeAMAsGA1UdDwQEAwIF
92+
oDATBgNVHSUEDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAEEsjwo80
93+
Mwm2D2UtReEG62WF4v+yUQdAyy2ARgn8XN7TDx4rX7CVPtDPN9ZTzmQ/PAaBJK9E
94+
smyKyVMI14ojSgN+VgdCG1eLGSCK5CpTOebbOZ9H5d38KWVMGQ55C4zSmfUxFGdy
95+
GhQPjCzHerjhwV0y6IQ0DC57qA84ecMYLEd/n9t6Enuu5XCqi5AX5Ma6hKuT7J4o
96+
HwA6jdHtgzcv6GYfwLqfNdOBPv2GbmW3bXa1UdIJil/7I2HDdDteS0hzqgZ4YndM
97+
YSMromR0bPA/fK65WydfWECPinNfvyoCcXwUI5qzS3QG/fhGt1V8h7Lj1toOmuyH
98+
CzRk7Kv/LZJEhg==
99+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)