Skip to content

Commit 817a220

Browse files
authored
feature: add ssl_trusted_certificate argument for ssl.verify_client().
1 parent 1ea604b commit 817a220

15 files changed

+582
-12
lines changed

lib/ngx/ssl.lua

+5-4
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ if subsystem == 'http' then
100100
void ngx_http_lua_ffi_free_priv_key(void *cdata);
101101

102102
int ngx_http_lua_ffi_ssl_verify_client(void *r,
103-
void *cdata, int depth, char **err);
103+
void *client_certs, void *trusted_certs, int depth, char **err);
104104

105105
int ngx_http_lua_ffi_ssl_client_random(ngx_http_request_t *r,
106106
const unsigned char *out, size_t *outlen, char **err);
@@ -198,7 +198,7 @@ elseif subsystem == 'stream' then
198198
void ngx_stream_lua_ffi_free_priv_key(void *cdata);
199199

200200
int ngx_stream_lua_ffi_ssl_verify_client(void *r,
201-
void *cdata, int depth, char **err);
201+
void *client_certs, void *trusted_certs, int depth, char **err);
202202

203203
int ngx_stream_lua_ffi_ssl_client_random(ngx_stream_lua_request_t *r,
204204
unsigned char *out, size_t *outlen, char **err);
@@ -484,7 +484,7 @@ function _M.set_priv_key(priv_key)
484484
end
485485

486486

487-
function _M.verify_client(ca_certs, depth)
487+
function _M.verify_client(client_certs, depth, trusted_certs)
488488
local r = get_request()
489489
if not r then
490490
error("no request found")
@@ -494,7 +494,8 @@ function _M.verify_client(ca_certs, depth)
494494
depth = -1
495495
end
496496

497-
local rc = ngx_lua_ffi_ssl_verify_client(r, ca_certs, depth, errmsg)
497+
local rc = ngx_lua_ffi_ssl_verify_client(r, client_certs, trusted_certs,
498+
depth, errmsg)
498499
if rc == FFI_OK then
499500
return true
500501
end

lib/ngx/ssl.md

