【问题标题】:Get KeyPair from PEM Key with BouncyCastle使用 BouncyCastle 从 PEM 密钥获取密钥对
【发布时间】:2013-03-17 09:41:32
【问题描述】:

我有一个 PEM 密钥,我想用它和 bouncycastle 获得一个密钥对。我发现这段代码看起来不错,但我有一个强制转换异常。

function loadKey() {
    File privateKeyFile = new File(keyPath);
    PEMParser pemParser = new PEMParser(new FileReader(privateKeyFile));
    PEMDecryptorProvider decProv = new     JcePEMDecryptorProviderBuilder().build(password.toCharArray());
    JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");

    Object object = pemParser.readObject();
    KeyPair kp;

    if (object instanceof PEMEncryptedKeyPair) {
        Logger.info("Encrypted key - we will use provided password");
        kp = converter.getKeyPair(((PEMEncryptedKeyPair) object).decryptKeyPair(decProv));
    }
    else {
        Logger.info("Unencrypted key - no password needed");    
        kp = converter.getKeyPair((PEMKeyPair) object);
    }

    return kp;
}

它返回给我: 未加密的密钥 - 无需密码 org.bouncycastle.asn1.x509.SubjectPublicKeyInfo 无法转换为 org.bouncycastle.openssl.PEMKeyPair

我尝试了几种方法,但都没有成功。

感谢帮助我:)

【问题讨论】:

  • 您确定您引用的 PEM 是私钥吗?我正在使用相同的方法,没有任何困难。
  • 我不确定,我是个有钥匙的新手。我怎么会知道?
  • 好吧,根据您遇到的错误 - 听起来您正在解码证书而不是私钥。

标签: java bouncycastle pem


【解决方案1】:

如果您有一个包含密码的私钥,您可能会遇到此异常。尝试删除密码:

openssl rsa -in /path/to/originalkeywithpass.key -out /path/to/newkeywithnopass.key

【讨论】:

    【解决方案2】:

    你可以使用下面的代码

    PEMKeyPair pemKeyPair = (PEMKeyPair) pp.readObject();
    KeyPair kp = new JcaPEMKeyConverter().getKeyPair(pemKeyPair);
    pp.close();
    

    例如:

    public PrivateKey getKeyFromClassPath(String filename) {
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        InputStream stream = loader.getResourceAsStream("certificates/" + filename);
        if (stream == null) {
            throw new CertificateException("Could not read private key from classpath:" + "certificates/" + filename);
        }
        BufferedReader br = new BufferedReader(new InputStreamReader(stream));
        try {
            Security.addProvider(new BouncyCastleProvider());
            PEMParser pp = new PEMParser(br);
            PEMKeyPair pemKeyPair = (PEMKeyPair) pp.readObject();
            KeyPair kp = new JcaPEMKeyConverter().getKeyPair(pemKeyPair);
            pp.close();
            return kp.getPrivate();
        } catch (IOException ex) {
            throw new CertificateException("Could not read private key from classpath", ex);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-16
      • 1970-01-01
      • 2016-07-23
      • 2017-03-17
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 2017-10-02
      • 2020-11-28
      相关资源
      最近更新 更多