Skip to content

Commit

Permalink
Merge pull request fabric8io#730 from shiroari/private-key-support
Browse files Browse the repository at this point in the history
PR merged! Thanks!
  • Loading branch information
fusesource-ci authored Mar 19, 2017
2 parents d2fcb56 + 867de85 commit 1de4b2b
Show file tree
Hide file tree
Showing 9 changed files with 236 additions and 13 deletions.
4 changes: 4 additions & 0 deletions doc/changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# ChangeLog

* **0.20.1**
- Add support for PKCS#8 private keys in pem.key file.
- Improve resource management for certificates and keys.

* **0.20.0** (2017-02-17)
- Removed `build-nofork` and `source-nofork` in favor for a more direct solution which prevents forking of the lifecycle. Please refer the documentation, chapter "Assembly" for more information about this.

Expand Down
40 changes: 27 additions & 13 deletions src/main/java/io/fabric8/maven/docker/access/KeyStoreUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@
import java.security.*;
import java.security.cert.Certificate;
import java.security.cert.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.ArrayList;
import java.util.Collection;

import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;

import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;

/**
* Utility class for building up a keystore which can be used in
* SSL communication.
Expand Down Expand Up @@ -41,28 +43,40 @@ public static KeyStore createDockerKeyStore(String certPath) throws IOException,
return keyStore;
}

public static PrivateKey loadPrivateKey(String keyPath) throws IOException, GeneralSecurityException {
PEMKeyPair keyPair = loadPEM(keyPath);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyPair.getPrivateKeyInfo().getEncoded());
return KeyFactory.getInstance("RSA").generatePrivate(keySpec);
static PrivateKey loadPrivateKey(String keyPath) throws IOException, GeneralSecurityException {
try (Reader reader = new FileReader(keyPath);
PEMParser parser = new PEMParser(reader)) {
Object readObject = parser.readObject();
if (readObject instanceof PEMKeyPair) {
PEMKeyPair keyPair = (PEMKeyPair) readObject;
return generatePrivateKey(keyPair.getPrivateKeyInfo());
} else if (readObject instanceof PrivateKeyInfo) {
return generatePrivateKey((PrivateKeyInfo) readObject);
}
}
throw new GeneralSecurityException("Cannot generate private key from file: " + keyPath);
}

private static PEMKeyPair loadPEM(String keyPath) throws IOException {
PEMParser parser = new PEMParser(new BufferedReader(new FileReader(keyPath)));
return (PEMKeyPair) parser.readObject();
private static PrivateKey generatePrivateKey(PrivateKeyInfo keyInfo) throws IOException, NoSuchAlgorithmException,
InvalidKeySpecException {
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyInfo.getEncoded());
return KeyFactory.getInstance("RSA").generatePrivate(keySpec);
}

private static void addCA(KeyStore keyStore, String caPath) throws KeyStoreException, FileNotFoundException, CertificateException {
private static void addCA(KeyStore keyStore, String caPath) throws IOException, KeyStoreException,
CertificateException {
for (Certificate cert : loadCertificates(caPath)) {
X509Certificate crt = (X509Certificate) cert;
String alias = crt.getSubjectX500Principal().getName();
keyStore.setCertificateEntry(alias, crt);
}
}

private static Certificate[] loadCertificates(String certPath) throws FileNotFoundException, CertificateException {
InputStream is = new FileInputStream(certPath);
Collection<? extends Certificate> certs = CertificateFactory.getInstance("X509").generateCertificates(is);
return new ArrayList<>(certs).toArray(new Certificate[certs.size()]);
private static Certificate[] loadCertificates(String certPath) throws IOException, CertificateException {
try (InputStream is = new FileInputStream(certPath)) {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X509");
Collection<? extends Certificate> certs = certificateFactory.generateCertificates(is);
return certs.toArray(new Certificate[certs.size()]);
}
}
}
55 changes: 55 additions & 0 deletions src/test/java/io/fabric8/maven/docker/access/KeyStoreUtilTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package io.fabric8.maven.docker.access;

import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.PrivateKey;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

import static org.junit.Assert.assertNotNull;

/**
* @author Stas Sukhanov
* @since 08.03.2017
*/
public class KeyStoreUtilTest {

@Rule
public ExpectedException exception = ExpectedException.none();

@Test
public void createKeyStore() throws Exception {
KeyStore keyStore = KeyStoreUtil.createDockerKeyStore(getFile("certpath"));
KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry("docker",
new KeyStore.PasswordProtection("docker".toCharArray()));
assertNotNull(pkEntry);
assertNotNull(pkEntry.getCertificate());
assertNotNull(keyStore.getCertificate("cn=ca-test,o=internet widgits pty ltd,st=some-state,c=cr"));
assertNotNull(keyStore.getCertificate("cn=ca-test-2,o=internet widgits pty ltd,st=some-state,c=cr"));
}

@Test
public void loadPrivateKeyDefault() throws Exception {
PrivateKey privateKey = KeyStoreUtil.loadPrivateKey(getFile("keys/pkcs1.pem"));
assertNotNull(privateKey);
}

@Test
public void loadPrivateKeyPKCS8() throws Exception {
PrivateKey privateKey = KeyStoreUtil.loadPrivateKey(getFile("keys/pkcs8.pem"));
assertNotNull(privateKey);
}

@Test
public void loadInvalidPrivateKey() throws Exception {
exception.expect(GeneralSecurityException.class);
exception.expectMessage("Cannot generate private key");
KeyStoreUtil.loadPrivateKey(getFile("keys/invalid.pem"));
}

private String getFile(String path) {
return KeyStoreUtilTest.class.getResource(path).getFile();
}
}
48 changes: 48 additions & 0 deletions src/test/resources/io/fabric8/maven/docker/access/certpath/ca.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
-----BEGIN CERTIFICATE-----
MIID7TCCAtWgAwIBAgIJAL2CQAue4q4FMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNV
BAYTAkNSMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQxEDAOBgNVBAMTB2NhLXRlc3QwHhcNMTcwMzA5MTQwNzUw
WhcNMTcwNDA4MTQwNzUwWjBXMQswCQYDVQQGEwJDUjETMBEGA1UECBMKU29tZS1T
dGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRAwDgYDVQQD
EwdjYS10ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2wDXfSG6
HvtguxTuUvbJSKAtH6E/rINjmtJqrtWVBXOjzuQxQuXiiqRnpvr+l4SgpG2RZ1WI
l2zKAmcBThXqoF04v3NGX8j2M+532+tcRsG0I5lAcCrCih0jzUPAJfSxXpyYYLdh
E9f9YPQURD1V9ReeqGj/LI9Dyk8T9GSFP3x2k3kk2V4Py0GIIoumGIYPhS98FcqC
g1pPPjuVnSNJLMMDwkp82VI3zNb90NDIbNALWgoowAxn3KlTsUH/mHXyBHk3AZe+
HszKShhBg+mxPBgQaF3QLHqPt8fR5nY0rS7bxWKTkCPSptJo1snEw61L9aqkYYih
fp9UtY1H74HDhQIDAQABo4G7MIG4MB0GA1UdDgQWBBRVn/zXNPQ59p1OB3m+va0T
R+aSnTCBiAYDVR0jBIGAMH6AFFWf/Nc09Dn2nU4Heb69rRNH5pKdoVukWTBXMQsw
CQYDVQQGEwJDUjETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJu
ZXQgV2lkZ2l0cyBQdHkgTHRkMRAwDgYDVQQDEwdjYS10ZXN0ggkAvYJAC57irgUw
DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAmhDR/NgPif0m48rtCZiN
SNHA5a9GkjXUuWnqVGIEpcYa6VR0mkUG7Tu6gtGY/Ev+Jcjw/8+pMNXMrdLt/Bmz
uz4ZiWKKcB42PYyqCZzut/MtQcs5pBm8cYyQzPFwngb3AJ+/aD942TK+kxZwHSM2
DGJ9j5W1vr7agJemileSKkgSm+iHdg7Wf5fg9PQpRnZcJYB1rM77erFg24yX/I4p
GE2kRNB69tVEQfxi/Pb8bX2SALC9J/UyvDSZhTZDZVK9jX7lXSmam+uIeY7yVPsC
QruOo8I5Bhcgrku/WBViNWdHCOvFk1uGhdFElNun6n8/4yshnV4GCzwgYTlBZoHr
dQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID9DCCAtygAwIBAgIJAIjDwFs6JTALMA0GCSqGSIb3DQEBCwUAMFkxCzAJBgNV
BAYTAkNSMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMTCWNhLXRlc3QtMjAeFw0xNzAzMDkxNDMw
MjlaFw0xNzA0MDgxNDMwMjlaMFkxCzAJBgNVBAYTAkNSMRMwEQYDVQQIEwpTb21l
LVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNV
BAMTCWNhLXRlc3QtMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPbi
nFVvaRRrDoD5tj/nv8i6T3xptwPLTP83gdFSuuUCuNybaU1q+RWMXpX/Bu1m9y/Q
G1VJOSVZRna84EOr2dFazHxo/YbGFmnAnPzKyEuJ15mQWGaN0hlB3QH2v6mYDIVN
IUWCa3gP+7cBeFRp+ow0HOvFYHWQ0rCaAop/Nr100jyl4JzI3vr/Ur9fcV9cBFKz
0L+mp65psZ9h63KCyxpinHZ/TZ87sqqSLbIJTzhYgqYUWSiDoX3CyQdyNPf7lM+0
2yoFT/RGSJ0fzY4hv77itQWKTTSMLKWbx6V56OadxO5zQVj3vw/gHstMTvurbWbC
aaTB/4VCfDrQqt6QCe0CAwEAAaOBvjCBuzAdBgNVHQ4EFgQUdFO4RZDq+vcXE1Gu
B7vLKf9jP+wwgYsGA1UdIwSBgzCBgIAUdFO4RZDq+vcXE1GuB7vLKf9jP+yhXaRb
MFkxCzAJBgNVBAYTAkNSMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJ
bnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMTCWNhLXRlc3QtMoIJAIjD
wFs6JTALMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAGJ/YQQVQCqZ
OONpYd6nisL8AtbDXQ5r/j6JWup297YcvzseQOfglGUcD0QZ+rcI4F55RcAvqRM3
ifUXVh6h1OBxV6H6GSqcxanqy6T9G2iMjkz7DMSS9UJrFmGgYCysnB/YlTvlgcR6
hIbL4mLwLG1PFUrcHiOJkgDMUgveTfGN4AiBqBWTAKCiaCVJRlbAS1hVD1xoJARa
PsoSJ9XXoe7PoQrLdXcrp0xw8GtCJuW2pDuY2RCprZ2tS+CMD5rs0eL4tGgBc7IY
iqd7oqLXUSXlr9vZAp6FkLlNanz045m5MeTetSo9Fcm+nn3ydDInmxBsAiyOZTI6
HUvV0zFTq+U=
-----END CERTIFICATE-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDAjCCAeqgAwIBAgIJAP9/tvpflc6RMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNV
BAYTAkNSMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQxEDAOBgNVBAMTB2NhLXRlc3QwHhcNMTcwMzA5MTQyMTU2
WhcNMTcwNDA4MTQyMTU2WjARMQ8wDQYDVQQDEwZjbGllbnQwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQCYJt9YNe8zTA6Bctiemw85snVZqkAVe6Xrc/he
RRHH89+jxHgS8arLpfffdyMGGYOC6R/4tSS8hCu/3J0S8CZgOfRwnzOWOyt0UbKt
t6m8RmV7fNnuNVCXdHMZB+W7gK75YDqbYnHHvacDu9o3CA2tguTgWYM2XcDfTu72
IYhvT3TwMuWPK8oKDs5IKeez/F+dYQ9GA1WYWPIsOVAbclfxWcrTg80NqvzVfttG
rqExBOXHnCwuiPTg3X41CFwOSkTya0PZ94dq3819Q77FEsXZzrN4fgQA+WX9KTCk
d5oONI0R870Cz3PjS5/aQm5CLPle/AxwjwQLY3f8rUxrwnI5AgMBAAGjFzAVMBMG
A1UdJQQMMAoGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQDILcvBMHz8R8NO
D3vuHtobRH2bI2PTnxY9immRAoiLB26VdxPGU/aPHKJwj3BvJEC6W4ZX9nNW5Ua7
WTB+A6TlQ9XN3qL1izK/+C8eA0KDj+UVzq8ZlLzgjz80ZPtzMVBRGFBCWmuTFH0k
64fH4I+v2tXxSqVbIQ7R/LauaRrRIzMZNwERdQ4RFDhxIRFCCYu3HWw+Wa9OrFxW
bm9zFwHfBF0jnhV9RcFqLkUtDM+1oN+BKrwFqASQHEm4W4SAec8K7/IaijFRyYLl
N2dKfmPsBnuhiMiNWbHKUESWoVy4J7rkFlUKxKczlOZYQjQuyI8JlpKu80AxZPlg
BksOkH+8
-----END CERTIFICATE-----
27 changes: 27 additions & 0 deletions src/test/resources/io/fabric8/maven/docker/access/certpath/key.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAmCbfWDXvM0wOgXLYnpsPObJ1WapAFXul63P4XkURx/Pfo8R4
EvGqy6X333cjBhmDgukf+LUkvIQrv9ydEvAmYDn0cJ8zljsrdFGyrbepvEZle3zZ
7jVQl3RzGQflu4Cu+WA6m2Jxx72nA7vaNwgNrYLk4FmDNl3A307u9iGIb0908DLl
jyvKCg7OSCnns/xfnWEPRgNVmFjyLDlQG3JX8VnK04PNDar81X7bRq6hMQTlx5ws
Loj04N1+NQhcDkpE8mtD2feHat/NfUO+xRLF2c6zeH4EAPll/SkwpHeaDjSNEfO9
As9z40uf2kJuQiz5XvwMcI8EC2N3/K1Ma8JyOQIDAQABAoIBAQCRCKTnienshPhi
zp3MelRGFGWmRhJ2J/pd+ZrsCXzMlBw/GH242SKMozUnj4IUQ2fH9v7h7ZIKHRcy
+VHFBqQeH8BxRmA/OUHPzDy9ORCUBqqfzsBSQAIFjRxV5OBJHn4r+l2DVpDM7Gxy
s7Nrt8KJ/fa8ILdhsHa0pqJEfmx2ZNfpLT0ih6Nbp59HtwucQxvodOJkKIwzv9GC
QCD/N8UGnYoyfUB4dgxqMyN16mY5/wZlCLJj7e7JRQ08gCAjQ/Ox4anWioO3qEf+
p9EaV2yPhnyX13A21BIphL/Ue0IkEOSYF7ukgjGwRozUk2VPTz38eEgDUHJ41/Pp
xtHF8zr9AoGBAMkTjcEfV/gdYZNeqHrMw1vRI2a3L+Fu0PfwRHjsHXtlrtUcWjTL
31/6FF+JlwXN4qptGdtn1jqTXEuL/n9pc3F9ngC/y0uxqt7MIuFyJphgNLXCBnIJ
LSZu2yVo7rY35TxHBxD+243EPtDfGn61LrDi5XdoMW4kk1WoIsTlTCjzAoGBAMG2
OgWb+I/wXFu6C+NX9hMt1EHGMFsWASv+pz3fbnsHxC7ktGhAU4D1It6sjskhaAzf
+jGc98hbk9l2jyCLZiZ310pz+hLsjr1Ect5fUQoo1OoP3eP1KnNrrIHcnE6xVImn
vAbeeEsIxubogF1lbg1cg0Xd8kES6KcgwMEyKgMjAoGBAJoZpD/nd5GtYsSAfPpv
xyCs7UahCc7pELmTp8ZMnmOdkBm/OtrPjAeQLuDxH47RNO+L4Y8myyXlHYzAY3De
Lh1COj80vebq6JsLM4g35aBNytepNStcIQAdYVIQUzHPMJ27iYza5QSG6+VDtph4
3qmtmlKixY819LxmuQ7Q9EdFAoGAA+8igIipZKr6BTbjFOvtaHhOzkMrKj5pKa6T
UPNfuAnxVw54B4H+8CiKW8FfaQBPr6tA1o8cjSom94yr3XpXScK3UaDHXGkHgRqJ
xrBi4fTwVgyacg3BnfR63WxQlFyPnfgVHoKYKNX1zCy+pqbvtD/DvsCCMgYjSXml
0IanSccCgYEAi4yucdsXNznykCQvXTuRAVS35ZOQqlvomsbihcYDck/wxBNuUJ92
bpn/IR9ugJngUemERky2XF133/2jO5bXVIc2QAb8aoYCYH8l6J0DvTdyuDyejvGy
I+CmnrWLC0JviALefRIsappdiwhUJ71R40Hc9YI8Ba0MeKBL5RU7a3E=
-----END RSA PRIVATE KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
some text
27 changes: 27 additions & 0 deletions src/test/resources/io/fabric8/maven/docker/access/keys/pkcs1.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAmCbfWDXvM0wOgXLYnpsPObJ1WapAFXul63P4XkURx/Pfo8R4
EvGqy6X333cjBhmDgukf+LUkvIQrv9ydEvAmYDn0cJ8zljsrdFGyrbepvEZle3zZ
7jVQl3RzGQflu4Cu+WA6m2Jxx72nA7vaNwgNrYLk4FmDNl3A307u9iGIb0908DLl
jyvKCg7OSCnns/xfnWEPRgNVmFjyLDlQG3JX8VnK04PNDar81X7bRq6hMQTlx5ws
Loj04N1+NQhcDkpE8mtD2feHat/NfUO+xRLF2c6zeH4EAPll/SkwpHeaDjSNEfO9
As9z40uf2kJuQiz5XvwMcI8EC2N3/K1Ma8JyOQIDAQABAoIBAQCRCKTnienshPhi
zp3MelRGFGWmRhJ2J/pd+ZrsCXzMlBw/GH242SKMozUnj4IUQ2fH9v7h7ZIKHRcy
+VHFBqQeH8BxRmA/OUHPzDy9ORCUBqqfzsBSQAIFjRxV5OBJHn4r+l2DVpDM7Gxy
s7Nrt8KJ/fa8ILdhsHa0pqJEfmx2ZNfpLT0ih6Nbp59HtwucQxvodOJkKIwzv9GC
QCD/N8UGnYoyfUB4dgxqMyN16mY5/wZlCLJj7e7JRQ08gCAjQ/Ox4anWioO3qEf+
p9EaV2yPhnyX13A21BIphL/Ue0IkEOSYF7ukgjGwRozUk2VPTz38eEgDUHJ41/Pp
xtHF8zr9AoGBAMkTjcEfV/gdYZNeqHrMw1vRI2a3L+Fu0PfwRHjsHXtlrtUcWjTL
31/6FF+JlwXN4qptGdtn1jqTXEuL/n9pc3F9ngC/y0uxqt7MIuFyJphgNLXCBnIJ
LSZu2yVo7rY35TxHBxD+243EPtDfGn61LrDi5XdoMW4kk1WoIsTlTCjzAoGBAMG2
OgWb+I/wXFu6C+NX9hMt1EHGMFsWASv+pz3fbnsHxC7ktGhAU4D1It6sjskhaAzf
+jGc98hbk9l2jyCLZiZ310pz+hLsjr1Ect5fUQoo1OoP3eP1KnNrrIHcnE6xVImn
vAbeeEsIxubogF1lbg1cg0Xd8kES6KcgwMEyKgMjAoGBAJoZpD/nd5GtYsSAfPpv
xyCs7UahCc7pELmTp8ZMnmOdkBm/OtrPjAeQLuDxH47RNO+L4Y8myyXlHYzAY3De
Lh1COj80vebq6JsLM4g35aBNytepNStcIQAdYVIQUzHPMJ27iYza5QSG6+VDtph4
3qmtmlKixY819LxmuQ7Q9EdFAoGAA+8igIipZKr6BTbjFOvtaHhOzkMrKj5pKa6T
UPNfuAnxVw54B4H+8CiKW8FfaQBPr6tA1o8cjSom94yr3XpXScK3UaDHXGkHgRqJ
xrBi4fTwVgyacg3BnfR63WxQlFyPnfgVHoKYKNX1zCy+pqbvtD/DvsCCMgYjSXml
0IanSccCgYEAi4yucdsXNznykCQvXTuRAVS35ZOQqlvomsbihcYDck/wxBNuUJ92
bpn/IR9ugJngUemERky2XF133/2jO5bXVIc2QAb8aoYCYH8l6J0DvTdyuDyejvGy
I+CmnrWLC0JviALefRIsappdiwhUJ71R40Hc9YI8Ba0MeKBL5RU7a3E=
-----END RSA PRIVATE KEY-----
28 changes: 28 additions & 0 deletions src/test/resources/io/fabric8/maven/docker/access/keys/pkcs8.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCYJt9YNe8zTA6B
ctiemw85snVZqkAVe6Xrc/heRRHH89+jxHgS8arLpfffdyMGGYOC6R/4tSS8hCu/
3J0S8CZgOfRwnzOWOyt0UbKtt6m8RmV7fNnuNVCXdHMZB+W7gK75YDqbYnHHvacD
u9o3CA2tguTgWYM2XcDfTu72IYhvT3TwMuWPK8oKDs5IKeez/F+dYQ9GA1WYWPIs
OVAbclfxWcrTg80NqvzVfttGrqExBOXHnCwuiPTg3X41CFwOSkTya0PZ94dq3819
Q77FEsXZzrN4fgQA+WX9KTCkd5oONI0R870Cz3PjS5/aQm5CLPle/AxwjwQLY3f8
rUxrwnI5AgMBAAECggEBAJEIpOeJ6eyE+GLOncx6VEYUZaZGEnYn+l35muwJfMyU
HD8YfbjZIoyjNSePghRDZ8f2/uHtkgodFzL5UcUGpB4fwHFGYD85Qc/MPL05EJQG
qp/OwFJAAgWNHFXk4Ekefiv6XYNWkMzsbHKzs2u3won99rwgt2GwdrSmokR+bHZk
1+ktPSKHo1unn0e3C5xDG+h04mQojDO/0YJAIP83xQadijJ9QHh2DGozI3XqZjn/
BmUIsmPt7slFDTyAICND87HhqdaKg7eoR/6n0RpXbI+GfJfXcDbUEimEv9R7QiQQ
5JgXu6SCMbBGjNSTZU9PPfx4SANQcnjX8+nG0cXzOv0CgYEAyRONwR9X+B1hk16o
eszDW9EjZrcv4W7Q9/BEeOwde2Wu1RxaNMvfX/oUX4mXBc3iqm0Z22fWOpNcS4v+
f2lzcX2eAL/LS7Gq3swi4XImmGA0tcIGcgktJm7bJWjutjflPEcHEP7bjcQ+0N8a
frUusOLld2gxbiSTVagixOVMKPMCgYEAwbY6BZv4j/BcW7oL41f2Ey3UQcYwWxYB
K/6nPd9uewfELuS0aEBTgPUi3qyOySFoDN/6MZz3yFuT2XaPIItmJnfXSnP6EuyO
vURy3l9RCijU6g/d4/Uqc2usgdycTrFUiae8Bt54SwjG5uiAXWVuDVyDRd3yQRLo
pyDAwTIqAyMCgYEAmhmkP+d3ka1ixIB8+m/HIKztRqEJzukQuZOnxkyeY52QGb86
2s+MB5Au4PEfjtE074vhjybLJeUdjMBjcN4uHUI6PzS95uromwsziDfloE3K16k1
K1whAB1hUhBTMc8wnbuJjNrlBIbr5UO2mHjeqa2aUqLFjzX0vGa5DtD0R0UCgYAD
7yKAiKlkqvoFNuMU6+1oeE7OQysqPmkprpNQ81+4CfFXDngHgf7wKIpbwV9pAE+v
q0DWjxyNKib3jKvdeldJwrdRoMdcaQeBGonGsGLh9PBWDJpyDcGd9HrdbFCUXI+d
+BUegpgo1fXMLL6mpu+0P8O+wIIyBiNJeaXQhqdJxwKBgQCLjK5x2xc3OfKQJC9d
O5EBVLflk5CqW+iaxuKFxgNyT/DEE25Qn3Zumf8hH26AmeBR6YRGTLZcXXff/aM7
ltdUhzZABvxqhgJgfyXonQO9N3K4PJ6O8bIj4KaetYsLQm+IAt59Eixqml2LCFQn
vVHjQdz1gjwFrQx4oEvlFTtrcQ==
-----END PRIVATE KEY-----

0 comments on commit 1de4b2b

Please sign in to comment.