0

更新この提案は私の問題を解決しました

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 を作成しています。避けたいのは次の2点です。

  • Java キーストア (または .jks) の使用
  • BouncyCastle の使用

これまでのところ、次の Java コードがあります。

ステップ 1: 秘密鍵と公開証明書を読み取る:

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)

私は何を間違っていますか?

4

1 に答える 1

0

キーの形式が正しいことを確認しますか?

----キーと証明書ファイルからで始まる行を削除してみてください。

于 2015-06-24T16:00:49.370 に答える