Skip to content

Commit 3beb880

Browse files
author
Shigeki Ohtsu
committed
crypto: add cert check to CNNIC Whitelist
When client connect to the server with certification issued by either CNNIC Root CA or CNNIC EV Root CA, check hash of server certification in the list of CNNICHashWhitelist.inc. If it's not, CERT_REVOKED error returns. See for details in https://blog.mozilla.org/security/2015/04/02/distrusting-new-cnnic-certificates/ PR-URL: nodejs#1895 Reviewed-By: Ben Noordhuis <[email protected]>
1 parent 96165f9 commit 3beb880

14 files changed

+6092
-44
lines changed

src/CNNICHashWhitelist.inc

+5,727
Large diffs are not rendered by default.

src/node_crypto.cc

+117-43
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
#include "util.h"
1414
#include "util-inl.h"
1515
#include "v8.h"
16+
// CNNIC Hash WhiteList is taken from
17+
// https://hg.mozilla.org/mozilla-central/raw-file/98820360ab66/security/
18+
// certverifier/CNNICHashWhitelist.inc
19+
#include "CNNICHashWhitelist.inc"
1620

1721
#include <errno.h>
1822
#include <stdlib.h>
@@ -84,6 +88,34 @@ using v8::V8;
8488
using v8::Value;
8589

8690

91+
// Subject DER of CNNIC ROOT CA and CNNIC EV ROOT CA are taken from
92+
// https://hg.mozilla.org/mozilla-central/file/98820360ab66/security/
93+
// certverifier/NSSCertDBTrustDomain.cpp#l672
94+
// C = CN, O = CNNIC, CN = CNNIC ROOT
95+
static const uint8_t CNNIC_ROOT_CA_SUBJECT_DATA[] =
96+
"\x30\x32\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x43\x4E\x31\x0E\x30"
97+
"\x0C\x06\x03\x55\x04\x0A\x13\x05\x43\x4E\x4E\x49\x43\x31\x13\x30\x11\x06"
98+
"\x03\x55\x04\x03\x13\x0A\x43\x4E\x4E\x49\x43\x20\x52\x4F\x4F\x54";
99+
static const uint8_t* cnnic_p = CNNIC_ROOT_CA_SUBJECT_DATA;
100+
static X509_NAME* cnnic_name =
101+
d2i_X509_NAME(nullptr, &cnnic_p, sizeof(CNNIC_ROOT_CA_SUBJECT_DATA)-1);
102+
103+
// C = CN, O = China Internet Network Information Center, CN = China
104+
// Internet Network Information Center EV Certificates Root
105+
static const uint8_t CNNIC_EV_ROOT_CA_SUBJECT_DATA[] =
106+
"\x30\x81\x8A\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x43\x4E\x31\x32"
107+
"\x30\x30\x06\x03\x55\x04\x0A\x0C\x29\x43\x68\x69\x6E\x61\x20\x49\x6E\x74"
108+
"\x65\x72\x6E\x65\x74\x20\x4E\x65\x74\x77\x6F\x72\x6B\x20\x49\x6E\x66\x6F"
109+
"\x72\x6D\x61\x74\x69\x6F\x6E\x20\x43\x65\x6E\x74\x65\x72\x31\x47\x30\x45"
110+
"\x06\x03\x55\x04\x03\x0C\x3E\x43\x68\x69\x6E\x61\x20\x49\x6E\x74\x65\x72"
111+
"\x6E\x65\x74\x20\x4E\x65\x74\x77\x6F\x72\x6B\x20\x49\x6E\x66\x6F\x72\x6D"
112+
"\x61\x74\x69\x6F\x6E\x20\x43\x65\x6E\x74\x65\x72\x20\x45\x56\x20\x43\x65"
113+
"\x72\x74\x69\x66\x69\x63\x61\x74\x65\x73\x20\x52\x6F\x6F\x74";
114+
static const uint8_t* cnnic_ev_p = CNNIC_EV_ROOT_CA_SUBJECT_DATA;
115+
static X509_NAME *cnnic_ev_name =
116+
d2i_X509_NAME(nullptr, &cnnic_ev_p,
117+
sizeof(CNNIC_EV_ROOT_CA_SUBJECT_DATA)-1);
118+
87119
// Forcibly clear OpenSSL's error stack on return. This stops stale errors
88120
// from popping up later in the lifecycle of crypto operations where they
89121
// would cause spurious failures. It's a rather blunt method, though.
@@ -2210,49 +2242,91 @@ void Connection::Initialize(Environment* env, Handle<Object> target) {
22102242
}
22112243

