- PR -

keytoolで作成した秘密鍵のexport

1
投稿者投稿内容
ヴァンフォーレ増嶋
常連さん
会議室デビュー日: 2007/08/06
投稿数: 31
投稿日時: 2008-02-14 22:28
ヴァンフォーレ増嶋です。
お世話になっております。

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

もし同様の問題に直面して、解決された方がおりましたら、
対応方法をご教授頂けないでしょうか。
blunder
ベテラン
会議室デビュー日: 2003/09/11
投稿数: 65
投稿日時: 2008-02-15 10:23
やったことあります。意外と簡単です。

掲載先のプログラムをちらと見てみましたが、私もその中の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の項目を見れば分かります。

では。
ヴァンフォーレ増嶋
常連さん
会議室デビュー日: 2007/08/06
投稿数: 31
投稿日時: 2008-02-15 13:25
増嶋です。

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への登録は未実施ですが、問題なさそうです。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)