【问题标题】:Error when importing private key into Java [duplicate]将私钥导入Java时出错[重复]
【发布时间】:2015-09-10 21:54:09
【问题描述】:

更新This suggestion解决了我的问题

我使用 OpenSSL 创建了一个私钥并获得了相应的公共证书。我使用以下命令创建了私钥:

openssl req -out CSR.csr -new -newkey rsa:2048 -nodes -keyout privateKey.key

私钥和公共证书都是 Base64 编码的。

PEM 编码的私钥格式如下:

-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----

公共证书格式为:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

现在,我将它们导入我的 Java 应用程序以创建 SSLContext。我想避免两件事:

  • 使用 Java 密钥库(或 .jks)
  • 使用 BouncyCastle

到目前为止,我有以下 Java 代码:

第一步:读取私钥和公证书:

byte[] certBytes = convertFileToBytes(new File("public.cer"));
byte[] keyBytes = convertFileToBytes(new File("private.key"));

第 2 步:从二进制编码字节生成公共证书:

private static X509Certificate generatePublicCert(byte[] certBytes) {
    CertificateFactory factory = CertificateFactory.getInstance("X.509");
    return (X509Certificate)factory.generateCertificate(new ByteArrayInputStream(certBytes));
}

第 3 步:从二进制编码字节生成私钥:

private static PrivateKey generatePrivateKey(byte[] keyBytes) {
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory factory = KeyFactory.getInstance("RSA");
    return factory.generatePrivate(spec);
}

第 4 步:生成 SSLContext:

private static SSLContext getContext() {
    X509Certificate cert = generatePublicCert(certBytes);
    PrivateKey key = generatePrivateKey(keyBytes);

    KeyStore keyStore = KeyStore.getInstance("JKS"); // Do I still need this?
    keyStore.load(null);
    keyStore.setCertificateEntry("cert-alias", cert);
    keyStore.setKeyEntry("key-alias", key, "MyPassphrase".toCharArray(), new Certificate[] {cert});

    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    kmf.init(keyStore, "MyPassphrase".toCharArray());

    KeyManager[] km = kmf.getKeyManagers();
    context.init(km, null, null);
    return context;
 }

但是,我在第 3 步遇到错误:

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format
    at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source)
    at java.security.KeyFactory.generatePrivate(Unknown Source)

我做错了什么?

【问题讨论】:

  • 你不需要类 EncryptedPrivateKeyInfo 来解密 ENCRYPTED PRIVATE KEY 的内容吗?

标签: java ssl openssl certificate java-security


【解决方案1】:

您确定您的密钥格式正确吗?

尝试从您的密钥和证书文件中删除以 ---- 开头的行。

【讨论】:

    猜你喜欢
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2020-01-17
    相关资源
    最近更新 更多