Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

APサーバに中間証明書付のSSLサーバ証明書をインポートするには?

こんばんは。kimukimuです。

何の因果か、またマシンが緊急入院してしまったので
今回はStormはおあずけです。

代わりに、最近わからずに苦労したことについて書きますね。
何かといいますと、
「APサーバに中間証明書を含めたSSLサーバ証明書をインポートする方法」です。

1.Webシステムの公開形態

一般的に、何かWebシステムをインターネット上で公開する場合、
Webサーバ(Apache等)を前に立たせて、APサーバに転送する方式をとる場合が多いです。
そのため、SSLサーバ証明書もWebサーバが保持する形になります。

ですが、Webサーバのリバースプロキシ機能を通過できないプロトコルを使うなど、
直接TomcatやJettyといったAPサーバを外部に公開したい場合があります。

その場合、SSLサーバ証明書認証局(ベリサインや、グローバルサイン)が
発行したSSL証明書Javaの付属ツールのkeytoolを使って
KeyStore(暗号化の鍵と証明書の格納場所)に格納し、公開する必要があります。

2.SSL証明書を間違ってインポートするとこーなる

まず、普通にインポートしようとすると、
下記のように別々にファイルをインポートすることになります。
尚、登場するファイル一覧は以下。

★OpenSSLを使ってPKCS12形式のKeyStoreを生成
openssl pkcs12 -inkey Server.key -in Server.cer -export -out Server.pkcs12
★PKCS12形式のKeyStoreをJavaのKeyStoreにインポート
keytool -importkeystore -srckeystore Server.pkcs12 -srcstoretype PKCS12 -destkeystore Server.keystore
→ エイリアス「1」としてServer.cer&Server.keyのKeyPairがインポートされる
★エイリアス「ServerChain」に中間証明書をKeyStoreに追加
keytool -keystore Server.keystore -import -alias ServerChain -file ServerChain.cer -trustcacerts

尚、importkeystore が使えるのはJava6以降のJDKのみです。悪しからず。

上記のようにインポートした結果・・・!
証明書がどこの認証局とも関連づいていないために不正証明書扱いされちゃいます。
例としてAcroquestのホームページの証明書であらわすと下記のようになります。あれ?

で、エイリアスが違うのでうまくいかないと考えて同じエイリアスに紐付けようとすると
元々存在しているエイリアスに対して何かを追加することは出来ませんでした。
あれれ?

3.まとめて証明書をインポートする方法

どうやったら出来るんだろう、ということで調べた結果、
何故かJettyのWikiにやりかたが載っていました。

証明書ファイルを連結して1ファイルにした上でPKCS12のKeyStoreを生成する』が方法でした。

具体的な手順は下記になります。

★証明書ファイルを1ファイルにまとめる
cat Server.cer ServerChain.cer > Marged.cer
★OpenSSLを使って、マージ後の証明書を用いたPKCS12形式のKeyStoreを生成
openssl pkcs12 -inkey Server.key -in Marged.cer -export -out Marged.pkcs12
★PKCS12形式のKeyStoreをJavaのKeyStoreにインポート
keytool -importkeystore -srckeystore Server.pkcs12 -srcstoretype PKCS12 -destkeystore Marged.keystore
→ エイリアス「1」としてServer.cer/ServerChain.cer&Server.keyのKeyPairがインポートされる

上記のようにKeyStoreを生成しておけば、無事証明書が認証局を紐付けられて表示されます。

尚、複数の中間証明書が存在する場合、
サーバ証明書、中間証明書1、中間証明書2・・・・ルート証明書というように
末端の証明書から順番にインポートしておけばいいようです。

4.どこまで応用が利くの?

今回は例としてAPサーバの公開について書きましたが、
JavaのKeyStoreを用いるケースであれば全部応用が利くはずです。
何かしらの事情があって直接Javaプログラムを公開したい場合にはどうぞ。