mirror of https://github.com/dexidp/dex.git
17 changed files with 348 additions and 123 deletions
@ -0,0 +1,45 @@ |
|||||||
|
package httpclient |
||||||
|
|
||||||
|
import ( |
||||||
|
"crypto/tls" |
||||||
|
"crypto/x509" |
||||||
|
"fmt" |
||||||
|
"net" |
||||||
|
"net/http" |
||||||
|
"os" |
||||||
|
"time" |
||||||
|
) |
||||||
|
|
||||||
|
func NewHTTPClient(rootCAs []string, insecureSkipVerify bool) (*http.Client, error) { |
||||||
|
pool, err := x509.SystemCertPool() |
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
tlsConfig := tls.Config{RootCAs: pool, InsecureSkipVerify: insecureSkipVerify} |
||||||
|
for _, rootCA := range rootCAs { |
||||||
|
rootCABytes, err := os.ReadFile(rootCA) |
||||||
|
if err != nil { |
||||||
|
return nil, fmt.Errorf("failed to read root-ca: %v", err) |
||||||
|
} |
||||||
|
if !tlsConfig.RootCAs.AppendCertsFromPEM(rootCABytes) { |
||||||
|
return nil, fmt.Errorf("no certs found in root CA file %q", rootCA) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return &http.Client{ |
||||||
|
Transport: &http.Transport{ |
||||||
|
TLSClientConfig: &tlsConfig, |
||||||
|
Proxy: http.ProxyFromEnvironment, |
||||||
|
DialContext: (&net.Dialer{ |
||||||
|
Timeout: 30 * time.Second, |
||||||
|
KeepAlive: 30 * time.Second, |
||||||
|
DualStack: true, |
||||||
|
}).DialContext, |
||||||
|
MaxIdleConns: 100, |
||||||
|
IdleConnTimeout: 90 * time.Second, |
||||||
|
TLSHandshakeTimeout: 10 * time.Second, |
||||||
|
ExpectContinueTimeout: 1 * time.Second, |
||||||
|
}, |
||||||
|
}, nil |
||||||
|
} |
||||||
@ -0,0 +1,68 @@ |
|||||||
|
package httpclient_test |
||||||
|
|
||||||
|
import ( |
||||||
|
"crypto/tls" |
||||||
|
"fmt" |
||||||
|
"io" |
||||||
|
"net/http" |
||||||
|
"net/http/httptest" |
||||||
|
"testing" |
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert" |
||||||
|
|
||||||
|
"github.com/dexidp/dex/pkg/httpclient" |
||||||
|
) |
||||||
|
|
||||||
|
func TestRootCAs(t *testing.T) { |
||||||
|
ts, err := NewLocalHTTPSTestServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
||||||
|
fmt.Fprint(w, "Hello, client") |
||||||
|
})) |
||||||
|
assert.Nil(t, err) |
||||||
|
defer ts.Close() |
||||||
|
|
||||||
|
rootCAs := []string{"testdata/rootCA.pem"} |
||||||
|
testClient, err := httpclient.NewHTTPClient(rootCAs, false) |
||||||
|
assert.Nil(t, err) |
||||||
|
|
||||||
|
res, err := testClient.Get(ts.URL) |
||||||
|
assert.Nil(t, err) |
||||||
|
|
||||||
|
greeting, err := io.ReadAll(res.Body) |
||||||
|
res.Body.Close() |
||||||
|
assert.Nil(t, err) |
||||||
|
|
||||||
|
assert.Equal(t, "Hello, client", string(greeting)) |
||||||
|
} |
||||||
|
|
||||||
|
func TestInsecureSkipVerify(t *testing.T) { |
||||||
|
ts, err := NewLocalHTTPSTestServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
||||||
|
fmt.Fprint(w, "Hello, client") |
||||||
|
})) |
||||||
|
assert.Nil(t, err) |
||||||
|
defer ts.Close() |
||||||
|
|
||||||
|
insecureSkipVerify := true |
||||||
|
|
||||||
|
testClient, err := httpclient.NewHTTPClient(nil, insecureSkipVerify) |
||||||
|
assert.Nil(t, err) |
||||||
|
|
||||||
|
res, err := testClient.Get(ts.URL) |
||||||
|
assert.Nil(t, err) |
||||||
|
|
||||||
|
greeting, err := io.ReadAll(res.Body) |
||||||
|
res.Body.Close() |
||||||
|
assert.Nil(t, err) |
||||||
|
|
||||||
|
assert.Equal(t, "Hello, client", string(greeting)) |
||||||
|
} |
||||||
|
|
||||||
|
func NewLocalHTTPSTestServer(handler http.Handler) (*httptest.Server, error) { |
||||||
|
ts := httptest.NewUnstartedServer(handler) |
||||||
|
cert, err := tls.LoadX509KeyPair("testdata/server.crt", "testdata/server.key") |
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
ts.TLS = &tls.Config{Certificates: []tls.Certificate{cert}} |
||||||
|
ts.StartTLS() |
||||||
|
return ts, nil |
||||||
|
} |
||||||
@ -0,0 +1,44 @@ |
|||||||
|
# Regenerate testdata |
||||||
|
|
||||||
|
### server.csr.cnf |
||||||
|
|
||||||
|
``` |
||||||
|
[req] |
||||||
|
default_bits = 2048 |
||||||
|
prompt = no |
||||||
|
default_md = sha256 |
||||||
|
distinguished_name = dn |
||||||
|
|
||||||
|
[dn] |
||||||
|
C=US |
||||||
|
ST=RandomState |
||||||
|
L=RandomCity |
||||||
|
O=RandomOrganization |
||||||
|
OU=RandomOrganizationUnit |
||||||
|
emailAddress=hello@example.com |
||||||
|
CN = localhost |
||||||
|
``` |
||||||
|
|
||||||
|
and |
||||||
|
|
||||||
|
### v3.ext |
||||||
|
``` |
||||||
|
authorityKeyIdentifier=keyid,issuer |
||||||
|
basicConstraints=CA:FALSE |
||||||
|
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment |
||||||
|
subjectAltName = @alt_names |
||||||
|
|
||||||
|
[alt_names] |
||||||
|
DNS.1 = localhost |
||||||
|
IP.1 = 127.0.0.1 |
||||||
|
``` |
||||||
|
|
||||||
|
### Then enter the following commands: |
||||||
|
|
||||||
|
`openssl genrsa -out rootCA.key 2048` |
||||||
|
|
||||||
|
`openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.pem -config server.csr.cnf` |
||||||
|
|
||||||
|
`openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config server.csr.cnf` |
||||||
|
|
||||||
|
`openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 3650 -sha256 -extfile v3.ext` |
||||||
@ -0,0 +1,27 @@ |
|||||||
|
-----BEGIN RSA PRIVATE KEY----- |
||||||
|
MIIEowIBAAKCAQEA4dB5aQCjCmMsW71u9F0WNm1TYjXQBZ4p7oNT+BQwCc/MZ2xc |
||||||
|
5NexS2O86nbRkw5jwyfAAMSMKRr9s2FluVTHqiln78rg+XUgmrmNT3ZroLmW6QL6 |
||||||
|
Ca8dbMPky+tQclZsvMd3HAeCyyrs4pf7wM1AyUJD7H0xAlVD1fsohkg7jhBFUfV+ |
||||||
|
q2VMMdnsaV5vFrW/2vPBWz1SNPW/Xm+Ilny7xg9njQLcPMNtVtF+7EPB6sxD6qrj |
||||||
|
BC+Kj5zQ3bZOfdrh7yy63dbh/Kh+3NScgO+k+x92HlAjRIvj5y4KrbGZl7CmOth5 |
||||||
|
y7fPywApVbDfZRWJChI1PVflOyDdnC+vhMLbHQIDAQABAoIBAEmjrrQrXP/6L3EL |
||||||
|
aa+O27uME3Enk1sBpTL+6Ncx3iiU91eS4whNvqeTMvxTGy0VuDrgL6EQd5TAFJP2 |
||||||
|
4zF5EFPRhO+R/aPcKnHKqOaM+7RCUZBTRC78SGA70dUeO/HNdVBqy9D8Mg8HRJDw |
||||||
|
d0z8om//iB8LBHx6SdDyQtjnnWRKFTzQRurBBoyLe2vPMFtINKtNUkahjc8HE4GO |
||||||
|
aIv1LICJUzf4ZnkntKd5cFHZ42R2Tmfj0Y9G9DyJbuSA3+0u5IhYB39Uy6jFxLi8 |
||||||
|
I5PoIVhgYZ0aivsVBIviShwQ9kgv6807YBxt22eSNovBDrSp+cAnIF9+p0b3MnkU |
||||||
|
aCHSiBECgYEA84lssi6AqfCEsSiQMSM9kMCXJ4KQI/l7pmrIA50+V5HSEby9lg2Y |
||||||
|
N6XJ4V4q46t8FcZBjmMvzn9fwiPMRw5e995cVNBQ31a1FX/1Hy6RNtEiLZRnkHI5 |
||||||
|
WznY9IxQ+c9JXJeFY1sO0BfO0TS3WvOf1rwqOb92q+cQaItnPQ+4Ya8CgYEA7V7e |
||||||
|
IqW3PpO4H+c5hH9egM0BjAxH71C9YpYzZpF9uiPIkuMnJ8nm9bB6RiuDaYCxvrfE |
||||||
|
A0h/SQewoYJKL4OfKGjrbG7U4zLMZHIWlf8Za55Zik5BNjvgBqFFrrSgLUGxdRTX |
||||||
|
N0+TlWlW1bvJblWpdjIbJbg/6kCU98TzK852fvMCgYAWYa/apElw1MjtGyQ9T9bN |
||||||
|
odWCbQ5gMAJ8Jd4h7uaW17DtrmHiE3fEzXjDPItGhzENMz49HsJ7ANvFFNMmSJzT |
||||||
|
vNzRcp+sFuTnh+34Iqh32DqC49usu8KnrqZQu0CJ5NICL26z1d+DolyAf47GThOH |
||||||
|
gZ2D1yPJ4p9wbDddtj8kwwKBgCFKB68mPG+rOcxHmjppvnAj0A66/i+izBySYf0F |
||||||
|
dHNxZ0SqVKhw2VIlgNBsc86M/OB5VyT6utccG/paklrdg6mgJTwcwwBl9GI12dMJ |
||||||
|
ZqBAIeCSnvSjKwTjAynALSKLrv5zgMdCArmWf1YUMuilXNG1rzb4AwawLfQdi9jd |
||||||
|
6KJfAoGBALFl6ldywl3sGPk9K2xCDYYhb1TNQyheA5YvoZzZ6XCo1q0Lbwy/FamZ |
||||||
|
0TSWkoEmGB/Hck3HgtZDRo3CTI1vYfbpAtgI7oD1NA1zMaLulNQxKjH3iVvyb+R7 |
||||||
|
ZcIT7EVPZgkUwr0bsp22yVDekh/CHoB6FZPCyoAb8WnfJfooTBzB |
||||||
|
-----END RSA PRIVATE KEY----- |
||||||
@ -0,0 +1,23 @@ |
|||||||
|
-----BEGIN CERTIFICATE----- |
||||||
|
MIID1jCCAr4CCQCG4JBeSi6cDjANBgkqhkiG9w0BAQsFADCBrDELMAkGA1UEBhMC |
||||||
|
VVMxFDASBgNVBAgMC1JhbmRvbVN0YXRlMRMwEQYDVQQHDApSYW5kb21DaXR5MRsw |
||||||
|
GQYDVQQKDBJSYW5kb21Pcmdhbml6YXRpb24xHzAdBgNVBAsMFlJhbmRvbU9yZ2Fu |
||||||
|
aXphdGlvblVuaXQxIDAeBgkqhkiG9w0BCQEWEWhlbGxvQGV4YW1wbGUuY29tMRIw |
||||||
|
EAYDVQQDDAlsb2NhbGhvc3QwHhcNMjIxMDA3MjIwNjQwWhcNMzIxMDA0MjIwNjQw |
||||||
|
WjCBrDELMAkGA1UEBhMCVVMxFDASBgNVBAgMC1JhbmRvbVN0YXRlMRMwEQYDVQQH |
||||||
|
DApSYW5kb21DaXR5MRswGQYDVQQKDBJSYW5kb21Pcmdhbml6YXRpb24xHzAdBgNV |
||||||
|
BAsMFlJhbmRvbU9yZ2FuaXphdGlvblVuaXQxIDAeBgkqhkiG9w0BCQEWEWhlbGxv |
||||||
|
QGV4YW1wbGUuY29tMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEB |
||||||
|
AQUAA4IBDwAwggEKAoIBAQDh0HlpAKMKYyxbvW70XRY2bVNiNdAFninug1P4FDAJ |
||||||
|
z8xnbFzk17FLY7zqdtGTDmPDJ8AAxIwpGv2zYWW5VMeqKWfvyuD5dSCauY1Pdmug |
||||||
|
uZbpAvoJrx1sw+TL61ByVmy8x3ccB4LLKuzil/vAzUDJQkPsfTECVUPV+yiGSDuO |
||||||
|
EEVR9X6rZUwx2expXm8Wtb/a88FbPVI09b9eb4iWfLvGD2eNAtw8w21W0X7sQ8Hq |
||||||
|
zEPqquMEL4qPnNDdtk592uHvLLrd1uH8qH7c1JyA76T7H3YeUCNEi+PnLgqtsZmX |
||||||
|
sKY62HnLt8/LAClVsN9lFYkKEjU9V+U7IN2cL6+EwtsdAgMBAAEwDQYJKoZIhvcN |
||||||
|
AQELBQADggEBAN6g0qit/3R2X+KdR0LgRXF/h4qQFgcV6cxnhRAmLIDNJlxKSHqN |
||||||
|
IE5+bxzCbkblzGfr/jNPqW0s+yaN4CyMgKNYSzkLBPE4FF+19Uv+dyYfFms3mDJ7 |
||||||
|
0rGjS5bCscThWhpaSw20LcwQcr/+X+/fGzJ01dVFK1UOjBKg4d4dMwxklbIkZqIq |
||||||
|
siRW0GMy26mgVZ/BSjeh5kEjs6h6H3cJsGl7xYT+BI7wnxHwGeT9tkBgiyT5FwaS |
||||||
|
vtdZkBpQ9q8f7FwsEm3woLHdWuOnrtUtVpY/oc6WFGdROQdGzjSk0D3kHs9YhueC |
||||||
|
GSzZKrqX+TSIgpPrLYNHX4uxlo5TAwP/5GM= |
||||||
|
-----END CERTIFICATE----- |
||||||
@ -0,0 +1,29 @@ |
|||||||
|
-----BEGIN CERTIFICATE----- |
||||||
|
MIIE5TCCA82gAwIBAgIJAMGzXwBRpkG7MA0GCSqGSIb3DQEBCwUAMIGsMQswCQYD |
||||||
|
VQQGEwJVUzEUMBIGA1UECAwLUmFuZG9tU3RhdGUxEzARBgNVBAcMClJhbmRvbUNp |
||||||
|
dHkxGzAZBgNVBAoMElJhbmRvbU9yZ2FuaXphdGlvbjEfMB0GA1UECwwWUmFuZG9t |
||||||
|
T3JnYW5pemF0aW9uVW5pdDEgMB4GCSqGSIb3DQEJARYRaGVsbG9AZXhhbXBsZS5j |
||||||
|
b20xEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0yMjEwMDcyMjA3MDhaFw0zMjEwMDQy |
||||||
|
MjA3MDhaMIGsMQswCQYDVQQGEwJVUzEUMBIGA1UECAwLUmFuZG9tU3RhdGUxEzAR |
||||||
|
BgNVBAcMClJhbmRvbUNpdHkxGzAZBgNVBAoMElJhbmRvbU9yZ2FuaXphdGlvbjEf |
||||||
|
MB0GA1UECwwWUmFuZG9tT3JnYW5pemF0aW9uVW5pdDEgMB4GCSqGSIb3DQEJARYR |
||||||
|
aGVsbG9AZXhhbXBsZS5jb20xEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZI |
||||||
|
hvcNAQEBBQADggEPADCCAQoCggEBAMuKdpXP87Q7Kg3iafXzvBuVIyV1K5UmMYiN |
||||||
|
koztkC5XrCzHaQRS/CoIb7/nUqmtAxx7RL0jzhZ93zBN4HY/Zcnrd9tXoPPxi0mG |
||||||
|
ZZWfFU6nN8nOkMHWzEbHVBmhxpfGtwmLcajQ4HrK1TZwJUn6GqclHQRy/gjxkiw5 |
||||||
|
KPqzfVOVlA6ht4KdKstKazQkWZ5gdWT4d8yrEy/IT4oaW05xALBMQ7YGjkzWKsSF |
||||||
|
6ygXI7xqF9rg9jCnUsPYg4f8ut3N0c00KjsfKOOj2dF/ZyjedQ5c0u4hHmxSo3Ka |
||||||
|
0ZTmIrMfbVXgGjxRG2HZXLpPvQKoCf/fOX8Irdr+lahFVKASxN0CAwEAAaOCAQYw |
||||||
|
ggECMIHLBgNVHSMEgcMwgcChgbKkga8wgawxCzAJBgNVBAYTAlVTMRQwEgYDVQQI |
||||||
|
DAtSYW5kb21TdGF0ZTETMBEGA1UEBwwKUmFuZG9tQ2l0eTEbMBkGA1UECgwSUmFu |
||||||
|
ZG9tT3JnYW5pemF0aW9uMR8wHQYDVQQLDBZSYW5kb21Pcmdhbml6YXRpb25Vbml0 |
||||||
|
MSAwHgYJKoZIhvcNAQkBFhFoZWxsb0BleGFtcGxlLmNvbTESMBAGA1UEAwwJbG9j |
||||||
|
YWxob3N0ggkAhuCQXkounA4wCQYDVR0TBAIwADALBgNVHQ8EBAMCBPAwGgYDVR0R |
||||||
|
BBMwEYIJbG9jYWxob3N0hwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQCWmh5ebpkm |
||||||
|
v2B1yQgarSCSSkLZ5DZSAJjrPgW2IJqCW2q2D1HworbW1Yn5jqrM9FKGnJfjCyve |
||||||
|
zBB5AOlGp+0bsZGgMRMCavgv4QhTThXUoJqqHcfEu4wHndcgrqSadxmV5aisSR4u |
||||||
|
gXnjW43o3akby+h1K40RR3vVkpzPaoC3/bgk7WVpfpPiP32E24a01gETozRb/of/ |
||||||
|
ATN3JBe0xh+e63CrPX1sago5+u3UETIoOr0fW8M/gU9GApmJiFAXwHag6j54hLCG |
||||||
|
23EtVDwmlarG8Pj+i0yru8s22QqzAJi5E0OwR4aB8tqicLKYBVfzyLCOielIBUrK |
||||||
|
OkuFKp+VjxQX |
||||||
|
-----END CERTIFICATE----- |
||||||
@ -0,0 +1,18 @@ |
|||||||
|
-----BEGIN CERTIFICATE REQUEST----- |
||||||
|
MIIC8jCCAdoCAQAwgawxCzAJBgNVBAYTAlVTMRQwEgYDVQQIDAtSYW5kb21TdGF0 |
||||||
|
ZTETMBEGA1UEBwwKUmFuZG9tQ2l0eTEbMBkGA1UECgwSUmFuZG9tT3JnYW5pemF0 |
||||||
|
aW9uMR8wHQYDVQQLDBZSYW5kb21Pcmdhbml6YXRpb25Vbml0MSAwHgYJKoZIhvcN |
||||||
|
AQkBFhFoZWxsb0BleGFtcGxlLmNvbTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN |
||||||
|
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy4p2lc/ztDsqDeJp9fO8G5UjJXUr |
||||||
|
lSYxiI2SjO2QLlesLMdpBFL8Kghvv+dSqa0DHHtEvSPOFn3fME3gdj9lyet321eg |
||||||
|
8/GLSYZllZ8VTqc3yc6QwdbMRsdUGaHGl8a3CYtxqNDgesrVNnAlSfoapyUdBHL+ |
||||||
|
CPGSLDko+rN9U5WUDqG3gp0qy0prNCRZnmB1ZPh3zKsTL8hPihpbTnEAsExDtgaO |
||||||
|
TNYqxIXrKBcjvGoX2uD2MKdSw9iDh/y63c3RzTQqOx8o46PZ0X9nKN51DlzS7iEe |
||||||
|
bFKjcprRlOYisx9tVeAaPFEbYdlcuk+9AqgJ/985fwit2v6VqEVUoBLE3QIDAQAB |
||||||
|
oAAwDQYJKoZIhvcNAQELBQADggEBADjuujIFoDJllR6Xo/w7j5vfNOeHO5GSgxF2 |
||||||
|
XnuuDOI9Tomi7vURFZNbz3VAYiehpxRxYqLwFoQUwFtux2qRuGyg0P9fP1iQXPUE |
||||||
|
QUfFXmvB80uf2bG4lkbUwnmlZLFOEwhGZyPxpvsrxp2Ei2ppkUopCkzOMsSk3m0X |
||||||
|
MC50ZsTHOxfkA3r1WmS7oE2c0p0Fvyx+UJw0URAXFvDS1X0ONgww3FxqbBbm9W37 |
||||||
|
5N4FZzGAK6j1wzuynKKXrn20YDCANXYH55PZyupfCeSZT0H0AZifWL7rz/G9uqme |
||||||
|
RzbIYc/CNQQTympjinBegQdVeB3yjVNZIvpGOuPSKQqhwFtmDFo= |
||||||
|
-----END CERTIFICATE REQUEST----- |
||||||
@ -0,0 +1,14 @@ |
|||||||
|
[req] |
||||||
|
default_bits = 2048 |
||||||
|
prompt = no |
||||||
|
default_md = sha256 |
||||||
|
distinguished_name = dn |
||||||
|
|
||||||
|
[dn] |
||||||
|
C=US |
||||||
|
ST=RandomState |
||||||
|
L=RandomCity |
||||||
|
O=RandomOrganization |
||||||
|
OU=RandomOrganizationUnit |
||||||
|
emailAddress=hello@example.com |
||||||
|
CN = localhost |
||||||
@ -0,0 +1,28 @@ |
|||||||
|
-----BEGIN PRIVATE KEY----- |
||||||
|
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDLinaVz/O0OyoN |
||||||
|
4mn187wblSMldSuVJjGIjZKM7ZAuV6wsx2kEUvwqCG+/51KprQMce0S9I84Wfd8w |
||||||
|
TeB2P2XJ63fbV6Dz8YtJhmWVnxVOpzfJzpDB1sxGx1QZocaXxrcJi3Go0OB6ytU2 |
||||||
|
cCVJ+hqnJR0Ecv4I8ZIsOSj6s31TlZQOobeCnSrLSms0JFmeYHVk+HfMqxMvyE+K |
||||||
|
GltOcQCwTEO2Bo5M1irEhesoFyO8ahfa4PYwp1LD2IOH/LrdzdHNNCo7Hyjjo9nR |
||||||
|
f2co3nUOXNLuIR5sUqNymtGU5iKzH21V4Bo8URth2Vy6T70CqAn/3zl/CK3a/pWo |
||||||
|
RVSgEsTdAgMBAAECggEAU6cxu7q+54kVbKVsdThaTF/MFR4F7oPHAd9lpuQQSOuh |
||||||
|
iLngMHXGy6OyAgYZlEDWMYN8KdwoXFgZPaoUIaVGuWk8Vnq6XOgeHfbNk2PRhwT0 |
||||||
|
yc1K80/Lnx9XMj2p+EEkgxi7eu12BSGN5ZTLzo6rG50GQwjb3WMjd2d6rybL0GjC |
||||||
|
wg2arcBk3sSMYmvZOqlAsaQmtgwkJhvhVkVfEQSD3VKF7g0dh/h3LIPyM0Ff4M67 |
||||||
|
KpLMPPwzUJ/0Z4ewAP06mMKUA86R93M+dWs2eh1oBGnRkVQdhCJLXJpuGHZ6BTiB |
||||||
|
Ry0AeorHfnVXPbtpUeAq6m5/BBl6qX0ooB08BIFwAQKBgQDqJpTZS/ZzqL6Kcs14 |
||||||
|
MyFu+7DungSxQ5oK9ju7EFSosanSk4UEa/lw992kM6nsIMwgSVQgba5zKcVMeSmk |
||||||
|
AVbpznegQD1BYCwOGwbGvkJ8jbhPy+WLbbRjWT/E6AItZgUK+fyTIcNvSehcQqsT |
||||||
|
fhgWsK7ueZCmLQfVhK1AxtvY3QKBgQDeiKuo8plsH/7IxDn7KVHBOHKPC2ZPzg03 |
||||||
|
i7La6zomiRckwwPnhicRSYsjtfCCW6Ms+uzjTEItgFM+5PdrXheeku+z/sExRtZu |
||||||
|
emqPqDomixlXDRQ6RN3gnBSk4RU+ROB1u1uBLWXqRz8Gp2zJGRxhHfYt2zefBv4w |
||||||
|
/cIuPC3cAQKBgD2UsAkGJWb9tj8LOmama+CYaUwYWvuT3+uKHuNvxBQpxZQQICet |
||||||
|
jgjb53rL66Cib4z+PBXbQsoe7jjSlNUBVS5gkq2et31+IZgEG6AhYbMIQrUZ1uD4 |
||||||
|
lTybuF289vWhoynj3T2E37VhJq89CWky/HrbNOabKiPKLAlHv5kNs7wxAoGBANEJ |
||||||
|
XQbU7J2O6Iy7FyQBSlTQq3wHX1Iz4mJ9DcNrFzK/sEfOEMrZT7WDefpPm984KW3F |
||||||
|
P+S766ZGVuxLtMbcmh9RM23HLr8VJbSdtZ/AjO9L1r/Y/1lE+49TzmibLpNRq++r |
||||||
|
0WbkuEl8J44ek6fLuMbZmDi3JeZycTCgDlnUGdgBAoGAYdliovtURZCm46t1uE3F |
||||||
|
idCLCXCccjkt1hcNGNjck/b0trHA7wOEqICIguoWDlEBTc0PDvHEq6PfKyqptGkj |
||||||
|
AgaZTMF/aZiGqlT7VRpBuzxM/uV5xzCg+i2ViaW/p3xq0z2PRljVZiEfe5aWcjiM |
||||||
|
ouTtnC3TgmcjhTgGmb48QQE= |
||||||
|
-----END PRIVATE KEY----- |
||||||
Loading…
Reference in new issue