当前位置: 首页 > 知识库问答 >
问题:

使用KeyStore将椭圆曲线证书和私钥导入JavaKeystorejava.security.

鲜于阳
2023-03-14

我目前正在从事一个项目,涉及从Vault获取PEM或DER格式的椭圆曲线证书/私钥包,并需要将其导入Java密钥库。我可以找到大量关于使用keytools执行此操作的信息,但无法找到有关如何成功将DER编码字符串转换为Private ateKeyEntry以将其插入密钥库的信息。

下面是我的非工作代码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<Certificate>();
      certs.add(issuer);
      certs.add(cert);
      PrivateKeyEntry pk = /// How do I create this from what I have???? 
     
      retVal.setKeyEntry( pk, certs.toArray());
    }

    return retVal;
  }

经过一些实验和研究,我了解到Private ateKey类不喜欢私钥看起来像----BEGIN EC PRIVATE KEY-----的“旧”PEM格式。

我最终能够从这样的密钥对解析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错误。经检查,证书对象似乎表示algo为EC,PK对象表示algo为ECDSA。


共有1个答案

欧浩淼
2023-03-14

我最终以这种方式解决了它。请注意,密钥必须是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);
      }
    } 
...
  }
 类似资料:
  • 我能够使用带RSA私钥的bouncy castle和“SHA256withRSA”算法对证书进行签名。我使用下面的链接作为参考来实现这一点。使用Bouncy Castle签署CSR 现在我有椭圆曲线密钥与ECDSA签署我的CA。因此,我想通过这些CA用EC密钥和“SHA256 with ECDSA”算法签署证书。然而,我被困在下面的片段特定于RSA密钥,我想使用EC密钥。 请帮助我如何使用ECDS

  • 我正在使用Ruby 2.5.x OpenSSL库研究椭圆曲线。我可以很容易地使用 但是给定一个私钥,我想重新生成公钥。 我知道OpenSSL可以做到这一点,因为命令行允许您这样做,Ruby比特币项目也可以做到这一点。但是Ruby比特币项目使用FFI而不是Ruby提供的接口有自己的OpenSSL接口。 Ruby 2.5.x openssl 库是否没有公开足够的 OpenSSL 接口,以便能够从私钥生

  • 问题内容: 该BouncyCastle的加密API允许创建和使用的常规验证数字签名包对象,如,和它们的容器。 假设我使用OpenSSL创建一个.pem(或更简单的话是一个.der文件),其中包含要在应用程序中使用的椭圆曲线私钥。例如,它看起来像这样: 如何使用BouncyCastle API获取同时包含此私钥和相应公钥的? 请注意,我要使用BouncyCastle 1.50(在撰写本文时为最新)中

  • BouncyCastle加密API允许使用常规的<code>java创建和验证数字签名。安全性包对象,如,及其容器<code>java.security.KeyPair。 假设我使用OpenSSL创建了一个. pem(或者更简单的. der文件),其中包含了我希望在应用程序中使用的椭圆曲线私钥。例如,它看起来像这样: 我如何使用BouncyCastle APIs来获取包含此私钥和相应公钥的< co

  • 我正在处理一些ECC加密问题。 目标是用C或bash编写程序,它将以由128个十六进制字符组成的散列作为输入(例如:8A9A35145C4EA5260DF9972C804FE2D3F9F3D7A2AC01A6BEB21C82BB30957B3952273AC9166B90C120737A925780F84A1D2359E7AA05201C674D29746FCA07),并将从

  • 创建一个形状为椭圆的曲线。 将xRadius与yRadius设为相等的值它将会成为一个圆。 代码示例 const curve = new THREE.EllipseCurve( 0, 0, // ax, aY 10, 10, // xRadius, yRadius 0, 2 * Math.PI, // aStartAngle, aEndA