glassfishでSSL中間証明書を入れた経緯

今まではjavaが動くサーバというとTomcatぐらいしか触っていなかったんだけれど、
お仕事先でglassfishに触れる機会があり、SSLを入れようとしたらトラブルになっていたので記録を残そうということに。
苦肉の策で証明書をまとめたので、正式な方法を知っている方は教えてもらえると助かります。

参考にしたサイト(サイトタイトルとリンク名は同期させてません)

サーバ証明書、秘密鍵、中間証明書をまとめる参考URL
セコムの証明書リポジトリ
CrossTrust(セコム)のpkcs12形式を扱う参考URL
Glassfishの中間証明書インストール方法

「Glassfish 中間証明書」でググって出てくるページには、大概keystore.jks(サーバ証明書と秘密鍵は格納済み)
cacerts.jks に中間証明書を入れたら再起動して終わりっていう形で書いてあります。

でも、中間証明書がないよとブラウザで怒られたので調査開始。ディレクトリ構造は下記の通り。

/opt/SUNWappserver/domains/[ドメイン名:Virtualhostのようなもの?]/config/
keystore.jks
cacerts.jks

中間証明書をもらえない確認

# openssl s_client -showcerts -connect 127.0.0.1:443 -CAfile SCRoot1ca.crt

SCRoot1ca.crtはCrossTrustのルート証明書を別途ダウンロードしてみました。
これがブラウザに入っているので、中間証明書が紐づいてくれないとエラー。紐づいたらOKという確認方法です。

中間証明書が通信上来るかどうかを確認する参考URL

このページが大変参考になりました。

 

Certificate chain  0 s:/C=US/2.5.4.17=20171/ST=Virginia/L=Herndon/2.5.4.9=13200 Woodland Park Rd./O=Network Solutions,
LLC/OU=Registrar/OU=Secure Link SSL Wildcard/CN=*.netsolssl.com
i:/C=US/O=Network Solutions L.L.C./CN=Network Solutions Certificate Authority
-----BEGIN CERTIFICATE-----
 MIIEqzCCA5OgAwIBAgIRALotrfhGiAIK4fzzoXPjZDcwDQYJKoZIhvcNAQEFBQAw
(省略)
VYPTleIV+w67dx1hQwVfpS/KJGEwjXgxcoDoQpKjy16LwrwxPD9Wa/rtWTg9s=
-----END CERTIFICATE-----
  1 s:/C=US/O=Network Solutions L.L.C./CN=Network Solutions Certificate Authority
i:/C=US/O=GTE Corporation/OU=GTE CyberTrust Solutions, Inc./CN=GTE CyberTrust Global Root
-----BEGIN CERTIFICATE-----
 MIIEkDCCA/mgAwIBAgIEBAADxTANBgkqhkiG9w0BAQUFADB1
(省略)
MQswCQYDVQQGEwJVUpSTSVSzHX3qMgtALXAfqCUFvoc=
-----END CERTIFICATE-----

これで何が分かるのかというと、1つのセッションに2つの証明書が返ってきていること。
・サーバ証明書と・中間証明書が来ていることの確認になるということです。

中間証明書がないよと怒られた状態は、確かに1つしか証明書が入っていませんでした。

ではどうしたらよいのか?

もらったサーバ証明書、秘密鍵、中間証明書を1つのファイルにまとめます。
これはopenssl コマンドのpkcs12形式にまとめることで実現できました。

Tomcatの複数keystoreを記述した参考URL

 

■x509 形式からpkcs12形式にして、全て入れた作業
# openssl pkcs12 -export -inkey ./private.key -in ./server.crt -certfile CrossTrustOVCA1.crt -name myweb-ssl -out b.p12

※nameの部分は任意で構いません。

■作ったpkcs12 のファイルからjks ファイルに変換
# keytool -importkeystore -srcalias 1 -destalias myweb-ssl -srckeystore a
.p12 -destkeystore keystore.jks -srcstoretype pkcs12 -deststoretype jks -storepass changeit

※destaliasは任意で構いません。

srcaliasになぜ1を指定しているかというと、opensslコマンドで -name を指定したにも関わらず、その名前で引っ張り出すことができなかったためです。
後述するkeytoolでチェックするにもalias(別名) はつけておいたほうが良いので、こんな感じで入れています。また、passwordはデフォルトのchangeitを利用した場合です。

確認をするには?

できたkeystore.jksを確認します。ポイントは「証明連鎖の長さ:」が2になっていること。
他にも書きたいことはあるのですが、大事なところだけでいったん投稿したいと思います。

 

# keytool -list -keystore d.jks -v
キーストアのパスワードを入力してください:
 
キーストアのタイプ: JKS
キーストアのプロバイダ: SUN
 
キーストアには 1 エントリが含まれます。
 
別名: myweb-ssl
作成日: 2011/06/07
エントリタイプ: PrivateKeyEntry
証明連鎖の長さ: 2
証明書[1]:
所有者: CN=xxxx.jp, OU=Development , O="AAAA, Inc.", L=Shinagawa-ku, ST=Tokyo, C=JP
発行者: CN=CrossTrust OV CA1, O=CrossTrust, C=JP
シリアル番号: 796220ce7c5e1111
有効期間の開始日: Fri Jun 03 15:18:04 JST 2011 終了日: Wed Jun 15 23:59:59 JST 2016
証明書のフィンガープリント:
MD5: FF:D8:7A:E4:05:60:49:DB:8C:57:74:17:40:3A:2D:73
SHA1: FF:EA:9B:18:EF:7A:61:95:ED:39:2E:44:0E:3D:2D:ED:FD:B9:55:D4
署名アルゴリズム名: SHA1withRSA
バージョン: 3
 
拡張:
 
#1: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
Key_Encipherment
]
 
#2: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: FF 53 BA 2C 05 E6 D1 2E 9F 1B 49 17 8A A8 D3 B8 .S.,......I.....
0010: FF 09 8B 1D ....
]
]
 
#3: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
[DistributionPoint:
[URIName: <a href="http://crl.crosstrust.net/sppca/xt/ovca1.crl">http://crl.crosstrust.net/sppca/xt/ovca1.crl</a> [<a href="http://crl.crosstrust.net/sppca/xt/ovca1.crl" target="_blank">^</a>]]
]]
 
#4: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
[CertificatePolicyId: [1.2.392.200220.1.1]
[PolicyQualifierInfo: [
qualifierID: 1.3.6.1.5.5.7.2.1
qualifier: 0000: 16 26 68 74 74 70 73 3A 2F 2F 72 65 70 6F 73 69 .&amp;<a href="https://reposi/">https://reposi</a> [<a href="https://reposi/" target="_blank">^</a>]
0010: 74 6F 72 79 2E 63 72 6F 73 73 74 72 75 73 74 2E tory.crosstrust.
0020: 6E 65 74 2F 63 70 73 2F net/cps/
 
]] ]
]
 
#5: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
serverAuth
]
 
#6: ObjectId: 2.16.840.1.113730.1.1 Criticality=false
NetscapeCertType [
SSL server
]
 
#7: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 32 88 4F A1 49 8F A9 3E 70 45 F6 CB F3 8C C3 BD 2.O.I..&gt;pE......
0010: A6 16 9A 00 ....
]
 
]
 
証明書[2]:
所有者: CN=CrossTrust OV CA1, O=CrossTrust, C=JP
発行者: OU=Security Communication RootCA1, O=SECOM Trust.net, C=JP
シリアル番号: 12b9b0d4
有効期間の開始日: Thu Oct 21 14:41:18 JST 2010 終了日: Wed Oct 21 14:41:18 JST 2020
証明書のフィンガープリント:
MD5: F4:95:73:C0:E7:33:3C:BB:6A:8B:12:C2:57:B4:54:36
SHA1: 09:6A:9F:FE:8C:AC:68:31:1C:6A:E5:71:D2:68:BA:C3:35:97:FA:5D
署名アルゴリズム名: SHA1withRSA
バージョン: 3
 
拡張:
 
#1: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
 
#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:0
]
 
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 32 88 4F A1 49 8F A9 3E 70 45 F6 CB F3 8C C3 BD 2.O.I..&gt;pE......
0010: A6 16 9A 00 ....
]
]
 
#4: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
[DistributionPoint:
[URIName: <a href="http://repository.secomtrust.net/SC-Root1/SCRoot1CRL.crl">http://repository.secomtrust.net/SC-Root1/SCRoot1CRL.crl</a> [<a href="http://repository.secomtrust.net/SC-Root1/SCRoot1CRL.crl" target="_blank">^</a>]]
]]
 
#5: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
[CertificatePolicyId: [1.2.392.200091.100.901.1]
[PolicyQualifierInfo: [
qualifierID: 1.3.6.1.5.5.7.2.1
qualifier: 0000: 16 2B 68 74 74 70 73 3A 2F 2F 72 65 70 6F 73 69 .+<a href="https://reposi/">https://reposi</a> [<a href="https://reposi/" target="_blank">^</a>]
0010: 74 6F 72 79 2E 73 65 63 6F 6D 74 72 75 73 74 2E tory.secomtrust.
0020: 6E 65 74 2F 53 43 2D 52 6F 6F 74 31 2F net/SC-Root1/
 
]] ]
]
 
#6: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: A0 73 49 99 68 DC 85 5B 65 E3 9B 28 2F 57 9F BD .sI.h..[e..(/W..
0010: 33 BC 07 48 3..H
]
 
]
 
*******************************************
*******************************************