22122244

2213-
int VerifyCallback(int preverify_ok, X509_STORE_CTX* ctx) {
2214-
// Quoting SSL_set_verify(3ssl):
2215-
//
2216-
// The VerifyCallback function is used to control the behaviour when
2217-
// the SSL_VERIFY_PEER flag is set. It must be supplied by the
2218-
// application and receives two arguments: preverify_ok indicates,
2219-
// whether the verification of the certificate in question was passed
2220-
// (preverify_ok=1) or not (preverify_ok=0). x509_ctx is a pointer to
2221-
// the complete context used for the certificate chain verification.
2222-
//
2223-
// The certificate chain is checked starting with the deepest nesting
2224-
// level (the root CA certificate) and worked upward to the peer's
2225-
// certificate. At each level signatures and issuer attributes are
2226-
// checked. Whenever a verification error is found, the error number is
2227-
// stored in x509_ctx and VerifyCallback is called with preverify_ok=0.
2228-
// By applying X509_CTX_store_* functions VerifyCallback can locate the
2229-
// certificate in question and perform additional steps (see EXAMPLES).
2230-
// If no error is found for a certificate, VerifyCallback is called
2231-
// with preverify_ok=1 before advancing to the next level.
2232-
//
2233-
// The return value of VerifyCallback controls the strategy of the
2234-
// further verification process. If VerifyCallback returns 0, the
2235-
// verification process is immediately stopped with "verification
2236-
// failed" state. If SSL_VERIFY_PEER is set, a verification failure
2237-
// alert is sent to the peer and the TLS/SSL handshake is terminated. If
2238-
// VerifyCallback returns 1, the verification process is continued. If
2239-
// VerifyCallback always returns 1, the TLS/SSL handshake will not be
2240-
// terminated with respect to verification failures and the connection
2241-
// will be established. The calling process can however retrieve the
2242-
// error code of the last verification error using
2243-
// SSL_get_verify_result(3) or by maintaining its own error storage
2244-
// managed by VerifyCallback.
2245-
//
2246-
// If no VerifyCallback is specified, the default callback will be
2247-
// used. Its return value is identical to preverify_ok, so that any
2248-
// verification failure will lead to a termination of the TLS/SSL
2249-
// handshake with an alert message, if SSL_VERIFY_PEER is set.
2250-
//
2251-
// Since we cannot perform I/O quickly enough in this callback, we ignore
2252-
// all preverify_ok errors and let the handshake continue. It is
2253-
// imparative that the user use Connection::VerifyError after the
2254-
// 'secure' callback has been made.
2255-
return 1;
2245+
inline int compar(const void* a, const void* b) {
2246+
return memcmp(a, b, CNNIC_WHITELIST_HASH_LEN);
2247+
}
2248+
2249+
2250+
inline int IsSelfSigned(X509* cert) {
2251+
return X509_NAME_cmp(X509_get_subject_name(cert),
2252+
X509_get_issuer_name(cert)) == 0;
2253+
}
2254+
2255+
2256+
inline X509* FindRoot(STACK_OF(X509)* sk) {
2257+
for (int i = 0; i < sk_X509_num(sk); i++) {
2258+
X509* cert = sk_X509_value(sk, i);
2259+
if (IsSelfSigned(cert))
2260+
return cert;
2261+
}
2262+
return nullptr;
2263+
}
2264+
2265+
2266+
// Whitelist check for certs issued by CNNIC. See
2267+
// https://blog.mozilla.org/security/2015/04/02
2268+
// /distrusting-new-cnnic-certificates/
2269+
inline CheckResult CheckWhitelistedServerCert(X509_STORE_CTX* ctx) {
2270+
unsigned char hash[CNNIC_WHITELIST_HASH_LEN];
2271+
unsigned int hashlen = CNNIC_WHITELIST_HASH_LEN;
2272+
2273+
STACK_OF(X509)* chain = X509_STORE_CTX_get1_chain(ctx);
2274+
CHECK_NE(chain, nullptr);
2275+
CHECK_GT(sk_X509_num(chain), 0);
2276+
2277+
// Take the last cert as root at the first time.
2278+
X509* root_cert = sk_X509_value(chain, sk_X509_num(chain)-1);
2279+
X509_NAME* root_name = X509_get_subject_name(root_cert);
2280+
2281+
if (!IsSelfSigned(root_cert)) {
2282+
root_cert = FindRoot(chain);
2283+
CHECK_NE(root_cert, nullptr);
2284+
root_name = X509_get_subject_name(root_cert);
2285+
}
2286+
2287+
// When the cert is issued from either CNNNIC ROOT CA or CNNNIC EV
2288+
// ROOT CA, check a hash of its leaf cert if it is in the whitelist.
2289+
if (X509_NAME_cmp(root_name, cnnic_name) == 0 ||
2290+
X509_NAME_cmp(root_name, cnnic_ev_name) == 0) {
2291+
X509* leaf_cert = sk_X509_value(chain, 0);
2292+
int ret = X509_digest(leaf_cert, EVP_sha256(), hash,
2293+
&hashlen);
2294+
CHECK(ret);
2295+
2296+
void* result = bsearch(hash, WhitelistedCNNICHashes,
2297+
ARRAY_SIZE(WhitelistedCNNICHashes),
2298+
CNNIC_WHITELIST_HASH_LEN, compar);
2299+
if (result == nullptr) {
2300+
sk_X509_pop_free(chain, X509_free);
2301+
return CHECK_CERT_REVOKED;
2302+
}
2303+
}
2304+
2305+
sk_X509_pop_free(chain, X509_free);
2306+
return CHECK_OK;
2307+
}
2308+
2309+
2310+
inline int VerifyCallback(int preverify_ok, X509_STORE_CTX* ctx) {
2311+
// Failure on verification of the cert is handled in
2312+
// Connection::VerifyError.
2313+
if (preverify_ok == 0)
2314+
return 1;
2315+
2316+
// Server does not need to check the whitelist.
2317+
SSL* ssl = static_cast<SSL*>(
2318+
X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
2319+
2320+
if (SSL_is_server(ssl))
2321+
return 1;
2322+
2323+
// Client needs to check if the server cert is listed in the
2324+
// whitelist when it is issued by the specific rootCAs.
2325+
CheckResult ret = CheckWhitelistedServerCert(ctx);
2326+
if (ret == CHECK_CERT_REVOKED)
2327+
X509_STORE_CTX_set_error(ctx, X509_V_ERR_CERT_REVOKED);
2328+
2329+
return ret;
22562330
}
22572331

22582332

src/node_crypto.h

+5
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@
4141
namespace node {
4242
namespace crypto {
4343

44+
enum CheckResult {
45+
CHECK_CERT_REVOKED = 0,
46+
CHECK_OK = 1
47+
};
48+
4449
extern int VerifyCallback(int preverify_ok, X509_STORE_CTX* ctx);
4550

4651
extern X509_STORE* root_cert_store;

test/fixtures/keys/Makefile

+42-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ ca3-key.pem:
2626

2727
ca3-csr.pem: ca3.cnf ca3-key.pem
2828
openssl req -new \
29-
-extensions v3_ca -config ca3.cnf -key ca3-key.pem -out ca3-csr.pem
29+
-extensions v3_ca \
30+
-config ca3.cnf \
31+
-key ca3-key.pem \
32+
-out ca3-csr.pem
3033

3134
ca3-cert.pem: ca3-csr.pem ca3-key.pem ca3.cnf ca1-cert.pem ca1-key.pem
3235
openssl x509 -req \
@@ -40,6 +43,20 @@ ca3-cert.pem: ca3-csr.pem ca3-key.pem ca3.cnf ca1-cert.pem ca1-key.pem
4043
-CAcreateserial \
4144
-out ca3-cert.pem
4245

46+
#
47+
# Create Fake CNNIC Root Certificate Authority: fake-cnnic-root
48+
#
49+
50+
fake-cnnic-root-key.pem:
51+
openssl genrsa -out fake-cnnic-root-key.pem 2048
52+
53+
fake-cnnic-root-cert.pem: fake-cnnic-root.cnf fake-cnnic-root-key.pem
54+
openssl req -x509 -new \
55+
-key fake-cnnic-root-key.pem \
56+
-days 1024 \
57+
-out fake-cnnic-root-cert.pem \
58+
-config fake-cnnic-root.cnf
59+
4360
#
4461
# agent1 is signed by ca1.
4562
#
@@ -204,6 +221,30 @@ agent6-cert.pem: agent6-csr.pem ca3-cert.pem ca3-key.pem
204221
agent6-verify: agent6-cert.pem ca3-cert.pem
205222
openssl verify -CAfile ca3-cert.pem agent6-cert.pem
206223

224+
#
225+
# agent7 is signed by fake-cnnic-root.
226+
#
227+
228+
agent7-key.pem:
229+
openssl genrsa -out agent7-key.pem 2048
230+
231+
agent7-csr.pem: agent1.cnf agent7-key.pem
232+
openssl req -new -config agent7.cnf -key agent7-key.pem -out agent7-csr.pem
233+
234+
agent7-cert.pem: agent7-csr.pem fake-cnnic-root-cert.pem fake-cnnic-root-key.pem
235+
openssl x509 -req \
236+
-extfile agent7.cnf \
237+
-days 9999 \
238+
-passin "pass:password" \
239+
-in agent7-csr.pem \
240+
-CA fake-cnnic-root-cert.pem \
241+
-CAkey fake-cnnic-root-key.pem \
242+
-CAcreateserial \
243+
-out agent7-cert.pem
244+
245+
agent7-verify: agent7-cert.pem fake-cnnic-root-cert.pem
246+
openssl verify -CAfile fake-cnnic-root-cert.pem agent7-cert.pem
247+
207248
ec-key.pem:
208249
openssl ecparam -genkey -out ec-key.pem -name prime256v1
209250

test/fixtures/keys/agent7-cert.pem

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDEDCCAfigAwIBAgIJAKpGbw//YhvMMA0GCSqGSIb3DQEBCwUAMDIxCzAJBgNV
3+
BAYTAkNOMQ4wDAYDVQQKEwVDTk5JQzETMBEGA1UEAxMKQ05OSUMgUk9PVDAeFw0x
4+
NTA2MTAwNDI4MTNaFw00MjEwMjUwNDI4MTNaMF0xCzAJBgNVBAYTAlVTMQswCQYD
5+
VQQIEwJDQTELMAkGA1UEBxMCU0YxDTALBgNVBAoTBElPSlMxETAPBgNVBAsTCGlv
6+
anMub3JnMRIwEAYDVQQDEwlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IB
7+
DwAwggEKAoIBAQCur6nhJBpxAmWKVbTKvEDn8YJ7ebkpNSwNVMzSycmvo3XOIogw
8+
ZngRJ/dL8YM/+p5CvAheJ6IqThgRw6+Se42O5ywlYpaHaY7n1oaFJC+2RUoPwdS7
9+
Rz0dl30kXwUnKlllqkGDdFwMUD5NlXBLsGgiW1gkPHCvlOYxfuv50z3yIMgxfVGP
10+
a7FeAYIHkRWQ5VrvugT70YaZMhLoMnj8c6RcIe81PV3eCS5Pp4ce8SGUkzAV9AFu
11+
f4yVlEnPqqy/VrinT+xNrRKt+2YijIb54i75p+2AVveOhpLcCcB2K65Zgc5LnZB8
12+
EY7W8/Qfh0DOAZibOd2vrUl2pkkOlR+qkYX/AgMBAAEwDQYJKoZIhvcNAQELBQAD
13+
ggEBAIiPC5SMDJAbUwkEWZxSleKfliLnycwaRfzF/B+8CUMd+hrVdrKe/u1aPDEV
14+
FgWq4Vd3K3jtGZxwfW8VMjtF3aj7vd/Lx6XUbZv+VUKURlDRktBuZTDdYu5mECV1
15+
+iDd64robqeYbZ04w1pnwArT50+oZdmQ9BgbQom1B4FoMhoeSX7A0gITH5BHW1xs
16+
SRiqI7tDoDqhhn6X8pWoiq9QpXCSjXqUDNlxmiL5+e9j6DUv+e4z/bWY0s/COmY6
17+
2gGSZDJGDcpwx8RgEy+1gDNMMApqLZxH0b/RwtE/9R9OiPm272pCuz2zkdQM48a0
18+
9/GbQ68v2fmDZRF2WnYrkTSzF0Y=
19+
-----END CERTIFICATE-----

test/fixtures/keys/agent7-csr.pem

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
-----BEGIN CERTIFICATE REQUEST-----
2+
MIICxzCCAa8CAQAwXTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQswCQYDVQQH
3+
EwJTRjENMAsGA1UEChMESU9KUzERMA8GA1UECxMIaW9qcy5vcmcxEjAQBgNVBAMT
4+
CWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK6vqeEk
5+
GnECZYpVtMq8QOfxgnt5uSk1LA1UzNLJya+jdc4iiDBmeBEn90vxgz/6nkK8CF4n
6+
oipOGBHDr5J7jY7nLCVilodpjufWhoUkL7ZFSg/B1LtHPR2XfSRfBScqWWWqQYN0
7+
XAxQPk2VcEuwaCJbWCQ8cK+U5jF+6/nTPfIgyDF9UY9rsV4BggeRFZDlWu+6BPvR
8+
hpkyEugyePxzpFwh7zU9Xd4JLk+nhx7xIZSTMBX0AW5/jJWUSc+qrL9WuKdP7E2t
9+
Eq37ZiKMhvniLvmn7YBW946GktwJwHYrrlmBzkudkHwRjtbz9B+HQM4BmJs53a+t
10+
SXamSQ6VH6qRhf8CAwEAAaAlMCMGCSqGSIb3DQEJBzEWExRBIGNoYWxsZW5nZSBw
11+
YXNzd29yZDANBgkqhkiG9w0BAQsFAAOCAQEAgT89dg/uj55YDT0wqNH2spt6JBK+
12+
gF7Y8R7MBgGEJSbJnjAkJSUpKKPE3ph6mJ9naYl1U3zqt+xoQKdp8kn8649u5Hjq
13+
TmmlsCExf0cznpMHINB9FG1aOoKdrsHf4o4eSXBAOacrpgnCpPAnaywE8F6Rc1a0
14+
3RDogwETUOFzTKvyl8XJQ2jUQt4qs9+fmkR12IVNe8IFPe2I8j5wMmQ81nUmFDpC
15+
NHy35vXjs+7N15FEkkvbr7jxZzMzXAhdZLUEOwIcNZsfpgCCqRmM/j5w8qXLFShd
16+
NUZn6Psex2Jkq2rcNwJ25739ORS69nWqhZrUvaaMP6IqjFcJBVWIyRwltQ==
17+
-----END CERTIFICATE REQUEST-----

test/fixtures/keys/agent7-key.pem

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpQIBAAKCAQEArq+p4SQacQJlilW0yrxA5/GCe3m5KTUsDVTM0snJr6N1ziKI
3+
MGZ4ESf3S/GDP/qeQrwIXieiKk4YEcOvknuNjucsJWKWh2mO59aGhSQvtkVKD8HU
4+
u0c9HZd9JF8FJypZZapBg3RcDFA+TZVwS7BoIltYJDxwr5TmMX7r+dM98iDIMX1R
5+
j2uxXgGCB5EVkOVa77oE+9GGmTIS6DJ4/HOkXCHvNT1d3gkuT6eHHvEhlJMwFfQB
6+
bn+MlZRJz6qsv1a4p0/sTa0SrftmIoyG+eIu+aftgFb3joaS3AnAdiuuWYHOS52Q
7+
fBGO1vP0H4dAzgGYmzndr61JdqZJDpUfqpGF/wIDAQABAoIBAQCNIXcKYnTKYLlQ
8+
rjXGpZl6yvA0ef9Sf5b7nkts8YJ02IdQ5y1IjUDr+3IcdR8pDX3XRLst9q9ZpoZj
9+
s8mhexi/H53XBnO/K1U9kWBVKQszI3/Wgy8vrzp9Mer0+5/aKKjZLliHr/a+LAZq
10+
ABYd0IQRXeM0Q3B3KsFfs79Ks5QUjXjrOPCkFCKmLwZin0Oujbb88WDeqSHAYB0A
11+
35lUDuQtg1rCNkTirBCdFAYFkfaRRwDGwdQ7L9cijidxMONYx1EapDbyqGL2BXJl
12+
99ZVebokUKeKQrvsghQZhmcph1mHABsOMfRw4x8TGxMJJSRM264OYCn66EK1tBh4
13+
tA0oU5GBAoGBAOTZEF1cQWjHHLvMUSP4B/6ZxvcP9ZdQaPISrq2j9oaArnCxxYvm
14+
XHTZRK0YAXzPnmhBXL46FoslDwUKu+T2gajl1NOBKk9C8uao9Xqm+IDKuA+ebf8V
15+
1B31Sf5bxnBI9jMaORGZg5/KFGvl3IzBrJODPTFToLHoqlS+lGhHoMYPAoGBAMNp
16+
g0+w8m/CsKapOhKZ6+91pT3sHsVUQ7JhTKpajpk+JOB7JaF1eZzuShTykkpDWmGw
17+
VesgbpBx+/JnjxW3Lnq24FUp4t+9OZ5r3gr2uFPHkmr4laT8S1WSqspmck0jZMgM
18+
zAIrLV7miAxVefrDjoqf5VkMaqwGoZavXU5UzLERAoGAK+vFCkYEf7mHODvUbtTR
19+
o/mbiBtWBT53hc40HDtVuybDU/mqclk58WsplRcAYhXuzw+MXy4C2Z25LjyLJzxw
20+
UhwaJqWpmyC8Qay3wFx/YSiG/uhnMAfeeAl1tA2lHjPCnLgxr8EI1AgSt0qcc59Q
21+
IdeUTP1B4CNJXY5eKU1l+90CgYEAuU0aybzfiH80CDY87VqsUnxa32dCnpiTQVnm
22+
2zvYMRSu33enbX36foewFEEZ2/YWhMA0GSy965dK9Mii9FKqbo9wFxILI2NKeiGL
23+
gxYGINwEyg9DyBm+Tj0wW5HeHavMa69G3V+YPH+azydW7iX2yxlo4JJXrRz0qfFN
24+
J3ReTiECgYEA4CIpRG5XzW6BEscqDBBQZ46RVy8wsnwxt62V2g2CImDwzKslcHK8
25+
oQurwl5WLKmvb0amMTedmVeIey3GOy23G8HrpHjEZjLi3wr3s3xJlPVajDBWw5Og
26+
dgU9acdKHcbzv9dnsyC6eO1hr0TlEJqMkPuoNr3RihEuhv88rQbmGas=
27+
-----END RSA PRIVATE KEY-----

test/fixtures/keys/agent7.cnf

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[ req ]
2+
default_bits = 2048
3+
days = 999
4+
distinguished_name = req_distinguished_name
5+
attributes = req_attributes
6+
prompt = no
7+
8+
[ req_distinguished_name ]
9+
C = US
10+
ST = CA
11+
L = SF
12+
O = IOJS
13+
OU = iojs.org
14+
CN = localhost
15+
16+
[ req_attributes ]
17+
challengePassword = A challenge password
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIC9zCCAd+gAwIBAgIJAMJ5SivqSZNtMA0GCSqGSIb3DQEBCwUAMDIxCzAJBgNV
3+
BAYTAkNOMQ4wDAYDVQQKEwVDTk5JQzETMBEGA1UEAxMKQ05OSUMgUk9PVDAeFw0x
4+
NTA2MDkxNzE1MTZaFw0xODAzMjkxNzE1MTZaMDIxCzAJBgNVBAYTAkNOMQ4wDAYD
5+
VQQKEwVDTk5JQzETMBEGA1UEAxMKQ05OSUMgUk9PVDCCASIwDQYJKoZIhvcNAQEB
6+
BQADggEPADCCAQoCggEBAMwlKdTOPb+B0bENBw5+ZgnN2KxNhLBcEd0HB174fI1o
7+
iE7qmbRObzSXT4HCmg1j8lijq3isnI4oMH9nCJNxZcdXtY7c3YXYoGtsVWAX++ZF
8+
wYzakXXvDnHiaGXOos9+LuIRC0PZqyoYwZb0lvfyjPzIKBLVoCAAVTw65ankLN/J
9+
5vJ44PzyiLmBZhhr9WzyyKVYNo2X7FLMGJtg8lz0vslb4ImNxumKmGyBijv730E5
10+
qEc6HSriNeH/GSO7HBkxpbt+1MDkg3RaY/uGABuWhtuGgT8PkYCRdsSypawG561j
11+
NKs/Ny4gTBaQAsmnuj2wwUj0i4MQkQDute/Db/IY56UCAwEAAaMQMA4wDAYDVR0T
12+
BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEARJG19V4/zOko/8eIVYeX9L6hQRNt
13+
a6llIYPihQG29GdQsU+d0FqXba9N3oUD5kSF21F4oty7hWzLbBWnrKl66mXKNwWI
14+
DjcYwjc2etThNEhud3jY2SreDx6OIFu97DW2oZfvBSTYrh1xastxuDVcBmhdNk4N
15+
76Qj8s2X9KOS7nE+FY90ANwvckmHEAiq//aD5liwzCc8AYZi/JxV00YR7JS7Niee
16+
y0M5UZ0AAO+P9DB+fkIRZcSodtmPa4Q3m32p3RgGS7TnNHsqDvRXsnrt+7YV1kBW
17+
xrYO/iKGhq2K4bv6Z8JWUHyGyx7JEOFCJ25oWLYgByW5cJUE3xM4UTDzuw==
18+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
AA466F0FFF621BCC
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpAIBAAKCAQEAzCUp1M49v4HRsQ0HDn5mCc3YrE2EsFwR3QcHXvh8jWiITuqZ
3+
tE5vNJdPgcKaDWPyWKOreKycjigwf2cIk3Flx1e1jtzdhdiga2xVYBf75kXBjNqR
4+
de8OceJoZc6iz34u4hELQ9mrKhjBlvSW9/KM/MgoEtWgIABVPDrlqeQs38nm8njg
5+
/PKIuYFmGGv1bPLIpVg2jZfsUswYm2DyXPS+yVvgiY3G6YqYbIGKO/vfQTmoRzod
6+
KuI14f8ZI7scGTGlu37UwOSDdFpj+4YAG5aG24aBPw+RgJF2xLKlrAbnrWM0qz83
7+
LiBMFpACyae6PbDBSPSLgxCRAO6178Nv8hjnpQIDAQABAoIBAGKGtS+98lNRRnEb
8+
BoLaQkkNDjvqldXAOebhE4+kggiFoPPlihVZnZZWSMsprswzpq1dIM73EAAUKYPz
9+
qFHw8txI2pl+w3Nr39C40mO0b6DtncJrYrT2kZQpX5VzK2TVU69L5pHypgeFNzmy
10+
BoLYj28Y8y5T6BpJztlo25spQvcmUAR0PZmde1NJwjWTdxAlCeER+fvgJu2UsKpn
11+
EEEIc5UGEdedhRLkQgt0Cu1FqeDihvr+z6upH467trmNhlTyrPeN3+FqRUkuqPvA
12+
RdR1g7+fSRTku+QzrCq/tN2zyjVDwED2GGQs1fCOYOb/vSsIydIddqGIqdSdE05r
13+
ZtIhGEECgYEA7EtwzIJAHV1rcB2OcNgodLx7/ratPIJZg5umGDfd159MkwzxcFjz
14+
lxiu4SjW8s+83KgZ6E6N4ZsekJLz1eI33gGGK4XqGBSHiQe+A8WnQeRJXCmT1nzx
15+
23LjE07sJd42l2byPejF+dBRQZF71pqsjTHLvn+jJD2CakdaeozEpEkCgYEA3Stg
16+
L7DqSjPBOaGpFR6bZqdJhYG4/FVIVN9sKTfo0CqlNHrqjIeL8RgTSu+PYJTvIF2B
17+
NfUjTfsxGfLKKBIHR+1LRMt2rr/tYnvr1/kwAAw9zYaugNiZ/J4BPLCXtN4Ahj4t
18+
2d2Zbyg/bD3ppmT80LGnzJ3oQhmQVC0nuv8PMH0CgYEA4zzVmEa2Q8cgWCyEXC70
19+
EPdmQxkIVkWAshkQTQAE3qR6bnwnAAT7FNaO70doFxACLy2V5JsOxOR5K023Inwv
20+
f9d1YQuiiU/M29HPQS9mXu6cQf5WBxIXQRQmHd5rKSue0lEVKsZdBZX5XpX7QvFy
21+
eUJnDqcOi/5/GZfPAkW3ockCgYAa+/vUVcWAIChnG65BgWZ8c9SokVc8kjss/8V2
22+
kfe5zjox2P1c//y3AbT445mesw0p6b6mEq6oCQnInLLFiM2SnQUd86UbVRdleLEh
23+
vKl6mAPCW7hWyBahl7WW7gTUcHGn71YwyrS5tzNlxXgIcTHXVJWghXOc/Pl7C7dZ
24+
PV1hEQKBgQCnJQuQ1fb+w9O+P2MKdZPD/ztrghIeIyS9X90GuFWPMCWlIO6gaF8U
25+
JY3BNuiahAhxVLcnaG8mNCXARPGCRGYDwN11vv/jrUOH/dXbd1bwwUkHfNu00w75
26+
LTHh1YKab/RifALc5k8mGWNIuZWE8xqjKOrpyNiX2VKwhglrJ1NK0A==
27+
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)