web-dev-qa-db-ja.com

Java Keytool keystoreから秘密鍵をエクスポートするにはどうすればよいですか?

Java Keytool keystoreから秘密鍵をエクスポートしたいので、opensslで使用できます。どうすればよいですか?

117
Jonas

Java keytoolを使用してJKSからP12に変換...

keytool の独自フォーマット(「JKS」と呼ばれる)から標準化されたフォーマットにエクスポート PKCS#12

keytool -importkeystore \
    -srckeystore keystore.jks \
    -destkeystore keystore.p12 \
    -deststoretype PKCS12 \
    -srcalias <jkskeyalias> \
    -deststorepass <password> \
    -destkeypass <password>

...次にopensslを使用してP12からPEMにエクスポートします

opensslを使用して証明書をエクスポート:

openssl pkcs12 -in keystore.p12  -nokeys -out cert.pem

暗号化されていない秘密鍵をエクスポート:

openssl pkcs12 -in keystore.p12  -nodes -nocerts -out key.pem
135
Jaime Hablutzel

Java 6なので、秘密鍵をPKCS#12(.p12keytoolを使用するファイル、オプション-importkeystore(以前のバージョンでは使用できません)。

例えば:

keytool -importkeystore -srckeystore existing-store.jks -destkeystore new-store.p12 -deststoretype PKCS12

PKCS12キーストアタイプは、デフォルトのOracle/Sunセキュリティプロバイダーの標準キーストアタイプとしてもサポートされています。

62
Bruno

「Keystore Explorer」をお試しください

私はブルーノに同意します。 Keytoolは、Java keystoreを処理する場合の究極のツールですが、非常に強力で無料のツールが1つあります: Keystore Explorer

私はそれを頻繁に使用し、他に何かを必要とすることはありませんでした。

23
Tiho

ここでJCEKSタイプのキーストアから秘密鍵を取得しようとしていることに気付いた場合、他の回答に記載されているkeytoolとopensslの手順が機能しないことがわかりました。以下のJava=クラスを使用してキーを取得する必要がありました。

import Sun.misc.BASE64Encoder;

import Java.io.File;
import Java.io.FileInputStream;
import Java.io.FileWriter;
import Java.security.*;

public class ExportPrivateKey
{
    private File keystoreFile;
    private String keyStoreType;
    private char[] keyStorePassword;
    private char[] keyPassword;
    private String alias;
    private File exportedFile;

    public void export() throws Exception {
        KeyStore keystore = KeyStore.getInstance(keyStoreType);
        BASE64Encoder encoder = new BASE64Encoder();
        keystore.load(new FileInputStream(keystoreFile), keyStorePassword);
        Key key = keystore.getKey(alias, keyPassword);
        String encoded = encoder.encode(key.getEncoded());
        FileWriter fw = new FileWriter(exportedFile);
        fw.write("---BEGIN PRIVATE KEY---\n");
        fw.write(encoded);
        fw.write("\n");
        fw.write("---END PRIVATE KEY---");
        fw.close();
    }

    public static void main(String args[]) throws Exception {
        ExportPrivateKey export = new ExportPrivateKey();
        export.keystoreFile = new File(args[0]);
        export.keyStoreType = args[1];
        export.keyStorePassword = args[2].toCharArray();
        export.alias = args[3];
        export.keyPassword = args[4].toCharArray();
        export.exportedFile = new File(args[5]);
        export.export();
    }
}

使用法:

javac ExportPrivateKey.Java
java ExportPrivateKey <path_to_keystore> JCEKS <keystore_password> “<key_alias>” <key_password> <output_file_name>
6
cjbooms

PKCS#12と呼ばれる秘密鍵の移動を可能にする形式があります。このフォーマットは、必要に応じて、PKI証明書および関連するキーストアの進化の後半に登場しました。秘密鍵にアクセスして転送することによって作成された信頼のチェーンの問題を検討すると、なぜそれが最初の機能に含まれていなかったのか、運用上の必要性によるプレッシャーの後に発生したのかがわかります。これが挑戦の核となる理由です。

Javaキーストアは、PKCS#12形式の初期ユーザーの1人でしたが、インポーターとして、エクスポーターではありませんでした。 Javaキーストアのセキュリティ設計は、標準機能としての秘密鍵のエクスポートをまだサポートしていないようです。この場合も、セキュリティには十分な理由があります。とは言っても、プライベートルーチンは次のように記述されています。 http://www.startux.de/index.php/Java/44-dealing-with-Java-keystoresyvComment44

可能であれば、Javaキーストアから秘密キーを取得するのではなく、OpenSSLと新しいキーで新しいキーストアを作成することを検討します。 Javaキーストアを開いて秘密鍵を抽出することで、設計されたセキュリティ機能を超えます。 PKCS#12のエクスポート機能は長年にわたって望まれてきましたが、Javaではまだサポートされていません。私の考えでは、これは非常に優れた暗号上の理由によるものであり、絶対に必要な場合を除き、私はそのステップを踏むことを恐れます。

2
zedman9991