QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

keytoolで作成した秘密鍵のexport

ヴァンフォーレ増嶋です。
お世話になっております。

[環境情報]
Windows Server 2003
JDK1.6.0.01
Tomcat 6.0.13

上記の環境で、JDK付属のkeytoolを使用して、SSLの設定を行っております。

(1)keytool -genkey でキーストア作成
(2)keytool -certreq でCSR作成
(3)CSRをベリサイン社に提出
(4)keytool -import で中間証明書、(3)で取得した証明書のインポート
(5)Tomcatの設定&Tomcat再起動

上記の手順でhttpsでアクセス可能な状態になりました。ところが、ブラウザとWebサーバの間に存在するWAF(Webアプリケーションファイヤーウォール)に対して、上記のWebサーバの秘密鍵を登録する必要があることを失念しておりました。

他の商用WebアプリケーションサーバでSSLを設定した場合は、秘密鍵ファイルが生成されていたため、登録作業は可能でしたが、keytoolで実施した場合は、秘密鍵がキーストア(バイナリ)に格納された状態(←適切な表現かどうか怪しいです)であり、WAFへの登録が行えない状態です。

http://www.wizard-limit.net/tools/ca2.html

→keytoolで秘密鍵のexportはできない
→javaプログラムを作成すれば可能

という情報は得ましたが、参考として掲載されていた、

http://java-house.jp/ml/archive/j-h-b/051468.html

の内容が理解できていないという状態です。

Javaのコーディング経験がまったくない初心者のため、
カスタマイズはもちろん、上記のサンプルコードが、
現在の要件を満たしているのかどうかすら判断できておりません。

もし同様の問題に直面して、解決された方がおりましたら、
対応方法をご教授頂けないでしょうか。

質問者:ヴァンフォーレ増嶋

回答

やったことあります。意外と簡単です。

掲載先のプログラムをちらと見てみましたが、私もその中のGetPrivateKey.javaとほぼ同じ
ようなプログラムを作りました。

えっと、ぱっと見ただけですが、1箇所バグらしきものがありますね。
ks.load(fs, null);
ですが、これってきっと
ks.load(fs, storepass.toCharArray());
の間違いじゃないかと思います。たぶん。

詳しくはJavaのAPIマニュアルを見るとよいです。
http://java.sun.com/javase/ja/6/docs/ja/api/index.html
その中のjava.security.KeyStoreの項目を見れば分かります。

では。

投稿者:blunder

編集 履歴 (0)

増嶋です。

blunder様 > ありがとうございます。

えっと、ぱっと見ただけですが、1箇所バグらしきものがありますね。
ks.load(fs, null);
ですが、これってきっと
ks.load(fs, storepass.toCharArray());
の間違いじゃないかと思います。たぶん。

以下のソース(これもどこかから拾ってきたものです。。。)で実行して、
der形式のファイルを出力できました。ks.loadはblunder様のおっしゃる通りの
形になっております。

(1)コンパイル
javac△-classpath△.△GetPrivateKey.java

(2)実行
C:\>java -classpath . GetPrivateKey *** *** *** *** > key.der

(3)der→pem
C:\OpenSSL\bin>openssl pkcs8 -inform der -in key.der -outform pem -out key.pem -nocrypt

/*

  • $ javac GetPrivateKey.java
  • $ java GetPrivateKey storepass keypass keystore alias >key.out */ import java.security.KeyStore; import java.security.Key; import java.io.FileInputStream; public class GetPrivateKey { public static void main(String[] args) throws Exception { String spass = args[0]; String kpass = args[1]; String keystore = args[2]; String alias = args[3]; KeyStore ks = KeyStore.getInstance("JKS"); FileInputStream fs = new FileInputStream(keystore); ks.load(fs, spass.toCharArray()); Key key = ks.getKey(alias, kpass.toCharArray()); System.out.write(key.getEncoded()); } }

まだWAFへの登録は未実施ですが、問題なさそうです。
ありがとうございました。

投稿者:ヴァンフォーレ増嶋

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。