Skip to content
This repository was archived by the owner on Apr 22, 2025. It is now read-only.

Commit dc2b94f

Browse files
mastersingh24cr22rc
authored andcommitted
[FAB-8606] Parse non-PKCS8 encoded TLS keys
CryptoPrimitives.bytesToPrivateKey was only parsing PKCS8 encoded keys which being with a "BEGIN EC PRIVATE KEY" header. This change addes support for parsing keys with a "BEGIN PRIVATE KEY" header. Change-Id: I5c9ba740a1f88be56df373cd206f117e005b3bde Signed-off-by: Gari Singh <gari.r.singh@gmail.com>
1 parent 625e937 commit dc2b94f

File tree

6 files changed

+55
-24
lines changed

6 files changed

+55
-24
lines changed

src/main/java/org/hyperledger/fabric/sdk/Endpoint.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import io.grpc.netty.NegotiationType;
4141
import io.grpc.netty.NettyChannelBuilder;
4242
import io.netty.handler.ssl.SslContext;
43+
import io.netty.handler.ssl.SslContextBuilder;
4344
import io.netty.handler.ssl.SslProvider;
4445
import org.apache.commons.codec.binary.Hex;
4546
import org.apache.commons.logging.Log;
@@ -76,7 +77,7 @@ class Endpoint {
7677
String sslp = null;
7778
String nt = null;
7879
byte[] pemBytes = null;
79-
X509Certificate[] clientCert = new X509Certificate[] {};
80+
X509Certificate[] clientCert = null;
8081
PrivateKey clientKey = null;
8182
Properties purl = parseGrpcUrl(url);
8283
String protocol = purl.getProperty("protocol");
@@ -200,10 +201,17 @@ class Endpoint {
200201
NegotiationType ntype = nt.equals("TLS") ? NegotiationType.TLS : NegotiationType.PLAINTEXT;
201202

202203
InputStream myInputStream = new ByteArrayInputStream(pemBytes);
203-
SslContext sslContext = GrpcSslContexts.forClient().trustManager(myInputStream)
204-
.sslProvider(sslprovider).keyManager(clientKey, clientCert).build();
205-
this.channelBuilder = NettyChannelBuilder.forAddress(addr, port).sslContext(sslContext)
206-
.negotiationType(ntype);
204+
SslContextBuilder clientContextBuilder = GrpcSslContexts.configure(SslContextBuilder.forClient(), sslprovider);
205+
if (clientKey != null && clientCert != null) {
206+
clientContextBuilder = clientContextBuilder.keyManager(clientKey, clientCert);
207+
}
208+
SslContext sslContext = clientContextBuilder
209+
.trustManager(myInputStream)
210+
.build();
211+
this.channelBuilder = NettyChannelBuilder
212+
.forAddress(addr, port)
213+
.sslContext(sslContext)
214+
.negotiationType(ntype);
207215
if (cn != null) {
208216
channelBuilder.overrideAuthority(cn);
209217
}

src/main/java/org/hyperledger/fabric/sdk/security/CryptoPrimitives.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
import org.bouncycastle.asn1.ASN1Primitive;
6868
import org.bouncycastle.asn1.ASN1Sequence;
6969
import org.bouncycastle.asn1.DERSequenceGenerator;
70+
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
7071
import org.bouncycastle.asn1.x9.ECNamedCurveTable;
7172
import org.bouncycastle.asn1.x9.X9ECParameters;
7273
import org.bouncycastle.crypto.Digest;
@@ -272,13 +273,19 @@ public PrivateKey bytesToPrivateKey(byte[] pemKey) throws CryptoException {
272273
CryptoException ce = null;
273274

274275
try {
276+
PemReader pr = new PemReader(new StringReader(new String(pemKey)));
277+
PemObject po = pr.readPemObject();
275278
PEMParser pem = new PEMParser(new StringReader(new String(pemKey)));
276-
PEMKeyPair kp = (PEMKeyPair) pem.readObject();
277-
pk = new JcaPEMKeyConverter().getPrivateKey(kp.getPrivateKeyInfo());
279+
logger.debug("found private key with type " + po.getType());
280+
if (po.getType().equals("PRIVATE KEY")) {
281+
pk = new JcaPEMKeyConverter().getPrivateKey((PrivateKeyInfo) pem.readObject());
282+
} else {
283+
PEMKeyPair kp = (PEMKeyPair) pem.readObject();
284+
pk = new JcaPEMKeyConverter().getPrivateKey(kp.getPrivateKeyInfo());
285+
}
278286
} catch (Exception e) {
279287
throw new CryptoException("Failed to convert private key bytes", e);
280288
}
281-
282289
return pk;
283290
}
284291

src/test/java/org/hyperledger/fabric/sdk/security/CryptoPrimitivesTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,16 @@ public void testBytesToPrivateKey() {
481481
}
482482
}
483483

484+
@Test
485+
public void testBytesToPrivateKeyPKCS8() {
486+
try {
487+
byte[] bytes = Files.readAllBytes(Paths.get(System.getProperty("user.dir") + "/src/test/resources/tls-client-pk8.key"));
488+
PrivateKey pk = crypto.bytesToPrivateKey(bytes);
489+
} catch (Exception e) {
490+
Assert.fail("failed to parse private key bytes: " + e.toString());
491+
}
492+
}
493+
484494
@Test
485495
public void testValidateNotSignedCertificate() {
486496
try {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIDeqhgW+fezuKdH/rZyvfHcDLP16olZ6Ny+eotH30UODoAoGCCqGSM49
3+
AwEHoUQDQgAEU5E1z3PD12Q/tB6+vAfEcnD8NFhIaPe3DMP6KosNQurERxCme92u
4+
jeJyu7wh4CNAjWaXXCEv3NKez32S1DSZzw==
5+
-----END EC PRIVATE KEY-----

src/test/resources/tls-client.crt

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
-----BEGIN CERTIFICATE-----
2-
MIIB9DCCAZqgAwIBAgIRANRocgthhzNb+AG+Kor1a9swCgYIKoZIzj0EAwIwWDEL
3-
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
4-
cmFuY2lzY28xDTALBgNVBAoTBE9yZzExDTALBgNVBAMTBE9yZzEwHhcNMTYxMjMw
5-
MTQwOTAxWhcNMjYxMjI4MTQwOTAxWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECBMK
6-
Q2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEVMBMGA1UEChMMT3Jn
7-
MS1jbGllbnQxMRUwEwYDVQQDEwxPcmcxLWNsaWVudDEwWTATBgcqhkjOPQIBBggq
8-
hkjOPQMBBwNCAARn1VE6aKXiOUOb8nnIKjXuw3iqbbDlPRyyEJE3jiN4xejPd33z
9-
vqUOoYZzc0i4O8naEQ+wji3uiPHRbhxsiGKJozUwMzAOBgNVHQ8BAf8EBAMCBaAw
10-
EwYDVR0lBAwwCgYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAKBggqhkjOPQQDAgNI
11-
ADBFAiEAvO4Q7FQQjSIaGZ9ErlVMggwjCclTjHuoD+OTGPKq2kUCIBaJcSBDvnpe
12-
B+kwGPDFlQEiUJqClG5xr6e70Nun9YT2
2+
MIICKjCCAdKgAwIBAgIQHdoThVFH8Cpj80yagaC1ZjAKBggqhkjOPQQDAjBsMQsw
3+
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
4+
YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
5+
YW1wbGUuY29tMB4XDTE4MDIwODIxMzg0M1oXDTI4MDIwNjIxMzg0M1owVjELMAkG
6+
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
7+
Y2lzY28xGjAYBgNVBAMMEUFkbWluQGV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYI
8+
KoZIzj0DAQcDQgAEATwC+h2CHiRKb1sWBixaXfvCZl+DCcfVo7mZ68KEVlyb8i3v
9+
ra7UYDwDP5UAiVEf475rfzv6i+nFKo7s5rYyL6NsMGowDgYDVR0PAQH/BAQDAgWg
10+
MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMCsG
11+
A1UdIwQkMCKAIKA2x8Bl5f6FZjCqbLr63fJWsGCt5I2dxda99KYVnk3CMAoGCCqG
12+
SM49BAMCA0YAMEMCIBKLO/U8TR73b+C23oUL7E78ksrAiOzfA73QcDNex8Y2Ah9E
13+
XEhzrEuw9aPwDpQ3gr3p9JHy21NQrKMtAByYs5Pg
1314
-----END CERTIFICATE-----

src/test/resources/tls-client.key

100644100755
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
-----BEGIN EC PRIVATE KEY-----
2-
MHcCAQEEILEK9gVnh8MFQ/haNGYxE3jpOGes/KWxPBB772JzEXXhoAoGCCqGSM49
3-
AwEHoUQDQgAEZ9VROmil4jlDm/J5yCo17sN4qm2w5T0cshCRN44jeMXoz3d9876l
4-
DqGGc3NIuDvJ2hEPsI4t7ojx0W4cbIhiiQ==
5-
-----END EC PRIVATE KEY-----
1+
-----BEGIN PRIVATE KEY-----
2+
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgteCY4ZUmq6WcPcsG
3+
DP210VN9IJi7Q/iF9s3NyViWkDyhRANCAAQBPAL6HYIeJEpvWxYGLFpd+8JmX4MJ
4+
x9WjuZnrwoRWXJvyLe+trtRgPAM/lQCJUR/jvmt/O/qL6cUqjuzmtjIv
5+
-----END PRIVATE KEY-----

0 commit comments

Comments
 (0)