我目前正在做一个项目,涉及从Vault获取PEM或DER格式的Elliptic Curve Certificate / Private Key package,并需要将其导入到Java Keystore中。我可以找到大量关于使用keytool执行此操作的信息,但找不到有关如何成功地将DER编码的字符串转换为PrivateKeyEntry
将其插入到密钥库中。
下面是我的非工作代码。certificate
,key
,以及issuingCa
都是PEM或DER编码的字符串(我可以指定我希望从颁发者那里得到哪种格式,并传递任何我可以使用的格式)
private KeyStore packKeystore(String certificate, String key, String issuingCa, String name) throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException {
// Create the keystore
KeyStore retVal = KeyStore.getInstance(KeyStore.getDefaultType());
retVal.load(null, sslKeystorePassword.toCharArray());
var cf = CertificateFactory.getInstance("X.509", BouncyCastleProvider.PROVIDER_NAME);
var cert = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(certificate.getBytes()));
retVal.setCertificateEntry(name, cert);
Certificate issuer = null;
if (issuingCa != null) {
issuer = cf.generateCertificate(new ByteArrayInputStream(issuingCa.getBytes(StandardCharsets.UTF_8)));
}
if (key != null) {
var certs = new HashSet();
certs.add(issuer);
certs.add(cert);
PrivateKeyEntry pk = /// How do I create this from what I have????
retVal.setKeyEntry( pk, certs.toArray());
}
return retVal;
}
经过一些实验和研究,我了解到PrivateKey
类不喜欢“旧的”PEM格式,其中的私钥看起来像- BEGIN EC private key -。
我最终能够从键对中解析出一个PrivateKey对象,如下所示:
var parsedKey = new org.bouncycastle.openssl.PEMParser(new StringReader(key)).readObject();
var pair = new org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter().getKeyPair((org.bouncycastle.openssl.PEMKeyPair) parsedKey);
retVal.setKeyEntry(name, pair.getPrivate(), "".toCharArray(), certArray);
从那里我在setKeyEntry上得到了一个关于证书算法与私钥算法不匹配的错误。经过检查,似乎Certificate对象说algo是EC,而PK对象说algo是ECDSA。
发布于 2021-02-25 07:04:50
我最终用这种方式解决了这个问题。注意密钥必须是base64编码的DER格式:
private PrivateKey convertECPrivateKeyString(String key) {
...
byte[] keyBytes = null;
if (key != null) {
keyBytes = Base64.getDecoder().decode(key);
}
try (var asnStream = new ASN1InputStream(keyBytes)) {
var primitive = asnStream.readObject();
asnStream.close();
if (primitive instanceof ASN1Sequence) {
var sequence = (ASN1Sequence) primitive;
var pKey = org.bouncycastle.asn1.sec.ECPrivateKey.getInstance(sequence);
var pkInfo = new PrivateKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, pKey.getParameters()), pKey);
return new JcaPEMKeyConverter().getPrivateKey(pkInfo);
}
}
...
}
https://stackoverflow.com/questions/66265699
复制相似问题