「Java」キーストアから秘密鍵/公開鍵を取得する

キーストアから秘密鍵/公開鍵を取得するサンプルコード書いてみました。その時のメモです。


ひとまず、取得するキーペアを keytool を使って作成する。
コマンドは以下で ( 鍵長 2,048bit、署名アルゴリズム SHA256withRSA とした )。

keytool -genkeypair -keysize 2048 -keyalg RSA -sigalg SHA256withRSA -alias sample -keystore sample -storepass sample

いちおう、中身確認しておきます。

keytool -list -v -keystore sample -storepass sample
キーストアのタイプ: JKS
キーストア・プロバイダ: SUN

キーストアには1エントリが含まれます

別名: sample
作成日: 2014/02/08
エントリ・タイプ: PrivateKeyEntry
証明書チェーンの長さ: 1
証明書[1]:
所有者: CN=test, OU=test, O=test, L=test, ST=test, C=JP
発行者: CN=test, OU=test, O=test, L=test, ST=test, C=JP
シリアル番号: d38aae6
有効期間の開始日: Sat Feb 08 14:16:11 JST 2014終了日: Fri May 09 14:16:11 JST 2014
証明書のフィンガプリント:
	 MD5:  0F:1F:5C:5C:EC:43:41:BB:F8:A8:52:06:9C:CC:E0:BA
	 SHA1: 2A:CB:26:B8:01:C4:65:51:AE:43:6E:B8:24:EF:E2:27:3B:0A:CB:82
	 SHA256: 3B:6F:D4:07:BD:50:AE:AE:BF:EC:C2:39:6C:75:43:4C:37:A4:15:B7:36:A7:8A:11:3F:C5:65:C9:1A:E1:BD:BC
	 署名アルゴリズム名: SHA256withRSA
	 バージョン: 3

拡張: 

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: F9 5B E5 2F 8D 5F CA EB   D5 96 51 F6 27 DB D0 B2  .[./._....Q.'...
0010: 15 F1 1C 5D                                        ...]
]
]



*******************************************
*******************************************

無事作成できてそうです。


上記で作成したキーペアをコードから取得してみる。
■ KeyPairTest.java

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.X509Certificate;

public class KeyPairTest {
	public static void main(String[] args) throws Exception {
		String ksType = "JKS";
		String keyStoreFile = "sample";
		String keyStorePass = "sample";
		String alias = "sample";
		String privateKeyPass = "sample";

		KeyStore ks = KeyStore.getInstance(ksType);
		ks.load(new FileInputStream(keyStoreFile), keyStorePass.toCharArray());

		PrivateKey privateKey = (PrivateKey) ks.getKey(alias,
				privateKeyPass.toCharArray());

		X509Certificate certificate = (X509Certificate) ks
				.getCertificate(alias);
		PublicKey publicKey = certificate.getPublicKey();

		System.out.println("********** PrivateKey **********");
		System.out.println(privateKey.toString());
		System.out.println();
		System.out.println("********** PublicKey **********");
		System.out.println(publicKey.toString());
	}
}

■ 実行結果

********** PrivateKey **********
Sun RSA private CRT key, 2048 bits
  modulus:          27333344419699606451717651043975503725737321416540282490169396721189906350730803641122565757644488795366183548403708802225663256830676460432823244309403325209129873612227644719528410405861747469370059639181012124868705327772766567054569178393007602412792625460665788168368983908414799642395845705241893798299718165913914219641156917094146793569842306952359613823188884305231816079825056974202565355307752014934594684235678427508639714775036879901072681932813558945424179509680585165911986815144168405330775963449009604657274139078068677401271752867446653905588243885099717844078454253119966136447824006882831199554953
  public exponent:  65537
  private exponent: 26424554614085595397530050732322199140260695642296095610298802774938585632079623069323336760499252652651336760299711343079688918111570550682863346093888580169981087512756444666980194798275609139331190604074500911049200179395256788614727466997637604310080033628894563479736974265977156045331888737548497906108801597502232798566437958861025867957861278299212025893001961837119088422015376375603395551532477170723673094010523185882650397507930627497350602824657092836808267522647208784079353623873336808833666631971159872187931536693645169851480274605972243263945973753873728054940708473356002454806452980350988490433753
  prime p:          178717695490938222964405408092300742599638923120125984994643389970122996221777880738673621543340594182036862539857228514912976495931399141273631229629203159081015761437888929810067802655416372573354784082860226721644255442560866692984223708547595856552169768410216615224064703898922961000342553781160964952423
  prime q:          152941455207414129947230744814991764166898656856228566284307316990382469101215872908954168487982929674598233922096364983952769696175944879659739845525466723463915214012920642140484016943013934324200274989529147758217889565438940217481904662361874002992523469452806327868733259276090164294185752901810190132111
  prime exponent p: 67244452036422870135637471323802493427598092760107827089779992268081586948331793660603213965198829850845278138613903565150053975817818505953377061681592393606340962529516198791315774992445676965475313497707406972077234157164783431989532209730002383794191896474167745163956414444413709741175931667449657975827
  prime exponent q: 149300936567202248983535733418202360439227846402657048463785788472064623429337441462016278397785737702241042642079422960745019559214618086973635901813979653738360066022317529368474998122636105959371972977174821644681720565910662347892637969146064255145225964038362916185634797575513380854313165286770992478783
  crt coefficient:  91267714505039644129908348867403683138509328932499908532782716631293436544585037014459267632989481002415206073215091005267997936327520328485868708177288497836901578431504128994851500738382172959599931057193885513094621318978840264468162831277755207840732330335071898522082365725727552428505880206099520186298

********** PublicKey **********
Sun RSA public key, 2048 bits
  modulus: 27333344419699606451717651043975503725737321416540282490169396721189906350730803641122565757644488795366183548403708802225663256830676460432823244309403325209129873612227644719528410405861747469370059639181012124868705327772766567054569178393007602412792625460665788168368983908414799642395845705241893798299718165913914219641156917094146793569842306952359613823188884305231816079825056974202565355307752014934594684235678427508639714775036879901072681932813558945424179509680585165911986815144168405330775963449009604657274139078068677401271752867446653905588243885099717844078454253119966136447824006882831199554953
  public exponent: 65537

ようわかりませんが、とりあえず、秘密鍵/公開鍵が取得できてそうです。


コマンドリファレンス、API ドキュメントは以下あたりですね。

・keytool - 鍵と証明書の管理ツール
http://docs.oracle.com/javase/jp/7/technotes/tools/windows/keytool.html
※ 今は -genkey ではなくて -genkeypair なんですね・・・

・KeyStore (Java Platform SE 7 )
http://docs.oracle.com/javase/jp/7/api/java/security/KeyStore.html

[ 環境情報 ]
Windows 7 SP1
Java SE 7

以上です。