首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用java.security.KeyStore将椭圆曲线证书和私钥导入到Java密钥库中

使用java.security.KeyStore将椭圆曲线证书和私钥导入到Java密钥库中
EN

Stack Overflow用户
提问于 2021-02-19 02:10:06
回答 1查看 282关注 0票数 1

我目前正在做一个项目,涉及从Vault获取PEM或DER格式的Elliptic Curve Certificate / Private Key package,并需要将其导入到Java Keystore中。我可以找到大量关于使用keytool执行此操作的信息,但找不到有关如何成功地将DER编码的字符串转换为PrivateKeyEntry将其插入到密钥库中。

下面是我的非工作代码。certificatekey,以及issuingCa都是PEM或DER编码的字符串(我可以指定我希望从颁发者那里得到哪种格式,并传递任何我可以使用的格式)

代码语言:javascript
运行
复制
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对象,如下所示:

代码语言:javascript
运行
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-25 07:04:50

我最终用这种方式解决了这个问题。注意密钥必须是base64编码的DER格式:

代码语言:javascript
运行
复制
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);
      }
    } 
...
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66265699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档