【问题标题】:Read a Private Encrypted Key in Java在 Java 中读取私钥
【发布时间】:2013-07-13 12:55:11
【问题描述】:

我有以下代码:

    PEMParser pemParser;
    File telexuskeys = new File(locationKey);
    if(telexuskeys.exists())
        pemParser = new PEMParser(new FileReader(telexuskeys));
    else{
        usage(ops);
        throw new FileNotFoundException("The key file (company's certificate) doesn't exist!");
    }

    System.out.println("Loading company's certificate");

    Object object = pemParser.readObject();
    Object object2 = pemParser.readObject();

    PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder().build(passwordPem.toCharArray());
    JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC"); 

    byte[] keyBytes = PrivateKeyInfo.getInstance(object2).getEncoded();
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory kf = KeyFactory.getInstance("RSA", "BC");        
    PrivateKey pk = kf.generatePrivate(spec);

我的 pem 文件只有证书和私钥。我曾经能够读取文件并获得私钥,但现在文件受到密码保护(加密)。我仍然缺少什么指令。我知道我需要使用 PEMDecryptorProvider 和 JcaPEMKeyConverter 对象才能获得它,但我没有找到正确的组合。

【问题讨论】:

    标签: java encryption private-key


    【解决方案1】:

    以下代码为我工作。 (使用 Bouncy Castle 中的 bcpkix 和 bcprov 库)。

    private PrivateKey readPrivateKey(String privateKeyPath, String keyPassword) throws IOException {
    
        FileReader fileReader = new FileReader(privateKeyPath);
        PEMParser keyReader = new PEMParser(fileReader);
    
        JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
        PEMDecryptorProvider decryptionProv = new JcePEMDecryptorProviderBuilder().build(keyPassword.toCharArray());
    
        Object keyPair = keyReader.readObject();
        PrivateKeyInfo keyInfo;
    
        if (keyPair instanceof PEMEncryptedKeyPair) {
            PEMKeyPair decryptedKeyPair = ((PEMEncryptedKeyPair) keyPair).decryptKeyPair(decryptionProv);
            keyInfo = decryptedKeyPair.getPrivateKeyInfo();
        } else {
            keyInfo = ((PEMKeyPair) keyPair).getPrivateKeyInfo();
        }
    
        keyReader.close();
        return converter.getPrivateKey(keyInfo);
    

    【讨论】:

    • 对我有好处,只需要添加一个 else 为:} else if (keyPair instanceof PrivateKeyInfo) {
    猜你喜欢
    • 2017-06-15
    • 2012-01-17
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2013-12-10
    相关资源
    最近更新 更多