18

Java で非対称暗号化が必要です。http://www.imacat.idv.tw/tech/sslcerts.htmlで述べたopensslによって、独自のパスワードと.crtファイルを使用して.keyおよび.crtファイルを生成します。
これらの .key および .crt ファイルを使用して、Java で公開鍵と秘密鍵を抽出する方法は?

4

4 に答える 4

27

ファイルはPEM形式である場合があります.key.crtこれを確認するには、それらをテキスト エディターで開き、内容が次のように見えるかどうかを確認します------BEGIN CERTIFICATE------(または「RSA 秘密鍵の開始」...)。DER を明示的に指定しない限り、これは通常、OpenSSL で使用されるデフォルトの形式です。

おそらく必須ではありませんが (以下を参照)、証明書が DER 形式 (バイナリ形式) の場合は、次を使用して PEM 形式に変換できます。

openssl x509 -inform DER -in cert.crt -outform PEM -out cert.pem

openssl rsa(必要に応じて、秘密鍵で同様のことを行うためのヘルプを確認してください。)

次に、次の 2 つのオプションがあります。

  • PKCS#12 ファイルをビルドする

    openssl pkcs12 -export -in myhost.crt -inkey myhost.key -out myhost.p12
    

その後、「PKCS12」タイプのキーストアとして Java から直接使用できます。ほとんどの Java アプリケーションでは、ファイルの場所に加えてキーストアの種類を指定できます。デフォルトのシステム プロパティでは、これjavax.net.ssl.keyStoreTypeを使用します (ただし、使用しているアプリケーションはこれを使用していない可能性があります)。それ以外の場合、明示的にロードする場合は、次のように使用します。

KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream fis =
    new FileInputStream("/path/to/myhost.p12");
ks.load(fis, "password".toCharArray()); // There are other ways to read the password.
fis.close();

(次に、 を反復処理して (そして公開鍵に対して) および を使用できるようにするaliases()必要がありKeyStoreます。getCertificategetPublicKey()getKey()

  • BouncyCastleを使用しますPEMReader

     FileReader fr = ... // Create a FileReader for myhost.crt
     PEMReader pemReader = new PEMReader(fr);
     X509Certificate cert = (X509Certificate)pemReader.readObject();
     PublicKey pk = cert.getPublicKey();
     // Close reader...
    

秘密鍵については、秘密鍵がパスワードで保護されているかどうかPasswordFinderを構築するために (PEMReader doc のリンクを参照)を実装する必要があります。( の結果をorPEMReaderにキャストする必要があります。)readObject()KeyPrivateKey

于 2011-06-26T11:37:25.743 に答える
5

これは、(上記で提案したように BouncyCastle PEMReader を使用して) やりたいことを実行する必要があります。PEM でエンコードされた秘密鍵と証明書を取得し、PKCS#12 ファイルを出力します。秘密鍵を保護するために使用されたものと同じパスワードを PKCS12 に使用します。

public static byte[] pemToPKCS12(final String keyFile, final String cerFile, final String password) throws Exception {
    // Get the private key
    FileReader reader = new FileReader(keyFile);

    PEMReader pem = new PEMReader(reader, new PasswordFinder() {
        @Override public char[] getPassword() {
            return password.toCharArray();
        }
    });

    PrivateKey key = ((KeyPair)pem.readObject()).getPrivate();

    pem.close();
    reader.close();

    // Get the certificate      
    reader = new FileReader(cerFile);
    pem = new PEMReader(reader);

    X509Certificate cert = (X509Certificate)pem.readObject();

    pem.close();
    reader.close();

    // Put them into a PKCS12 keystore and write it to a byte[]
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    KeyStore ks = KeyStore.getInstance("PKCS12");
    ks.load(null);
    ks.setKeyEntry("alias", (Key)key, password.toCharArray(), new java.security.cert.Certificate[]{cert});
    ks.store(bos, password.toCharArray());
    bos.close();
    return bos.toByteArray();
}
于 2012-03-22T20:02:25.480 に答える
1

私が理解しているように、OpenSSLはいわゆるPEM形式でファイルを保存しています。これをJavaKeyStorage(JKS)形式に変換してから、その形式(Javaにネイティブ)で作業してファイルを抽出する必要があります。変換には、このGoogleクエリを使用してください。かなり良い結果が得られます。

JKSファイルをjava.security.KeyStoreクラスにロードします。次に、getCertificateメソッドとgetKeyメソッドを使用して、必要な情報を取得します。

于 2011-06-26T07:08:46.230 に答える
1

org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator を見てください。

于 2011-06-26T06:39:26.590 に答える