Skip to content

Commit c024979

Browse files
reykrusscam
authored andcommitted
Add Certificate newtype that supports CA chains. (#101)
This commit adds a Certificate type to the library that supports a certificate chain in PEM encoded format. Fixes #100 (cherry picked from commit 041d5f6)
1 parent b94866e commit c024979

File tree

4 files changed

+399
-5
lines changed

4 files changed

+399
-5
lines changed

.ci/certs/ca-chain.crt

Lines changed: 282 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,282 @@
1+
Certificate:
2+
Data:
3+
Version: 3 (0x2)
4+
Serial Number:
5+
6c:5d:e3:ad:35:0d:d0:82:44:26:a8:72:b9:b9:79:e9
6+
Signature Algorithm: sha256WithRSAEncryption
7+
Issuer: O=example.net, CN=example.net Root Certification Authority
8+
Validity
9+
Not Before: May 27 00:00:00 2020 GMT
10+
Not After : May 29 00:00:00 2030 GMT
11+
Subject: O=example.net, CN=example.net Root Certification Authority
12+
Subject Public Key Info:
13+
Public Key Algorithm: rsaEncryption
14+
RSA Public-Key: (4096 bit)
15+
Modulus:
16+
00:ab:98:8e:31:6d:40:44:aa:f4:68:23:37:3f:de:
17+
b4:6d:bc:7d:12:f3:de:50:92:01:10:fe:02:cd:90:
18+
24:01:08:47:ef:1b:f6:8e:28:cd:54:d3:0d:5c:12:
19+
16:ee:d6:60:06:d0:19:b3:35:db:09:3d:82:5f:0a:
20+
20:9f:f3:cd:c6:cc:53:38:be:24:cf:81:d1:d7:bd:
21+
23:d3:b6:4d:64:74:17:0e:bd:d7:75:af:78:44:6d:
22+
f6:af:05:62:a0:1a:aa:72:de:9d:4b:2b:0f:8e:b4:
23+
10:28:52:ca:07:7e:8e:fa:6a:f3:91:87:3d:d4:61:
24+
4a:2e:ba:fe:f3:d6:74:37:d7:5c:50:45:f4:70:a7:
25+
71:e6:5b:e0:3a:3a:a1:f8:cf:fe:ea:4b:c5:f6:ff:
26+
71:88:07:78:79:2b:b0:c7:96:48:02:3b:ee:35:34:
27+
02:96:f3:7e:e3:61:14:26:00:44:93:53:23:22:5f:
28+
3d:7d:e4:0c:92:28:8d:ad:74:dd:5f:1a:17:80:32:
29+
12:62:cf:51:48:54:c5:8a:8f:a4:20:c5:3c:c1:7b:
30+
11:16:84:11:67:91:2d:b3:01:e7:09:43:6e:06:9f:
31+
ff:3d:56:35:90:f2:ea:c1:12:5f:81:d7:b5:02:62:
32+
16:33:3c:97:97:3c:74:bd:43:59:35:97:af:30:77:
33+
bd:2f:52:ee:86:eb:a0:ce:0c:a3:1d:63:31:39:5f:
34+
de:8c:cc:a4:f8:59:fe:0b:de:0f:37:6d:1e:e3:ff:
35+
25:34:64:27:78:15:93:d7:57:a1:cc:16:d2:6c:bf:
36+
9f:e3:d2:ee:91:2d:56:7b:62:69:d4:51:0d:18:59:
37+
de:79:e7:fb:66:c8:de:8f:fa:ae:d7:64:8a:02:1f:
38+
dd:01:55:c8:95:dd:ae:21:07:f4:c1:89:d6:98:9e:
39+
d8:c7:bf:b3:ae:1b:59:64:ea:a4:72:ce:a0:ed:d8:
40+
2d:01:b4:58:a9:6b:9c:c7:83:72:20:91:10:87:07:
41+
e9:43:9b:6f:b8:70:1e:25:82:f7:83:dc:52:20:99:
42+
7e:e8:42:ab:83:65:33:27:1a:a9:0a:99:20:0b:4e:
43+
a9:f9:10:65:b3:9a:4a:e0:4a:38:23:9f:14:85:a2:
44+
90:ed:9f:9f:fc:5d:70:de:6f:86:b9:6b:f4:00:9c:
45+
ae:2d:9f:f4:49:31:01:0d:83:21:6f:0e:76:68:19:
46+
f1:46:c9:97:3b:9b:57:0c:a3:07:99:a0:b5:54:6b:
47+
b2:b6:a8:9f:2a:76:18:c0:43:f5:9d:fe:12:4a:06:
48+
39:f2:f9:6f:57:27:31:7f:75:5f:8e:ac:a6:5b:28:
49+
a0:b6:5e:f3:dd:9a:1c:8c:a9:2a:15:61:66:7c:b5:
50+
3c:41:f1
51+
Exponent: 65537 (0x10001)
52+
X509v3 extensions:
53+
X509v3 Basic Constraints: critical
54+
CA:TRUE
55+
X509v3 Key Usage: critical
56+
Certificate Sign, CRL Sign
57+
X509v3 Name Constraints: critical
58+
Permitted:
59+
DNS:example.net
60+
DNS:example.org
61+
DNS:lan
62+
DNS:onion
63+
email:example.net
64+
email:example.org
65+
66+
X509v3 Subject Key Identifier:
67+
8F:9F:67:C9:61:A8:E2:A3:A1:F9:10:D3:EA:B1:6E:9D:0F:B3:E6:99
68+
X509v3 Subject Alternative Name:
69+
URI:http://ca.example.net/, email:[email protected]
70+
X509v3 Authority Key Identifier:
71+
keyid:8F:9F:67:C9:61:A8:E2:A3:A1:F9:10:D3:EA:B1:6E:9D:0F:B3:E6:99
72+
73+
X509v3 Issuer Alternative Name:
74+
URI:http://ca.example.net/, email:[email protected]
75+
Authority Information Access:
76+
CA Issuers - URI:http://ca.example.net/certs/example.net_Root_Certification_Authority.cert.pem
77+
78+
X509v3 CRL Distribution Points:
79+
80+
Full Name:
81+
URI:http://ca.example.net/crl/example.net_Root_Certification_Authority.crl
82+
83+
Signature Algorithm: sha256WithRSAEncryption
84+
91:07:4a:5e:be:5f:ae:4d:f4:4b:ed:92:4f:94:a3:15:eb:0f:
85+
32:d7:f6:82:cc:56:18:4c:d7:09:82:7c:bc:28:45:d8:00:7f:
86+
65:0a:97:f4:ae:ef:a9:6d:d0:a3:dd:5d:0e:10:4e:37:a0:5c:
87+
73:0d:b0:d1:b0:ff:f4:e0:f3:8c:25:91:26:e1:2c:d5:24:cd:
88+
48:82:78:cc:96:a8:65:b3:fa:ca:01:c2:43:48:0a:f3:3e:c5:
89+
b5:3b:d3:22:a7:72:0f:87:21:c2:59:c9:c5:74:82:f4:9c:33:
90+
4e:bb:42:cb:12:09:b1:7d:3d:45:f1:a3:58:46:ec:50:4e:18:
91+
d7:09:5e:92:48:01:f9:e2:89:c9:69:8f:e6:c0:fd:17:43:3f:
92+
31:fc:a8:7f:f6:f0:8e:1a:60:03:a7:be:d8:f2:3a:f0:f2:38:
93+
41:c6:33:f1:ab:b0:d5:4f:ad:42:0d:6a:fe:e8:17:9a:52:bb:
94+
c9:fd:ca:5f:f0:72:82:1b:af:b8:a0:6e:a6:2a:ab:37:65:4c:
95+
aa:8f:a2:49:1f:6e:bf:6c:02:93:1c:61:e5:aa:f4:c3:43:c1:
96+
38:5e:94:57:3d:7c:70:cd:85:c8:d1:26:98:a2:1e:2f:9e:87:
97+
8c:a4:69:a4:21:e2:2c:dd:3e:91:93:f8:9d:24:72:d7:04:17:
98+
3a:e1:11:8e:a3:c9:33:46:83:ad:2e:f2:9c:89:da:d0:fc:ee:
99+
67:19:b0:bc:39:1e:4d:2b:57:74:9b:db:c1:39:99:a2:25:ed:
100+
7e:fa:bf:54:0d:04:a3:8d:e8:12:3b:87:7f:cc:04:72:e1:ff:
101+
74:ed:51:1c:c5:98:6d:b7:0c:2b:04:40:c5:16:6a:7e:b0:6b:
102+
28:e7:05:d8:3c:9c:b0:c5:68:c9:d4:a9:38:cf:24:42:f1:ad:
103+
9c:e2:52:e2:23:18:2d:3b:44:56:06:e7:1a:c6:f7:57:0f:5c:
104+
6b:60:e8:2b:fa:98:92:11:da:68:ad:6e:15:b7:f5:03:a8:54:
105+
9f:0e:09:e4:c1:7d:15:51:03:3b:ad:f5:1b:5d:ac:b2:93:16:
106+
4a:ac:35:4e:21:96:ec:f3:bb:87:e9:71:fa:b0:42:4e:cb:c4:
107+
17:84:c7:0e:24:a7:e8:7b:80:e5:f2:78:ac:3d:1d:e7:47:56:
108+
5e:03:67:5e:80:f8:23:84:0c:fe:ab:1b:0d:a3:01:4a:2c:6f:
109+
26:17:78:05:00:c9:14:03:b1:0a:87:ef:7f:36:e8:6b:f0:f7:
110+
9b:0f:93:78:6d:99:05:fb:16:2b:d5:38:aa:b3:9f:32:c9:b2:
111+
ab:af:94:8c:6b:ee:cd:18:f3:d4:43:81:96:0e:c0:00:33:68:
112+
8d:dd:f2:9d:4c:49:63:a4
113+
-----BEGIN CERTIFICATE-----
114+
MIIHGTCCBQGgAwIBAgIQbF3jrTUN0IJEJqhyubl56TANBgkqhkiG9w0BAQsFADBJ
115+
MRQwEgYDVQQKDAtleGFtcGxlLm5ldDExMC8GA1UEAwwoZXhhbXBsZS5uZXQgUm9v
116+
dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0yMDA1MjcwMDAwMDBaFw0zMDA1
117+
MjkwMDAwMDBaMEkxFDASBgNVBAoMC2V4YW1wbGUubmV0MTEwLwYDVQQDDChleGFt
118+
cGxlLm5ldCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG
119+
9w0BAQEFAAOCAg8AMIICCgKCAgEAq5iOMW1ARKr0aCM3P960bbx9EvPeUJIBEP4C
120+
zZAkAQhH7xv2jijNVNMNXBIW7tZgBtAZszXbCT2CXwogn/PNxsxTOL4kz4HR170j
121+
07ZNZHQXDr3Xda94RG32rwVioBqqct6dSysPjrQQKFLKB36O+mrzkYc91GFKLrr+
122+
89Z0N9dcUEX0cKdx5lvgOjqh+M/+6kvF9v9xiAd4eSuwx5ZIAjvuNTQClvN+42EU
123+
JgBEk1MjIl89feQMkiiNrXTdXxoXgDISYs9RSFTFio+kIMU8wXsRFoQRZ5EtswHn
124+
CUNuBp//PVY1kPLqwRJfgde1AmIWMzyXlzx0vUNZNZevMHe9L1LuhuugzgyjHWMx
125+
OV/ejMyk+Fn+C94PN20e4/8lNGQneBWT11ehzBbSbL+f49LukS1We2Jp1FENGFne
126+
eef7Zsjej/qu12SKAh/dAVXIld2uIQf0wYnWmJ7Yx7+zrhtZZOqkcs6g7dgtAbRY
127+
qWucx4NyIJEQhwfpQ5tvuHAeJYL3g9xSIJl+6EKrg2UzJxqpCpkgC06p+RBls5pK
128+
4Eo4I58UhaKQ7Z+f/F1w3m+GuWv0AJyuLZ/0STEBDYMhbw52aBnxRsmXO5tXDKMH
129+
maC1VGuytqifKnYYwEP1nf4SSgY58vlvVycxf3VfjqymWyigtl7z3ZocjKkqFWFm
130+
fLU8QfECAwEAAaOCAfswggH3MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
131+
AgEGMFoGA1UdHgEB/wRQME6gTDANggtleGFtcGxlLm5ldDANggtleGFtcGxlLm9y
132+
ZzAFggNsYW4wB4IFb25pb24wDYELZXhhbXBsZS5uZXQwDYELZXhhbXBsZS5vcmcw
133+
HQYDVR0OBBYEFI+fZ8lhqOKjofkQ0+qxbp0Ps+aZMDkGA1UdEQQyMDCGFmh0dHA6
134+
Ly9jYS5leGFtcGxlLm5ldC+BFmNlcnRtYXN0ZXJAZXhhbXBsZS5uZXQwHwYDVR0j
135+
BBgwFoAUj59nyWGo4qOh+RDT6rFunQ+z5pkwOQYDVR0SBDIwMIYWaHR0cDovL2Nh
136+
LmV4YW1wbGUubmV0L4EWY2VydG1hc3RlckBleGFtcGxlLm5ldDBpBggrBgEFBQcB
137+
AQRdMFswWQYIKwYBBQUHMAKGTWh0dHA6Ly9jYS5leGFtcGxlLm5ldC9jZXJ0cy9l
138+
eGFtcGxlLm5ldF9Sb290X0NlcnRpZmljYXRpb25fQXV0aG9yaXR5LmNlcnQucGVt
139+
MFcGA1UdHwRQME4wTKBKoEiGRmh0dHA6Ly9jYS5leGFtcGxlLm5ldC9jcmwvZXhh
140+
bXBsZS5uZXRfUm9vdF9DZXJ0aWZpY2F0aW9uX0F1dGhvcml0eS5jcmwwDQYJKoZI
141+
hvcNAQELBQADggIBAJEHSl6+X65N9Evtkk+UoxXrDzLX9oLMVhhM1wmCfLwoRdgA
142+
f2UKl/Su76lt0KPdXQ4QTjegXHMNsNGw//Tg84wlkSbhLNUkzUiCeMyWqGWz+soB
143+
wkNICvM+xbU70yKncg+HIcJZycV0gvScM067QssSCbF9PUXxo1hG7FBOGNcJXpJI
144+
Afniiclpj+bA/RdDPzH8qH/28I4aYAOnvtjyOvDyOEHGM/GrsNVPrUINav7oF5pS
145+
u8n9yl/wcoIbr7igbqYqqzdlTKqPokkfbr9sApMcYeWq9MNDwThelFc9fHDNhcjR
146+
JpiiHi+eh4ykaaQh4izdPpGT+J0kctcEFzrhEY6jyTNGg60u8pyJ2tD87mcZsLw5
147+
Hk0rV3Sb28E5maIl7X76v1QNBKON6BI7h3/MBHLh/3TtURzFmG23DCsEQMUWan6w
148+
ayjnBdg8nLDFaMnUqTjPJELxrZziUuIjGC07RFYG5xrG91cPXGtg6Cv6mJIR2mit
149+
bhW39QOoVJ8OCeTBfRVRAzut9RtdrLKTFkqsNU4hluzzu4fpcfqwQk7LxBeExw4k
150+
p+h7gOXyeKw9HedHVl4DZ16A+COEDP6rGw2jAUosbyYXeAUAyRQDsQqH73826Gvw
151+
95sPk3htmQX7FivVOKqznzLJsquvlIxr7s0Y89RDgZYOwAAzaI3d8p1MSWOk
152+
-----END CERTIFICATE-----
153+
Certificate:
154+
Data:
155+
Version: 3 (0x2)
156+
Serial Number:
157+
22:25:a5:48:fc:37:d9:89:32:b2:89:39:5c:3b:d5:bf
158+
Signature Algorithm: sha256WithRSAEncryption
159+
Issuer: O=example.net, CN=example.net Root Certification Authority
160+
Validity
161+
Not Before: May 27 00:00:00 2020 GMT
162+
Not After : May 28 00:00:00 2030 GMT
163+
Subject: O=example.net, CN=example.net Intermediate Certification Authority
164+
Subject Public Key Info:
165+
Public Key Algorithm: rsaEncryption
166+
RSA Public-Key: (3072 bit)
167+
Modulus:
168+
00:d9:bc:a5:da:88:9e:59:88:dc:95:13:c7:2e:8e:
169+
99:08:a1:14:68:a7:c8:b4:5e:6b:b9:17:19:e1:14:
170+
ce:ad:5a:7c:18:05:da:26:2c:be:6e:91:42:fd:cf:
171+
6f:40:f0:26:f2:3e:26:29:21:1f:21:9e:c5:ae:b6:
172+
95:69:13:a8:63:2c:d2:db:61:52:7f:d0:3f:ab:8a:
173+
14:f7:32:68:f2:5d:a1:d6:d9:da:6b:24:b7:c8:b6:
174+
a5:d6:09:23:63:ad:65:a8:00:4b:76:cd:8b:fd:6d:
175+
d0:63:54:ed:0a:2e:3a:b3:47:f7:c0:8e:1b:b0:82:
176+
72:74:1e:a6:25:4a:51:7f:55:75:0b:db:87:e8:19:
177+
bd:39:fd:fe:1a:92:e4:16:2d:44:d8:e2:1e:6c:50:
178+
a4:87:cf:61:a2:9e:d9:0d:da:7d:22:dc:06:ff:25:
179+
ca:35:cf:c8:57:b6:e5:97:c5:9d:05:09:81:8b:15:
180+
a1:c9:93:b9:d7:d5:41:2b:fe:e5:bb:ee:78:0d:c7:
181+
61:eb:d7:5c:99:15:0d:37:3c:9a:77:12:d4:74:d2:
182+
4b:cc:94:b0:9d:df:83:c1:66:78:6b:bc:e4:f0:de:
183+
46:ec:2b:bc:a1:d9:34:cb:1e:0d:fc:f1:e6:13:42:
184+
48:14:f6:af:6a:0f:e5:05:4c:63:0f:c6:a3:98:16:
185+
de:46:4f:5f:ea:d6:1b:ff:af:b5:e6:18:8b:f2:95:
186+
a2:de:25:46:cf:a4:0a:45:eb:59:a8:25:a1:84:6f:
187+
e0:35:0c:4c:d3:ff:20:03:32:ea:19:96:e8:75:f9:
188+
c2:96:f3:2b:e4:53:30:2c:84:35:29:c5:64:d4:ea:
189+
9e:f0:53:63:32:19:a0:03:ba:76:6d:ab:0c:08:0c:
190+
b6:a9:00:d1:80:9e:3d:33:16:ae:2c:03:d0:29:e3:
191+
af:0d:4a:d0:9f:69:e9:32:ad:d6:e5:90:61:f6:c9:
192+
f6:4e:b7:13:13:ad:d2:02:7a:a5:bb:3a:31:99:a8:
193+
23:e0:d2:32:24:51:3f:69:5a:57
194+
Exponent: 65537 (0x10001)
195+
X509v3 extensions:
196+
X509v3 Basic Constraints: critical
197+
CA:TRUE, pathlen:0
198+
X509v3 Key Usage: critical
199+
Certificate Sign, CRL Sign
200+
X509v3 Subject Key Identifier:
201+
A4:E9:55:7D:E8:F6:BA:A2:6B:71:92:87:C1:98:85:67:AD:BD:09:0E
202+
X509v3 Subject Alternative Name:
203+
URI:http://ca.example.net/, email:[email protected]
204+
X509v3 Authority Key Identifier:
205+
keyid:8F:9F:67:C9:61:A8:E2:A3:A1:F9:10:D3:EA:B1:6E:9D:0F:B3:E6:99
206+
207+
X509v3 Issuer Alternative Name:
208+
URI:http://ca.example.net/, email:[email protected]
209+
Authority Information Access:
210+
CA Issuers - URI:http://ca.example.net/certs/example.net_Root_Certification_Authority.cert.pem
211+
212+
X509v3 CRL Distribution Points:
213+
214+
Full Name:
215+
URI:http://ca.example.net/crl/example.net_Root_Certification_Authority.crl
216+
217+
Signature Algorithm: sha256WithRSAEncryption
218+
91:79:73:e9:0d:e9:0c:b6:ee:a0:79:42:56:11:a6:e0:07:2b:
219+
9f:d7:19:a8:17:10:54:af:b2:a3:21:3a:1e:53:06:e3:b8:da:
220+
8e:2c:f0:c8:f6:85:fd:27:d4:f8:ea:d0:13:38:97:4f:80:01:
221+
4e:7a:36:34:0b:01:52:88:02:3a:d4:fe:e6:90:f0:bd:e2:0f:
222+
3f:e8:58:36:7f:86:8a:cc:3b:76:ac:5d:dc:18:27:ac:88:f7:
223+
3b:f8:78:8e:d7:49:d5:65:17:09:69:bc:26:76:63:2f:61:c0:
224+
91:f7:26:84:44:ef:fc:b1:e2:cd:1f:2e:86:df:21:49:2d:05:
225+
a4:fd:01:43:17:70:fe:0c:f6:10:09:f2:b1:5a:fa:d5:65:8f:
226+
b9:99:5f:81:ca:90:13:ca:20:88:da:c5:6c:49:05:cd:82:78:
227+
83:29:8d:46:ad:d8:7b:41:de:e0:ed:6f:92:b8:1e:64:77:a9:
228+
bd:d3:f3:b5:82:2a:3e:12:72:d4:02:71:9d:9e:5e:01:2a:2b:
229+
59:a2:a2:f2:ad:49:bd:b5:fb:7c:4f:52:da:db:c3:c6:09:98:
230+
eb:7b:e7:3f:d6:f0:6a:c0:64:40:df:f0:5a:57:84:d0:bf:20:
231+
0c:cd:9b:5f:c8:04:98:a6:8e:40:ec:2f:76:8f:1f:58:bf:fe:
232+
52:7d:9d:2e:d7:1d:14:c7:df:e8:34:7c:ee:7f:06:7c:a5:00:
233+
a9:4b:cb:6b:bb:c7:77:63:01:57:03:fd:9b:90:2b:5a:c2:58:
234+
3c:77:f8:52:19:a7:94:f5:2c:fe:9b:85:09:94:7c:f9:fb:31:
235+
a6:e6:14:68:12:c0:d1:bc:df:cc:0a:ea:0c:6e:9f:41:22:9b:
236+
60:64:74:aa:62:95:66:b0:5a:b4:ff:11:cc:92:dc:a3:16:00:
237+
5a:e3:10:10:a6:34:a3:9b:b0:0a:85:75:9a:b2:da:1f:37:40:
238+
f9:17:10:e4:16:07:a1:ae:69:79:fe:71:43:81:a6:30:89:cd:
239+
7a:72:9d:a3:b5:a6:bd:be:5f:5a:7c:28:02:13:78:58:67:de:
240+
78:5f:9d:b4:9d:77:67:17:11:9e:52:1d:a9:ab:70:49:6d:5c:
241+
da:b9:4b:99:e8:d8:1e:e0:06:a6:7a:47:d8:d2:ce:8b:d3:d9:
242+
bf:66:6e:b8:84:4c:3d:5c:e3:fa:92:17:66:44:82:76:2e:ad:
243+
cd:9a:7f:ef:c8:6a:f8:11:6f:9f:cd:63:4e:b7:9a:f7:6c:00:
244+
e7:f1:4e:be:56:1a:d7:26:a4:3c:eb:5b:8a:e1:89:8c:c9:8f:
245+
81:99:29:9d:d5:fb:c9:1c:df:88:e4:b4:e4:80:03:ed:2a:36:
246+
cf:91:2d:bc:2f:5f:20:f7
247+
-----BEGIN CERTIFICATE-----
248+
MIIGSDCCBDCgAwIBAgIQIiWlSPw32Ykysok5XDvVvzANBgkqhkiG9w0BAQsFADBJ
249+
MRQwEgYDVQQKDAtleGFtcGxlLm5ldDExMC8GA1UEAwwoZXhhbXBsZS5uZXQgUm9v
250+
dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0yMDA1MjcwMDAwMDBaFw0zMDA1
251+
MjgwMDAwMDBaMFExFDASBgNVBAoMC2V4YW1wbGUubmV0MTkwNwYDVQQDDDBleGFt
252+
cGxlLm5ldCBJbnRlcm1lZGlhdGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggGi
253+
MA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDZvKXaiJ5ZiNyVE8cujpkIoRRo
254+
p8i0Xmu5FxnhFM6tWnwYBdomLL5ukUL9z29A8CbyPiYpIR8hnsWutpVpE6hjLNLb
255+
YVJ/0D+rihT3MmjyXaHW2dprJLfItqXWCSNjrWWoAEt2zYv9bdBjVO0KLjqzR/fA
256+
jhuwgnJ0HqYlSlF/VXUL24foGb05/f4akuQWLUTY4h5sUKSHz2GintkN2n0i3Ab/
257+
Jco1z8hXtuWXxZ0FCYGLFaHJk7nX1UEr/uW77ngNx2Hr11yZFQ03PJp3EtR00kvM
258+
lLCd34PBZnhrvOTw3kbsK7yh2TTLHg388eYTQkgU9q9qD+UFTGMPxqOYFt5GT1/q
259+
1hv/r7XmGIvylaLeJUbPpApF61moJaGEb+A1DEzT/yADMuoZluh1+cKW8yvkUzAs
260+
hDUpxWTU6p7wU2MyGaADunZtqwwIDLapANGAnj0zFq4sA9Ap468NStCfaekyrdbl
261+
kGH2yfZOtxMTrdICeqW7OjGZqCPg0jIkUT9pWlcCAwEAAaOCAaIwggGeMBIGA1Ud
262+
EwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSk6VV96Pa6
263+
omtxkofBmIVnrb0JDjA5BgNVHREEMjAwhhZodHRwOi8vY2EuZXhhbXBsZS5uZXQv
264+
gRZjZXJ0bWFzdGVyQGV4YW1wbGUubmV0MB8GA1UdIwQYMBaAFI+fZ8lhqOKjofkQ
265+
0+qxbp0Ps+aZMDkGA1UdEgQyMDCGFmh0dHA6Ly9jYS5leGFtcGxlLm5ldC+BFmNl
266+
cnRtYXN0ZXJAZXhhbXBsZS5uZXQwaQYIKwYBBQUHAQEEXTBbMFkGCCsGAQUFBzAC
267+
hk1odHRwOi8vY2EuZXhhbXBsZS5uZXQvY2VydHMvZXhhbXBsZS5uZXRfUm9vdF9D
268+
ZXJ0aWZpY2F0aW9uX0F1dGhvcml0eS5jZXJ0LnBlbTBXBgNVHR8EUDBOMEygSqBI
269+
hkZodHRwOi8vY2EuZXhhbXBsZS5uZXQvY3JsL2V4YW1wbGUubmV0X1Jvb3RfQ2Vy
270+
dGlmaWNhdGlvbl9BdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBCwUAA4ICAQCReXPp
271+
DekMtu6geUJWEabgByuf1xmoFxBUr7KjIToeUwbjuNqOLPDI9oX9J9T46tATOJdP
272+
gAFOejY0CwFSiAI61P7mkPC94g8/6Fg2f4aKzDt2rF3cGCesiPc7+HiO10nVZRcJ
273+
abwmdmMvYcCR9yaERO/8seLNHy6G3yFJLQWk/QFDF3D+DPYQCfKxWvrVZY+5mV+B
274+
ypATyiCI2sVsSQXNgniDKY1Grdh7Qd7g7W+SuB5kd6m90/O1gio+EnLUAnGdnl4B
275+
KitZoqLyrUm9tft8T1La28PGCZjre+c/1vBqwGRA3/BaV4TQvyAMzZtfyASYpo5A
276+
7C92jx9Yv/5SfZ0u1x0Ux9/oNHzufwZ8pQCpS8tru8d3YwFXA/2bkCtawlg8d/hS
277+
GaeU9Sz+m4UJlHz5+zGm5hRoEsDRvN/MCuoMbp9BIptgZHSqYpVmsFq0/xHMktyj
278+
FgBa4xAQpjSjm7AKhXWastofN0D5FxDkFgehrml5/nFDgaYwic16cp2jtaa9vl9a
279+
fCgCE3hYZ954X520nXdnFxGeUh2pq3BJbVzauUuZ6Nge4AamekfY0s6L09m/Zm64
280+
hEw9XOP6khdmRIJ2Lq3Nmn/vyGr4EW+fzWNOt5r3bADn8U6+VhrXJqQ861uK4YmM
281+
yY+BmSmd1fvJHN+I5LTkgAPtKjbPkS28L18g9w==
282+
-----END CERTIFICATE-----

elasticsearch/src/cert.rs

Lines changed: 92 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,13 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
//! Certificate components
20-
pub use reqwest::Certificate;
19+
20+
use crate::error::Error;
21+
use std::{
22+
io::{BufRead, BufReader, Cursor},
23+
ops::Deref,
24+
vec,
25+
};
2126

2227
/// Validation applied to a SSL/TLS certificate, to establish a HTTPS connection.
2328
///
@@ -182,3 +187,88 @@ pub enum CertificateValidation {
182187
/// attempting to resolve TLS errors, and **its use on production clusters is strongly discouraged**.
183188
None,
184189
}
190+
191+
/// Start marker for PEM encoded certificates.
192+
const BEGIN_CERTIFICATE: &str = "-----BEGIN CERTIFICATE-----";
193+
194+
/// End marker for PEM encoded certificates.
195+
const END_CERTIFICATE: &str = "-----END CERTIFICATE-----";
196+
197+
/// Represents a server X509 certificate chain.
198+
pub struct Certificate(Vec<reqwest::Certificate>);
199+
200+
impl Certificate {
201+
/// Create a `Certificate` chain from PEM encoded certificates.
202+
///
203+
/// The `pem` input data may contain one or more PEM encoded CA certificates.
204+
///
205+
/// # Optional
206+
/// This requires the `native-tls`, or `rustls-tls` feature to be enabled.
207+
#[cfg(any(feature = "native-tls", feature = "rustls-tls"))]
208+
pub fn from_pem(pem: &[u8]) -> Result<Self, Error> {
209+
let reader = BufReader::new(Cursor::new(pem));
210+
211+
// Split the PEM cert into parts without validating the
212+
// contents as this will be done by the
213+
// `reqwest::Certificate::from_pem` call itself.
214+
let mut certs = Vec::new();
215+
let mut cert = Vec::new();
216+
let mut begin = false;
217+
for line in reader.lines() {
218+
let line = line?;
219+
match line.as_ref() {
220+
BEGIN_CERTIFICATE if !begin => {
221+
begin = true;
222+
cert.push(line);
223+
}
224+
END_CERTIFICATE if begin => {
225+
begin = false;
226+
cert.push(line);
227+
certs.push(reqwest::Certificate::from_pem(cert.join("\n").as_bytes())?);
228+
cert = Vec::new();
229+
}
230+
_ if begin => cert.push(line),
231+
_ => {}
232+
}
233+
}
234+
235+
if certs.is_empty() {
236+
Err(Error::lib(
237+
"could not find PEM certificate in input data".to_string(),
238+
))
239+
} else {
240+
Ok(Self(certs))
241+
}
242+
}
243+
244+
/// Create a `Certificate` from a binary DER encoded certificate.
245+
///
246+
/// # Optional
247+
/// This requires the `native-tls`, or `rustls-tls` feature to be enabled.
248+
#[cfg(any(feature = "native-tls", feature = "rustls-tls"))]
249+
pub fn from_der(der: &[u8]) -> Result<Self, Error> {
250+
Ok(Self(vec![reqwest::Certificate::from_der(der)?]))
251+
}
252+
253+
/// Append a `Certificate` to the chain.
254+
pub fn append(&mut self, mut cert: Self) {
255+
self.0.append(&mut cert.0);
256+
}
257+
}
258+
259+
impl IntoIterator for Certificate {
260+
type Item = reqwest::Certificate;
261+
type IntoIter = vec::IntoIter<Self::Item>;
262+
263+
fn into_iter(self) -> Self::IntoIter {
264+
self.0.into_iter()
265+
}
266+
}
267+
268+
impl Deref for Certificate {
269+
type Target = Vec<reqwest::Certificate>;
270+
271+
fn deref(&self) -> &Self::Target {
272+
&self.0
273+
}
274+
}

0 commit comments

Comments
 (0)