+8-5
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ Table of Contents
1919
* [server_name](#server_name)
2020
* [server_port](#server_port)
2121
* [raw_server_addr](#raw_server_addr)
22+
* [export_keying_material](#export_keying_material)
23+
* [export_keying_material_early](#export_keying_material_early)
2224
* [raw_client_addr](#raw_client_addr)
2325
* [get_tls1_version](#get_tls1_version)
2426
* [get_tls1_version_str](#get_tls1_version_str)
@@ -30,8 +32,6 @@ Table of Contents
3032
* [set_priv_key](#set_priv_key)
3133
* [verify_client](#verify_client)
3234
* [get_client_random](#get_client_random)
33-
* [export_keying_material](#export_keying_material)
34-
* [export_keying_material_early](#export_keying_material_early)
3535
* [get_req_ssl_pointer](#get_req_ssl_pointer)
3636
* [Community](#community)
3737
* [English Mailing List](#english-mailing-list)
@@ -608,20 +608,23 @@ This function was first added in version `0.1.7`.
608608

609609
verify_client
610610
-------------
611-
**syntax:** *ok, err = ssl.verify_client(ca_certs?, depth?)*
611+
**syntax:** *ok, err = ssl.verify_client(client_certs?, depth?, trusted_certs?)*
612612

613613
**context:** *ssl_certificate_by_lua**
614614

615615
Requires a client certificate during TLS handshake.
616616

617-
The `ca_certs` is the CA certificate chain opaque pointer returned by the
617+
The `client_certs` is the CA certificate chain opaque pointer returned by the
618618
[parse_pem_cert](#parse_pem_cert) function for the current SSL connection.
619619
The list of certificates will be sent to clients. Also, they will be added to trusted store.
620620
If omitted, will not send any CA certificate to clients.
621621

622622
The `depth` is the verification depth in the client certificates chain.
623623
If omitted, will use the value specified by `ssl_verify_depth`.
624624

625+
The `trusted_certs` is same returned by the
626+
[parse_pem_cert](#parse_pem_cert) function. They will be added to trusted store.
627+
625628
Returns `true` on success, or a `nil` value and a string describing the error otherwise.
626629

627630
Note that TLS is not terminated when verification fails. You need to examine Nginx variable `$ssl_client_verify`
@@ -690,7 +693,7 @@ Bugs and Patches
690693
Please report bugs or submit patches by
691694

692695
1. creating a ticket on the [GitHub Issue Tracker](https://github.com/openresty/lua-resty-core/issues),
693-
1. or posting to the [OpenResty community](#community).
696+
2. or posting to the [OpenResty community](#community).
694697

695698
[Back to TOC](#table-of-contents)
696699

t/cert/mtls_ca.crt

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
Certificate:
2+
Data:
3+
Version: 3 (0x2)
4+
Serial Number:
5+
32:ed:21:56:d8:4e:aa:03:89:a9:4a:a4:e2:85:2d:8a:3b:2b:89:22
6+
Signature Algorithm: sha256WithRSAEncryption
7+
Issuer: C = US, ST = California, O = OpenResty, CN = OpenResty Testing Root CA
8+
Validity
9+
Not Before: Mar 13 15:49:00 2022 GMT
10+
Not After : Mar 8 15:49:00 2042 GMT
11+
Subject: C = US, ST = California, O = OpenResty, CN = OpenResty Testing Root CA
12+
Subject Public Key Info:
13+
Public Key Algorithm: rsaEncryption
14+
RSA Public-Key: (2048 bit)
15+
Modulus:
16+
00:e6:37:d2:c6:17:36:c7:b2:7f:7d:cf:d0:62:87:
17+
99:d9:21:b8:de:ff:d8:e2:3a:1c:68:90:8f:ce:17:
18+
68:22:b0:60:30:cc:29:e8:34:ee:ff:b2:25:de:6e:
19+
1a:d4:df:10:19:11:4b:40:61:d3:a9:4d:80:ed:97:
20+
81:4e:c5:74:e8:4d:63:e3:5f:21:bc:5a:6e:22:a0:
21+
17:91:c1:cb:25:53:9b:9d:4e:e1:51:5b:f6:52:e7:
22+
0a:27:f6:16:c2:31:cb:6c:47:f4:89:51:15:cc:06:
23+
be:31:3e:1c:ea:ee:81:9b:c4:97:96:fd:e5:1c:95:
24+
9e:c0:65:cd:a9:9a:cb:68:67:f2:62:a0:21:eb:5a:
25+
c5:a1:92:ed:32:41:28:f9:47:34:eb:44:ae:d6:e7:
26+
76:71:11:98:c9:2e:ce:6c:7c:10:1b:c7:4c:c3:14:
27+
89:4e:d9:4c:d9:c7:43:e9:3c:29:ca:62:a9:91:b3:
28+
87:e7:d7:b4:18:ab:65:f9:6b:ed:82:ca:a1:36:35:
29+
18:05:cb:5c:24:26:13:13:f8:99:ac:99:be:9b:a6:
30+
73:df:0d:16:95:b1:dc:be:fe:7a:c2:b6:dc:c8:93:
31+
cf:10:e0:29:03:0e:28:78:18:84:ee:14:92:ab:be:
32+
5a:a0:14:a2:4a:2f:d3:d0:b8:0e:00:d2:5a:cd:e4:
33+
bd:a1
34+
Exponent: 65537 (0x10001)
35+
X509v3 extensions:
36+
X509v3 Key Usage: critical
37+
Certificate Sign, CRL Sign
38+
X509v3 Basic Constraints: critical
39+
CA:TRUE
40+
X509v3 Subject Key Identifier:
41+
F0:D7:4B:14:73:E1:67:00:6B:54:B4:19:20:76:12:9F:9D:8E:C8:09
42+
Signature Algorithm: sha256WithRSAEncryption
43+
6d:52:21:6d:6e:8c:e5:4a:28:07:65:6d:d8:7c:23:2e:c6:c1:
44+
d0:ec:27:b3:b0:c3:d3:e8:fa:72:b9:de:32:4e:ff:97:8d:86:
45+
a9:6d:b3:a9:b4:2d:77:ca:28:97:6a:3d:7b:a2:15:ed:34:dc:
46+
72:9f:6f:e7:01:0c:d3:28:6a:80:1b:50:09:fd:d7:2c:d8:92:
47+
d5:10:c4:73:15:20:7d:99:dc:de:30:7b:3c:6e:e9:66:b2:0e:
48+
4e:1a:c1:51:57:6e:5b:b0:a9:f6:ff:0b:8f:07:67:31:40:5b:
49+
11:a9:06:d3:d3:76:c5:d2:56:95:9a:9e:4a:16:44:4b:32:e5:
50+
af:dd:4b:4d:5d:57:b8:85:69:36:93:2a:c6:0c:8f:e1:42:35:
51+
be:8e:f3:e7:35:d3:2c:3a:03:31:40:75:8e:e8:dd:57:35:20:
52+
5e:18:a9:76:ce:85:be:7e:3a:cf:6e:08:58:5b:47:d5:e9:c4:
53+
ec:0e:e9:8e:3c:2d:5c:7b:59:20:5b:24:92:a0:e0:1e:a3:5a:
54+
67:d8:ff:7f:a5:82:f1:df:db:05:65:79:88:b1:3c:e6:01:d1:
55+
5a:c7:d2:6e:9a:e6:a2:da:4a:c7:19:78:d9:14:71:6e:1f:70:
56+
f3:41:e5:b3:78:31:d5:22:0e:7c:1a:b2:43:d9:86:ff:53:ea:
57+
2b:ba:d2:27
58+
-----BEGIN CERTIFICATE-----
59+
MIIDhDCCAmygAwIBAgIUMu0hVthOqgOJqUqk4oUtijsriSIwDQYJKoZIhvcNAQEL
60+
BQAwWjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAoT
61+
CU9wZW5SZXN0eTEiMCAGA1UEAxMZT3BlblJlc3R5IFRlc3RpbmcgUm9vdCBDQTAe
62+
Fw0yMjAzMTMxNTQ5MDBaFw00MjAzMDgxNTQ5MDBaMFoxCzAJBgNVBAYTAlVTMRMw
63+
EQYDVQQIEwpDYWxpZm9ybmlhMRIwEAYDVQQKEwlPcGVuUmVzdHkxIjAgBgNVBAMT
64+
GU9wZW5SZXN0eSBUZXN0aW5nIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB
65+
DwAwggEKAoIBAQDmN9LGFzbHsn99z9Bih5nZIbje/9jiOhxokI/OF2gisGAwzCno
66+
NO7/siXebhrU3xAZEUtAYdOpTYDtl4FOxXToTWPjXyG8Wm4ioBeRwcslU5udTuFR
67+
W/ZS5won9hbCMctsR/SJURXMBr4xPhzq7oGbxJeW/eUclZ7AZc2pmstoZ/JioCHr
68+
WsWhku0yQSj5RzTrRK7W53ZxEZjJLs5sfBAbx0zDFIlO2UzZx0PpPCnKYqmRs4fn
69+
17QYq2X5a+2CyqE2NRgFy1wkJhMT+Jmsmb6bpnPfDRaVsdy+/nrCttzIk88Q4CkD
70+
Dih4GITuFJKrvlqgFKJKL9PQuA4A0lrN5L2hAgMBAAGjQjBAMA4GA1UdDwEB/wQE
71+
AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTw10sUc+FnAGtUtBkgdhKf
72+
nY7ICTANBgkqhkiG9w0BAQsFAAOCAQEAbVIhbW6M5UooB2Vt2HwjLsbB0Owns7DD
73+
0+j6crneMk7/l42GqW2zqbQtd8ool2o9e6IV7TTccp9v5wEM0yhqgBtQCf3XLNiS
74+
1RDEcxUgfZnc3jB7PG7pZrIOThrBUVduW7Cp9v8LjwdnMUBbEakG09N2xdJWlZqe
75+
ShZESzLlr91LTV1XuIVpNpMqxgyP4UI1vo7z5zXTLDoDMUB1jujdVzUgXhipds6F
76+
vn46z24IWFtH1enE7A7pjjwtXHtZIFskkqDgHqNaZ9j/f6WC8d/bBWV5iLE85gHR
77+
WsfSbprmotpKxxl42RRxbh9w80Hls3gx1SIOfBqyQ9mG/1PqK7rSJw==
78+
-----END CERTIFICATE-----

t/cert/mtls_ca.key

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpAIBAAKCAQEA5jfSxhc2x7J/fc/QYoeZ2SG43v/Y4jocaJCPzhdoIrBgMMwp
3+
6DTu/7Il3m4a1N8QGRFLQGHTqU2A7ZeBTsV06E1j418hvFpuIqAXkcHLJVObnU7h
4+
UVv2UucKJ/YWwjHLbEf0iVEVzAa+MT4c6u6Bm8SXlv3lHJWewGXNqZrLaGfyYqAh
5+
61rFoZLtMkEo+Uc060Su1ud2cRGYyS7ObHwQG8dMwxSJTtlM2cdD6TwpymKpkbOH
6+
59e0GKtl+WvtgsqhNjUYBctcJCYTE/iZrJm+m6Zz3w0WlbHcvv56wrbcyJPPEOAp
7+
Aw4oeBiE7hSSq75aoBSiSi/T0LgOANJazeS9oQIDAQABAoIBAQDhH9+uNE8uUv/X
8+
MNvvLfklWpOlBf25o+fZ3NuzRjJgEafOsCee2fyI8FWVwIfeeE8OpFm5GLDZk1+r
9+
dwdM10xuSheO5Z1gyfF/TJwfvamA09SNrPArFkm3YhUNZNl2hykMtwSLL06oWEOu
10+
dbXjit4VS9aNIbTlEe7O5/6Ih0W3zmr1yvUua2swmAZMx3GFA4kbjZZ9vDs27sdu
11+
K+VY3DYRbq1HkiNFT0otfke5bObFBCG7Yp8JLyhYaIkGYFoBXuZ6JNY8EuU2+YyP
12+
6r40tJ7StR1Q6eZJh9/1leaYGZLCh5oFyKpilTuxHbRbr5A28RJKjKvPsdDgTtQn
13+
yHGg70FRAoGBAOhC3TQlFcT2WCCZHHql9JEEHnHVBWnL3Jg7VJuL1i6pEIz7qQkW
14+
AtBEIY/nnTcVNfJ6eXznYtutYvvRSgQTUsBNRoj3s1z9wKOo4uw4LoIUXDEmHCr+
15+
49DiQyIO21SNMHA+dVxvGRDDjLI9Uc+Scb64QOodoX75HLRZG++24mtdAoGBAP2/
16+
gCjga2p8Jx9UnhIcrEIIGANyxEQeBdhF56Nt9CJy/Iwi3a6qQ/GkbeoDm5FhXnXo
17+
xcBaHyv2lwi4uO/hONY8eRnYxAWMwAKMZe6VnU1hWI2Ytkh+OcMPMh7NIGQf6X1o
18+
JZrBtnTms060TuuDjLeIlaubDR/xDrMWTMKjKbsVAoGAVLuYAZ8J6xpIGlRhbGlA
19+
6OrMxJCHcgpahvsWKc0BLXKmRBjHmTX7fslsSRihZWgKj1SZH7U2fpgpxV6cFxKJ
20+
nPhUJEHhoKo+bjZ92tnANdqBq7iQjCsDJ8Bz52fuIlGD+1795+PsDA6bNKdkQkrV
21+
zlNf80kuEqmFDFJ5+6EHx00CgYAf+jkpbZa71aeMgDpnZ+uhaqm0DYuEVhBAgBa/
22+
9sRUbw86jc5IC7cCRcmAOzIosQ+ZZls9cV4KSUohVD4iJMzn2rkcM8AIPwOXjp/t
23+
4DbxoHnrZjpaimW3Gjwju5AAbjEbl7tddFoNA2HHYlurvGlIW9MYzDJsOxGyKfZE
24+
dRF2PQKBgQDUKNHgDYEjLJ99S5Fm5zN/64bKzzDtktGdqOxik5pBKcs/BvOdLM0i
25+
eCjGz/3qrEoenFIBwF/IRz3ug90Zr8bWOu6DudReflAKI/N13dZ2gOTAfaX4ljJF
26+
w0ohSi6xs+mu1GmtipGtNxHi/J3na2BeSnSRFSUg6Zd+oh8BZQKmNg==
27+
-----END RSA PRIVATE KEY-----

t/cert/mtls_cert_gen/.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
*.pem
2+
*.csr
3+
cfssl
4+
cfssljson

t/cert/mtls_cert_gen/generate.sh

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/bin/bash
2+
3+
rm *.pem *.csr cfssl cfssljson
4+
5+
wget -O cfssl https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl_1.6.1_linux_amd64
6+
wget -O cfssljson https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_linux_amd64
7+
chmod +x cfssl cfssljson
8+
9+
./cfssl gencert -initca -config profile.json mtls_ca.json | ./cfssljson -bare mtls_ca
10+
11+
./cfssl gencert -ca mtls_ca.pem -ca-key mtls_ca-key.pem -config profile.json -profile=client mtls_client.json | ./cfssljson -bare mtls_client
12+
./cfssl gencert -ca mtls_ca.pem -ca-key mtls_ca-key.pem -config profile.json -profile=server mtls_server.json | ./cfssljson -bare mtls_server
13+
14+
openssl x509 -in mtls_ca.pem -text > ../mtls_ca.crt
15+
mv mtls_ca-key.pem ../mtls_ca.key
16+
17+
openssl x509 -in mtls_client.pem -text > ../mtls_client.crt
18+
mv mtls_client-key.pem ../mtls_client.key
19+
20+
openssl x509 -in mtls_server.pem -text > ../mtls_server.crt
21+
mv mtls_server-key.pem ../mtls_server.key
22+
23+
rm *.pem *.csr cfssl cfssljson

t/cert/mtls_cert_gen/mtls_ca.json

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"CA": {
3+
"expiry": "175200h",
4+
"pathlen": 0
5+
},
6+
"CN": "OpenResty Testing Root CA",
7+
"key": {
8+
"algo": "rsa",
9+
"size": 2048
10+
},
11+
"names": [
12+
{
13+
"C": "US",
14+
"O": "OpenResty",
15+
"ST": "California"
16+
}
17+
]
18+
}

t/cert/mtls_cert_gen/mtls_client.json

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
3+
"key": {
4+
"algo": "rsa",
5+
"size": 2048
6+
},
7+
"names": [
8+
{
9+
"C": "US",
10+
"O": "OpenResty",
11+
"ST": "California"
12+
}
13+
],
14+
"hosts": [
15+
16+
17+
]
18+
}

t/cert/mtls_cert_gen/mtls_server.json

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"CN": "example.com",
3+
"key": {
4+
"algo": "rsa",
5+
"size": 2048
6+
},
7+
"names": [
8+
{
9+
"C": "US",
10+
"O": "OpenResty",
11+
"ST": "California"
12+
}
13+
],
14+
"hosts": [
15+
"example.com"
16+
]
17+
}

t/cert/mtls_cert_gen/profile.json

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"signing": {
3+
"default": {
4+
"expiry": "175200h"
5+
},
6+
"profiles": {
7+
"server": {
8+
"usages": [
9+
"signing",
10+
"digital signing",
11+
"key encipherment",
12+
"server auth"
13+
],
14+
"expiry": "175199h"
15+
},
16+
"client": {
17+
"usages": [
18+
"signing",
19+
"digital signature",
20+
"key encipherment",
21+
"client auth"
22+
],
23+
"expiry": "175199h"
24+
}
25+
}
26+
}
27+
}

t/cert/mtls_client.crt

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
Certificate:
2+
Data:
3+
Version: 3 (0x2)
4+
Serial Number:
5+
19:0a:a3:a8:9c:d4:0f:dc:c6:fa:23:7b:f8:fc:bd:f4:73:4e:7e:b1
6+
Signature Algorithm: sha256WithRSAEncryption
7+
Issuer: C = US, ST = California, O = OpenResty, CN = OpenResty Testing Root CA
8+
Validity
9+
Not Before: Mar 13 15:49:00 2022 GMT
10+
Not After : Mar 8 14:49:00 2042 GMT
11+
Subject: C = US, ST = California, O = OpenResty, CN = [email protected]
12+
Subject Public Key Info:
13+
Public Key Algorithm: rsaEncryption
14+
RSA Public-Key: (2048 bit)
15+
Modulus:
16+
00:be:5b:09:4c:94:71:d3:82:54:4a:42:6a:76:aa:
17+
34:5d:28:d9:45:e6:44:9a:74:9f:a6:e6:78:49:9e:
18+
c6:20:75:32:5f:92:3b:ec:6e:4b:7b:b0:75:1c:75:
19+
09:00:05:77:d6:59:ca:55:5b:13:b6:76:3a:c6:18:
20+
dc:37:6a:20:93:e6:26:56:5d:0b:96:8c:01:f2:96:
21+
38:08:08:36:a2:64:12:21:a0:8d:48:cd:9a:26:78:
22+
92:29:b6:63:eb:14:d9:b6:e5:87:f7:d5:55:a4:cc:
23+
53:1c:a3:7c:b8:bd:ad:7c:a4:d4:86:1f:a7:1c:43:
24+
c5:1a:b5:f1:03:bd:fe:19:98:1d:b7:13:2b:93:a2:
25+
2a:0e:21:7e:42:a9:bb:28:69:49:59:e7:89:0e:7d:
26+
5a:ce:fb:d4:0c:20:6a:e1:db:b2:6a:e5:a7:55:e0:
27+
d0:58:4a:e2:08:78:82:b9:06:0c:65:f9:24:06:e6:
28+
8a:13:b2:9a:ef:1b:4a:b2:3a:b4:98:7f:dd:3c:0e:
29+
85:0b:a6:c6:47:2f:63:c2:73:52:41:db:7c:06:c3:
30+
2a:b5:2d:d1:e1:30:d5:c4:79:c9:b9:35:68:46:ad:
31+
c4:45:57:ea:11:88:27:37:ed:ac:49:2d:c4:d6:c6:
32+
a6:74:8d:d3:bc:e0:d9:69:25:0c:0c:b0:e3:b7:cb:
33+
8d:99
34+
Exponent: 65537 (0x10001)
35+
X509v3 extensions:
36+
X509v3 Key Usage: critical
37+
Digital Signature, Key Encipherment
38+
X509v3 Extended Key Usage:
39+
TLS Web Client Authentication
40+
X509v3 Basic Constraints: critical
41+
CA:FALSE
42+
X509v3 Subject Key Identifier:
43+
22:70:5E:30:8C:4D:66:39:E7:60:C9:29:A2:ED:95:32:34:63:5C:C0
44+
X509v3 Authority Key Identifier:
45+
keyid:F0:D7:4B:14:73:E1:67:00:6B:54:B4:19:20:76:12:9F:9D:8E:C8:09
46+
47+
X509v3 Subject Alternative Name:
48+
49+
Signature Algorithm: sha256WithRSAEncryption
50+
96:e7:2a:fc:2a:56:16:80:e2:d3:79:0c:46:db:c3:88:ab:d3:
51+
ef:39:66:4b:a9:ab:6c:0e:30:08:07:7c:fc:03:6c:f7:dd:fb:
52+
3e:a8:c8:68:28:ab:4e:73:97:80:27:5d:c5:9d:52:00:aa:08:
53+
25:c8:f9:dc:df:64:73:a4:58:5b:bd:5f:1a:53:a4:33:a3:b1:
54+
45:38:2d:be:d7:f3:a4:c4:f4:7a:07:71:44:f1:a2:65:02:e4:
55+
71:84:01:b5:83:4b:de:83:b5:ad:ac:b9:3c:17:42:0c:9a:7d:
56+
eb:7f:ab:26:dd:9b:3a:fd:95:37:55:cc:01:c3:3f:20:df:e5:
57+
ed:49:51:7a:42:ea:f3:8a:3f:da:6e:c1:1a:11:b9:45:4d:6e:
58+
c9:21:f4:e3:4f:31:72:5b:bb:01:92:b6:7f:f1:8a:9e:6c:d0:
59+
7f:96:d7:eb:29:09:53:38:26:41:00:f2:33:04:77:bd:a9:ee:
60+
60:9e:06:b7:7d:26:ae:1c:4f:56:bd:a5:b6:50:40:be:be:84:
61+
2a:54:21:59:47:7d:a5:1e:63:6d:28:36:4d:a6:e4:62:69:9b:
62+
9b:fa:2b:48:e8:64:d7:14:f4:62:a2:26:17:a5:05:58:4a:38:
63+
d2:44:e7:33:90:b9:c1:8c:85:02:99:b8:03:1a:03:d2:cf:ac:
64+
a5:6b:44:98
65+
-----BEGIN CERTIFICATE-----
66+
MIID3DCCAsSgAwIBAgIUGQqjqJzUD9zG+iN7+Py99HNOfrEwDQYJKoZIhvcNAQEL
67+
BQAwWjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAoT
68+
CU9wZW5SZXN0eTEiMCAGA1UEAxMZT3BlblJlc3R5IFRlc3RpbmcgUm9vdCBDQTAe
69+
Fw0yMjAzMTMxNTQ5MDBaFw00MjAzMDgxNDQ5MDBaMFAxCzAJBgNVBAYTAlVTMRMw
70+
EQYDVQQIEwpDYWxpZm9ybmlhMRIwEAYDVQQKEwlPcGVuUmVzdHkxGDAWBgNVBAMM
71+
D2Zvb0BleGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
72+
AL5bCUyUcdOCVEpCanaqNF0o2UXmRJp0n6bmeEmexiB1Ml+SO+xuS3uwdRx1CQAF
73+
d9ZZylVbE7Z2OsYY3DdqIJPmJlZdC5aMAfKWOAgINqJkEiGgjUjNmiZ4kim2Y+sU
74+
2bblh/fVVaTMUxyjfLi9rXyk1IYfpxxDxRq18QO9/hmYHbcTK5OiKg4hfkKpuyhp
75+
SVnniQ59Ws771AwgauHbsmrlp1Xg0FhK4gh4grkGDGX5JAbmihOymu8bSrI6tJh/
76+
3TwOhQumxkcvY8JzUkHbfAbDKrUt0eEw1cR5ybk1aEatxEVX6hGIJzftrEktxNbG
77+
pnSN07zg2WklDAyw47fLjZkCAwEAAaOBozCBoDAOBgNVHQ8BAf8EBAMCBaAwEwYD
78+
VR0lBAwwCgYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUInBeMIxN
79+
ZjnnYMkpou2VMjRjXMAwHwYDVR0jBBgwFoAU8NdLFHPhZwBrVLQZIHYSn52OyAkw
80+
KwYDVR0RBCQwIoEPZm9vQGV4YW1wbGUuY29tgQ9iYXJAZXhhbXBsZS5jb20wDQYJ
81+
KoZIhvcNAQELBQADggEBAJbnKvwqVhaA4tN5DEbbw4ir0+85Zkupq2wOMAgHfPwD
82+
bPfd+z6oyGgoq05zl4AnXcWdUgCqCCXI+dzfZHOkWFu9XxpTpDOjsUU4Lb7X86TE
83+
9HoHcUTxomUC5HGEAbWDS96Dta2suTwXQgyafet/qybdmzr9lTdVzAHDPyDf5e1J
84+
UXpC6vOKP9puwRoRuUVNbskh9ONPMXJbuwGStn/xip5s0H+W1+spCVM4JkEA8jME
85+
d72p7mCeBrd9Jq4cT1a9pbZQQL6+hCpUIVlHfaUeY20oNk2m5GJpm5v6K0joZNcU
86+
9GKiJhelBVhKONJE5zOQucGMhQKZuAMaA9LPrKVrRJg=
87+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)