自己署名証明書のキーストアから秘密キーをエクスポートする方法
-
27-09-2019 - |
質問
Tomcat 6 を実行している Linux ボックスで自己署名証明書を作成しました。
10 年間有効なキーを次のように作成しました。
keytool -genkey -alias tomcatorange -keyalg RSA -validity 3650
そして、キーストアを Tomcat のフォルダーにコピーし、キーストアを指すように server.xml を更新しました。
現在、ネットワーク管理者は公開キーと秘密キーの両方を要求しています (ロードバランサー用)
次を使用して公開キーを生成できます。
openssl s_client -connect mydomain.com:8443
しかし、秘密キーをエクスポート/取得するにはどうすればよいでしょうか?
解決
それは少し難しいです。まず使用できます キーツール 秘密キーを PKCS12 形式に変換します。PKCS12 形式は、Java のさまざまなキーストア形式よりも移植性と互換性が高くなります。以下は、Java キーストア内のエイリアス「mykey」を持つ秘密鍵を取得し、それを という名前の PKCS12 ファイルにコピーする例です。 myp12file.p12
。[ほとんどの画面では、このコマンドはボックスの右側を超えて拡張されることに注意してください。すべて見るには右にスクロールする必要があります]
keytool -v -importkeystore -srckeystore .keystore -srcalias mykey -destkeystore myp12file.p12 -deststoretype PKCS12
Enter destination keystore password:
Re-enter new password:
Enter source keystore password:
[Storing myp12file.p12]
今ファイル myp12file.p12
PKCS12 形式の秘密キーが含まれており、多くのソフトウェア パッケージで直接使用したり、 openssl pkcs12
指示。例えば、
openssl pkcs12 -in myp12file.p12 -nocerts -nodes
Enter Import Password:
MAC verified OK
Bag Attributes
friendlyName: mykey
localKeyID: 54 69 6D 65 20 31 32 37 31 32 37 38 35 37 36 32 35 37
Key Attributes: <No Attributes>
-----BEGIN RSA PRIVATE KEY-----
MIIC...
.
.
.
-----END RSA PRIVATE KEY-----
秘密キーを暗号化せずに出力します。
これは、 秘密鍵, 、 そして あなた Java キーストアからキーストアを削除して移動することによるセキュリティへの影響を理解する責任があります。
他のヒント
を使用するキーストアExplorerのGUI - http://keystore-explorer.sourceforge.net/ に - ことができますあなたのさまざまな形式で.jksから秘密鍵を抽出します。
http://anandsekar.github.io /エクスポート・プライベート・キーから-JKS-ストア/ の
public class ExportPrivateKey {
private File keystoreFile;
private String keyStoreType;
private char[] password;
private String alias;
private File exportedFile;
public static KeyPair getPrivateKey(KeyStore keystore, String alias, char[] password) {
try {
Key key=keystore.getKey(alias,password);
if(key instanceof PrivateKey) {
Certificate cert=keystore.getCertificate(alias);
PublicKey publicKey=cert.getPublicKey();
return new KeyPair(publicKey,(PrivateKey)key);
}
} catch (UnrecoverableKeyException e) {
} catch (NoSuchAlgorithmException e) {
} catch (KeyStoreException e) {
}
return null;
}
public void export() throws Exception{
KeyStore keystore=KeyStore.getInstance(keyStoreType);
BASE64Encoder encoder=new BASE64Encoder();
keystore.load(new FileInputStream(keystoreFile),password);
KeyPair keyPair=getPrivateKey(keystore,alias,password);
PrivateKey privateKey=keyPair.getPrivate();
String encoded=encoder.encode(privateKey.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.password=args[2].toCharArray();
export.alias=args[3];
export.exportedFile=new File(args[4]);
export.export();
}
}
のpublic static無効メイン(文字列[] args){
try {
String keystorePass = "20174";
String keyPass = "rav@789";
String alias = "TyaGi!";
InputStream keystoreStream = new FileInputStream("D:/keyFile.jks");
KeyStore keystore = KeyStore.getInstance("JCEKS");
keystore.load(keystoreStream, keystorePass.toCharArray());
Key key = keystore.getKey(alias, keyPass.toCharArray());
byte[] bt = key.getEncoded();
String s = new String(bt);
System.out.println("------>"+s);
String str12 = Base64.encodeBase64String(bt);
System.out.println("Fetched Key From JKS : " + str12);
} catch (KeyStoreException | IOException | NoSuchAlgorithmException | CertificateException | UnrecoverableKeyException ex) {
System.out.println(ex);
}
}