C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

JavaのKeyStoreから秘密鍵を取得する方法

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■89566 / inTopicNo.1)  JavaのKeyStoreから秘密鍵を取得する方法
  
□投稿者/ Sasaki (1回)-(2018/12/05(Wed) 13:21:33)

分類:[Java] 

指定したエイリアスでSSLソケットを開くために、KeyStoreの調査をしています。
<http://a4dosanddos.hatenablog.com/entry/2014/02/08/144856>
を参考に、KeyStoreから秘密鍵を取得しようとしているのですが、nullが戻ってきて取得できません。
なぜ取得できないか、原因を追究する方法など、ご存知でしたら、教えていただけないでしょうか。
(KeyStoreに入っているものでも、秘密鍵が含まれているとは限らないものなのでしょうか?KeyStoreには証明書とキーペアが混在しているのでしょうか?)
よろしくお願いします。

////////////////////////////////////////////////////////////////////////////////
◇実行したコード
public static void main(String[] args) {
	try {
		// KeyStoreのロード
		KeyStore keyStore = null;
		InputStream inputStream = new FileInputStream("C:/Program Files/Java/jre1.8.0_191/lib/security/cacerts");
		try {
			keyStore = KeyStore.getInstance("JKS");
			keyStore.load(inputStream, "changeit".toCharArray());
		}
		finally {
			if (inputStream != null) {
				inputStream.close();
				inputStream = null;
			}
		}

		// エイリアスの一覧をログ出力
		Enumeration keyEnumeration = keyStore.aliases();
		int count = 0;
		while (keyEnumeration.hasMoreElements()) {
			String alias = (String) keyEnumeration.nextElement();
			LogService.debug("Alias:[" + count + "]=[" + alias + "]");
			count++;
		}

		// 秘密鍵を取得
//		String alias = "verisignclass2g2ca [jdk]";
		String alias = "verisignclass2g2ca";
		PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, "changeit".toCharArray());
		if (privateKey == null) {
			LogService.debug("PrivateKey is null.");
		}
		else {
			LogService.debug("PrivateKey:[" + privateKey.toString() + "]");
		}
	}
	catch (Exception exception) {
		LogService.error(exception);
	}
}

////////////////////////////////////////////////////////////////////////////////
◇実行結果
[2018/12/05 13:13:22.463] <DEBUG> [HyPAS]TestMain.main(80) - Alias:[0]=[verisignclass2g2ca [jdk]]
[2018/12/05 13:13:22.471] <DEBUG> [HyPAS]TestMain.main(80) - Alias:[1]=[digicertassuredidg3 [jdk]]
<<<中略>>>
[2018/12/05 13:13:22.485] <DEBUG> [HyPAS]TestMain.main(80) - Alias:[94]=[addtrustqualifiedca [jdk]]
[2018/12/05 13:13:22.485] <DEBUG> [HyPAS]TestMain.main(80) - Alias:[95]=[digicertglobalrootca [jdk]]
[2018/12/05 13:13:22.486] <DEBUG> [HyPAS]TestMain.main(89) - PrivateKey is null.

////////////////////////////////////////////////////////////////////////////////
◇指定したエイリアスのkeytoolの出力
	キーストアには96エントリが含まれます

	別名: verisignclass2g2ca [jdk]
	作成日: 2016/08/26
	エントリ・タイプ: trustedCertEntry

	所有者: OU=VeriSign Trust Network, OU="(c) 1998 VeriSign, Inc. - For authorized use only", OU=Class 2 Public Primary Certification Authority - G2, O="VeriSign, Inc.", C=US
	発行者: OU=VeriSign Trust Network, OU="(c) 1998 VeriSign, Inc. - For authorized use only", OU=Class 2 Public Primary Certification Authority - G2, O="VeriSign, Inc.", C=US
	シリアル番号: b92f60cc889fa17a4609b85b706c8aaf
	有効期間の開始日: Mon May 18 09:00:00 JST 1998 終了日: Wed Aug 02 08:59:59 JST 2028
	証明書のフィンガプリント:
		 MD5:  2D:BB:E5:25:D3:D1:65:82:3A:B7:0E:FA:E6:EB:E2:E1
		 SHA1: B3:EA:C4:47:76:C9:C8:1C:EA:F2:9D:95:B6:CC:A0:08:1B:67:EC:9D
		 SHA256: 3A:43:E2:20:FE:7F:3E:A9:65:3D:1E:21:74:2E:AC:2B:75:C2:0F:D8:98:03:05:BC:50:2C:AF:8C:2D:9B:41:A1
	署名アルゴリズム名: SHA1withRSA
	サブジェクト公開鍵アルゴリズム: 1024ビットRSA鍵
	バージョン: 1

引用返信 編集キー/
■89702 / inTopicNo.2)  Re[1]: JavaのKeyStoreから秘密鍵を取得する方法
□投稿者/ Sasaki (2回)-(2018/12/15(Sat) 14:22:27)
証明書をキーストアに入れるときの方法により、当問題が発生することが分かってきました。
キーストアに入れる処理は他システムのため隠蔽されており、これ以上原因の追及は難しいです。

>>>(KeyStoreに入っているものでも、秘密鍵が含まれているとは限らないものなのでしょうか?KeyStoreには証明書とキーペアが混在しているのでしょうか?)
キーストアに入っているからといって、秘密鍵が取得できるとは限らないようです。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