#author("2019-04-06T01:21:27+00:00","","")
#author("2019-05-17T08:59:45+00:00","","")
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
IBMのHTTPServer(IHS)では、SSL構築にはikeymanという鍵DBを管理するためのツールを用います。で、ikeymanで作成される鍵DBはCMS形式(拡張子kdb)というファイル形式なのですが、IHSでSSL環境を作った後に、アクセラレータやApacheなどに移行しようと思っても秘密鍵の抽出方法が分からず困ってました。

いろいろ調べてみると、[[keytoolで作成した秘密鍵のexport - Security & Trust>http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=43548&forum=14&2]] あたりに情報が。ikeymanを使ってkdbをJava Key Store形式(JKS)に別名保存し、それをJavaで操作すれば良さそうです。

流れとしては、
-ikeymanでKDBをJKSに保存
-JavaプログラムでJKSから秘密鍵をバイナリで抽出
-opensslのコマンドでBase64のテキストファイルに変換

でできそうです。

***Javaプログラム [#hde404c1]
以下のようなプログラムで、バイナリの秘密鍵が抽出できます。
 public class KeyGenerator {
   public static void main(String[] args) throws Exception {
     String alias = "hoge"; // 鍵DB内の別名
     String keyStorePass = "fuga"; // 鍵DBのパスワード
     String jksFile = "key.jks"; // 鍵DBのファイル名
     KeyStore keyStore = KeyStore.getInstance("JKS");
     FileInputStream in = new FileInputStream(jksFile);
     keyStore.load(in, keyStorePass.toCharArray());
     Key key = keyStore.getKey(alias, keyStorePass.toCharArray());
     byte[] der = key.getEncoded(); // バイナリの秘密鍵
     write(der); // 秘密鍵をファイル保存
   }
 
   public static void write(byte[] b) {
     BufferedOutputStream stream = null;
     try {
       File file = new File("key.der");
       FileOutputStream fstream = new FileOutputStream(file);
       stream = new BufferedOutputStream(fstream);
       stream.write(b);
     } catch (IOException e) {
       e.printStackTrace();
     } finally {
       if (stream != null) {
         try {
           stream.close();
         } catch (IOException e1) {
           e1.printStackTrace();
         }
       }
     }
   }
 }

***OpenSSLのコマンドでBase64に変換する [#pc9c5957]
 openssl pkcs8 -inform der -in key.der -outform pem -out key.pem -nocrypt
key.pemが抽出されました。実際見てみると

 -----BEGIN RSA PRIVATE KEY-----
 hogehogehoge.....
 -----END RSA PRIVATE KEY-----
確かに秘密鍵が抽出できました!

***ちなみに [#iebce8e8]
 ./keytool.exe  -export -alias hoge -keystore key.jks  -rfc > hogehoge.cer
 pass: fuga
で証明書((公開鍵と、公開鍵のハッシュ値をCAの秘密鍵で暗号化したもの<-これが署名))を抽出することができます。


**関連リンク [#b47e9c7c]
-[[OpenSSLを使った証明書取り扱いプログラミング>http://mars.elcom.nitech.ac.jp/security/openssl/program.html]]
-http://java.sun.com/javase/ja/6/docs/ja/api/java/security/KeyStore.html
-[[CA2>http://www.wizard-limit.net/tools/ca2.html]]
-[[keytoolで作成した秘密鍵のexport - Security & Trust>http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=43548&forum=14&2]]




----
この記事は
#vote(おもしろかった[5],そうでもない[0])
#vote(おもしろかった[6],そうでもない[0])

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS