Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将私钥导入Java时出错_Java_Ssl_Openssl_Certificate_Java Security - Fatal编程技术网

将私钥导入Java时出错

将私钥导入Java时出错,java,ssl,openssl,certificate,java-security,Java,Ssl,Openssl,Certificate,Java Security,更新:解决了我的问题 我使用OpenSSL创建了一个私钥,并获得了相应的公共证书。我使用以下命令创建了私钥: openssl req -out CSR.csr -new -newkey rsa:2048 -nodes -keyout privateKey.key 私钥和公共证书都是Base64编码的 PEM编码私钥的格式如下: -----BEGIN ENCRYPTED PRIVATE KEY----- ... -----END ENCRYPTED PRIVATE KEY----- 公共证书的

更新解决了我的问题

我使用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代码:

步骤1:读取私钥和公共证书:

byte[] certBytes = convertFileToBytes(new File("public.cer"));
byte[] keyBytes = convertFileToBytes(new File("private.key"));
private static X509Certificate generatePublicCert(byte[] certBytes) {
    CertificateFactory factory = CertificateFactory.getInstance("X.509");
    return (X509Certificate)factory.generateCertificate(new ByteArrayInputStream(certBytes));
}
private static PrivateKey generatePrivateKey(byte[] keyBytes) {
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory factory = KeyFactory.getInstance("RSA");
    return factory.generatePrivate(spec);
}
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;
 }
步骤2:从二进制编码字节生成公共证书:

byte[] certBytes = convertFileToBytes(new File("public.cer"));
byte[] keyBytes = convertFileToBytes(new File("private.key"));
private static X509Certificate generatePublicCert(byte[] certBytes) {
    CertificateFactory factory = CertificateFactory.getInstance("X.509");
    return (X509Certificate)factory.generateCertificate(new ByteArrayInputStream(certBytes));
}
private static PrivateKey generatePrivateKey(byte[] keyBytes) {
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory factory = KeyFactory.getInstance("RSA");
    return factory.generatePrivate(spec);
}
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:从二进制编码字节生成私钥:

byte[] certBytes = convertFileToBytes(new File("public.cer"));
byte[] keyBytes = convertFileToBytes(new File("private.key"));
private static X509Certificate generatePublicCert(byte[] certBytes) {
    CertificateFactory factory = CertificateFactory.getInstance("X.509");
    return (X509Certificate)factory.generateCertificate(new ByteArrayInputStream(certBytes));
}
private static PrivateKey generatePrivateKey(byte[] keyBytes) {
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory factory = KeyFactory.getInstance("RSA");
    return factory.generatePrivate(spec);
}
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;
 }
步骤4:生成SSLContext:

byte[] certBytes = convertFileToBytes(new File("public.cer"));
byte[] keyBytes = convertFileToBytes(new File("private.key"));
private static X509Certificate generatePublicCert(byte[] certBytes) {
    CertificateFactory factory = CertificateFactory.getInstance("X.509");
    return (X509Certificate)factory.generateCertificate(new ByteArrayInputStream(certBytes));
}
private static PrivateKey generatePrivateKey(byte[] keyBytes) {
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory factory = KeyFactory.getInstance("RSA");
    return factory.generatePrivate(spec);
}
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)

我做错了什么?

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


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

解密加密私钥的内容不需要class EncryptedPrivateKeyInfo吗?