TomcatサーバーにSSLサーバー証明書をインポートする手順を忘れないうちにメモっておきます。
【前提条件】
(1) Tmocatサーバーがすでに起動している。
(2) キーストアを作成する場所=>/home/user_name
(3) ファイル名とエイリアス
No | ファイルの種類 | ファイル名 | エイリアス(alias) |
1 | キーストア | .keystore | tomcat (最初に、生成されるサーバー自己証明書) |
2 | 証明書署名要求csrファイル | 2013server.csr | tomcat |
3 | 中間証明書 | 2013interca.cer | interca |
4 | サーバー証明書 | 2013cert.cer | tomcat※ |
※サーバー証明書をインポートするときは、エイリアスをtomcatとし、最初に作成された自己証明書(オレオレサーバー証明書)に上書きインポートする。tomcatとは異なるエイリアスでインポートすると自己証明書とサーバー証明書の2種類が存在し、サーバー証明書の有効性が検証できない。(参照図1)基本的にファイル名やエイリアス名は任意に付けることができます。 |
(4) パスワード=>changeit (任意に付けることができます。控えておきます。紛失しないように。)
(5) puttyのリモート操作によって作業をします。(putty内のコピーは、ドラッグ。貼り付けは、右クリックです。)
1.キーストアの作成
(1) キーストアを作成する
ユーザーディレクトリへ移動し、keytoolコマンドを実行してキーストアを作成します。エイリアス名はtomcat。
$ cd /home/user_name
$ keytool -genkey -alias tomcat -keyalg RSA -keysize 2048 -keystore .keystore
キーストアのパスワードを入力してください: <=任意のパスワード(控えておく)今回はchangeitです。セキュリティ上表示はされません。
姓名を入力してください。
[Unknown]: www.shigizemi.com <=コモンネーム(申請する認証局に形式が記載されているが、ほとんどFQDNと同じ)
組織単位名を入力してください。
[Unknown]: security <=任意(入力しなくてもいいかも)
組織名を入力してください。
[Unknown]: shigizemi.com <=ドメイン名にした
都市名または地域名を入力してください。
[Unknown]: Ogori <=市町村名でよい
州名または地方名を入力してください。
[Unknown]: Fukuoka <=都道府県名でよい
この単位に該当する 2 文字の国番号を入力してください。
[Unknown]: JP <=日本なのでJPとなる
CN=www.shigizemi.com, OU=security, O=shigizemi.com, L=Ogori, ST=Fukuoka, C=JP でよろしいですか?
[no]: y <=yesと入力しても終了しなかった。再び、同じ項目を聞いてきたので、「y」と入力したら完了した。
<tomcat> の鍵パスワードを入力してください。 <=初めに入力したパスワードchangeitを再度入力する。セキュリティ上表示されません。
ユーザーディレクトリにサーバー自己証明書を含む.keystoreが作成されます。
(2) キーストアの確認
$ keytool -list -v -keystore .keystore
キーストアのパスワードを入力してください <=changeitを入力(セキュリティ上表示さません)
キーストアのタイプ: JKS
キーストア・プロバイダ: SUNキーストアには1エントリが含まれます別名: tomcat
作成日: 2013/11/03
エントリ・タイプ: PrivateKeyEntry
証明書チェーンの長さ: 1
証明書[1]:
所有者: CN=www.shigizemi.com, OU=security, O=shigizemi.com, L=Ogori, ST=Fukuoka, C=JP
発行者: CN=www.shigizemi.com, OU=security, O=shigizemi.com, L=Ogori, ST=Fukuoka, C=JP
シリアル番号: 29cb2160
有効期間の開始日: Sun Nov 03 20:50:17 JST 2013終了日: Sat Feb 01 20:50:17 JST 2014
証明書のフィンガプリント:
………
と表示されます。
ご覧の通り、所有者と発行者が同じですね。サーバーの自己証明書(オレオレ証明)となっています。サーバーを公開し不特定多数で利用する場合はこれでは警告が出まくって使えませんね。
もちろん、身内で了解済みなら問題ないですが。(このままでも使えますよ。)
(3) キーストアのバックアップ
完成品をバックアップすればそれで済みますが、インポート操作中に不具合や失敗なども考えられますので、この段階で一応念の為に.keystoreをバックアップしておきます。
$ cp .keystore .keystore_org
もし、失敗した場合、この.keystore_orgをコピーして、何度でもやり直すことができます。(重要かも)
2.証明書署名要求(CSR)の作成
認証局に申請するためにこの自己証明書をエクスポートします。
(1) CSRの作成
1.で作成した.keystore内に保存されているサーバー自己証明書をエクスポートして、証明書署名要求(CSR)を作成します。
同じユーザディレクトリ内での作業です。
ディレクトリ内に2013server.csrが作成されています。
(2) 認証局にCSRを貼りつけて申請
2013server.csrを開きます。
$ vi 2013server.csr
(cat 2013server.csr でもいいかも)
-----BEGIN NEW CERTIFICATE REQUEST----- MIIC6zCCAdMCAQAwdjELMAkGA1UEBhMCSlAxEDAOBgNVBAgTB0Z1a3Vva2ExDjAMBgNVBAcTBU9n …………………… …………………… …………………… 4JjxngkzNnmwOL+UFFm/Zxjg12ONn0fonRRCNowbmFMXHo7z0wlxMJsUHXHJie7sl3U1nhK0ef62 r/o+lHWOJfxfDA== -----END NEW CERTIFICATE REQUEST-----
と表示されました。
-----BEGIN NEW CERTIFICATE REQUEST-----から、
…………
…………
-----END NEW CERTIFICATE REQUEST----- までを全部コピーします。
(このとき、不要な改行や文字、空行など入らないようにします。)
なお、puttyでリモート操作しているので、実際は指定範囲をドラッグするだけで、クリップボードに記憶されます。特別な操作は不要です。各自の端末や環境に合わせて操作してください。
認証局のサイト内で、指定された場所に貼り付けます。(当社はRapidSSLを利用しています。理由は、安い!)
必要事項(メールアドレス、会社名、責任者名、証明書の有効期間、クレジットカード番号など)入力して、申請後、
審査が通るとメールでサーバー証明書等(証明書発行通知)が返信されてきます。(更新の場合、特に問題がないなら、数秒で返ってきます。初めての申請なら時間がかかるかもしれませんね。数日はみておきましょう。)
3.中間証明書のインポート
(1) 中間証明書のコピー
証明書発行通知のメール内に、中間証明書が記載されています。
===メール本文より抜粋=====
中間証明書(INTERMEDIATE CA): --------------------------------------- -----BEGIN CERTIFICATE----- MIID1TCCAr2gAwIBAgIDAjbRMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT ……… ……… LEL2TxyJeN4mTvVvk0wVaydWTQBUbHq3tw== -----END CERTIFICATE-----
==抜粋終わり
-----BEGIN CERTIFICATE-----から、 -----END CERTIFICATE-----までを、全部コピーします。
(2) 中間証明書作成
中間証明を貼り付けるために空ファイル2013interca.cerを作成します。
その後、それを開き、中間証明書を貼り付けます。
$ touch 2013interca.cer <=空ファイル作成
$ vi 2013interca.cer <=開いて、貼り付ける(puttyの場合、ファイルの先頭行左端を右クリックする)
上書き保存します。
これで、中間証明書(2013interca.cer)が完成しました。
(3) 中間証明書インポート
$ keytool -import -trustcacerts -alias interca -keystore .keystore2013 -file 2013interca.cer
キーストアのパスワードを入力してください: <=changeitと入力(入力したパスワードはセキュリティ上、表示されません)
証明書がキーストアに追加されました
4.サーバー証明書のインポート
(1) サーバー証明書のコピー
証明書発行通知メール内にサーバー証明書が記載されています。
===メール本文より抜粋
========================== SSLサーバ証明書(X.509形式) --------------------------------------- -----BEGIN CERTIFICATE----- MIIFNzCCBB+gAwIBAgIDDtgBMA0GCSqGSIb3DQEBBQUAMDwxCzAJBgNVBAYTAlVT ……… ……… hSxX8eC0nW6O2X/Shx8A59HloSqezxbWgPi7aZ53UZHgEfXqAMGdJ5GOJQ== -----END CERTIFICATE-----
===抜粋終わり
-----BEGIN CERTIFICATE-----から、 -----END CERTIFICATE-----までをコピーします。(ドラッグでコピーされます。)
(2) サーバー証明書の作成
サーバー証明書を貼り付ける空ファイル2013cert.cerを作成します。
それを開き、サーバー証明書を貼り付けます。
$ touch 2013cert.cer <=空のファイルを作成
$ vi 2013cert.cer <=ファイルを開き、貼り付ける。(左上を右クリック)上書き保存。
これで、サーバー証明書(2013cert.cer)が完成しました。
(3) サーバー証明書のインポート
<重要>エイリアス名をtomcatとして、インポートします。
$ keytool -import -trustcacerts -alias tomcat -keystore .keystore2013 -file 2013cert.cer
キーストアのパスワードを入力してください: <=changeitと入力(入力したパスワードはセキュリティ上、表示されません)
証明書がキーストアに追加されました
このとき、最初に作成されたサーバーの自己証明書は、認証を受けたサーバー証明書で上書きされます。
.keystoreの登録内容を見ると、
$ keytool -list -v -keystore .keysrore
キーストアのパスワードを入力してください: <=changeitと入力
キーストアのタイプ: JKS
キーストア・プロバイダ: SUN
キーストアには2エントリが含まれます
別名: interca
作成日: 2013/11/05
エントリ・タイプ: trustedCertEntry
所有者: CN=RapidSSL CA, O=”GeoTrust, Inc.”, C=US
発行者: CN=GeoTrust Global CA, O=GeoTrust Inc., C=US
シリアル番号: 236d1
有効期間の開始日: Sat Feb 20 07:45:05 JST 2010終了日: Wed Feb 19 07:45:05 JST 2020
証明書のフィンガプリント:
……
……
別名: tomcat
作成日: 2013/11/05
エントリ・タイプ: PrivateKeyEntry
証明書チェーンの長さ: 3
証明書[1]:
所有者: CN=www.shigizemi.com, OU=Domain Control Validated – RapidSSL(R), OU=See www.rapidssl.com/resources/cps (c)13, OU=GT70567882, SERIALNUMBER=rfX8qsziOTABYHOVGxNTmBlL9/Wlrgi-
発行者: CN=RapidSSL CA, O=”GeoTrust, Inc.”, C=US
シリアル番号: ed801
有効期間の開始日: Sat Nov 02 00:56:45 JST 2013終了日: Sun Jan 04 11:57:01 JST 2015
証明書のフィンガプリント:
……
<注意>
まず、中間証明書、次にサーバー証明書の順にインポートします。先にサーバー証明書をインポートすると、
keytoolエラー: java.lang.Exception: 応答から連鎖を確立できませんでした
とエラーが発生し、サーバー証明書のインポートに失敗します。
5.TomcatのSSL有効化
(1) server.xlmの編集
root権限で編集します。
下記の<Connector port=”8443″…clientAuth=”false” sslProtocol=”TLS” />部分がコメントアウトされているので、
<--! -->
を削除して、SSLを有効化します。
$ su –
# vi /home/user_name/apache-tomcat-x.x.xx/conf/server.xml
<Connector port=”8443″ protocol=”HTTP/1.1″ SSLEnabled=”true”
maxThreads=”150″ scheme=”https” secure=”true”
keystoreFile=”/home/user_name/.keystore” <=.keystoreのパスを指定
keystorePass=”changeit” <=パスワード指定(changeitなら、不要だが、念の為。)
clientAuth=”false” sslProtocol=”TLS” />
編集後、上書き保存します。
(2) Tomcatの再起動
root権限で実行します。
# /home/user_name/apache-tomcat-x.x.xx/bin/shutdown.sh <=停止
# /home/user_name/apache-tomcat-x.x.xx/bin/startup.sh <=起動
(3) SSL接続とサーバー証明書の確認
ブラウザーのアドレスバーにhttps://から始まるTomcatサーバーのURLを入力してSSL接続が可能かをチェックする。
当社では、ローカル内のDMZにサーバーがあるので、ローカル内のPCでアクセスするとサーバー証明書に
登録されているアドレス(コモンネーム)とローカル内のサーバーのURLが異なるので、警告が表示されます。
しかし、例外に追加すれば、次回から警告は表示されません。
もちろん、外部ネットワークからのアクセスでは警告は表示されません。
サーバー証明書を確認してみました。
図1−1,図1−2は、サーバー証明書のインポートに失敗している場合です。最初の時点でキーストア内に作成したサーバー自己証明書に設定したエイリアス(今回はtomcat)と異なるエイリアスを指定して認証局から返信されたサーバー証明書をインポートすると失敗します。
キーストア内に認証されていないサーバー証明書(初期)と認証済みのサーバー証明書の2種類が存在することが原因のようです。
正しくは、認証済みのサーバー証明書を最初に設定したエイリアス(今回はtomcat)と同じにしてインポート(上書き)すると成功しました。図2−1,図2−2。ちゃんと、ルート認証局、中間認証局が表示されています。
6.各ファイルのバックアップ
「.keystore」「2013server.csr」「2013interca.cer」「2013cert.cer」のコピーをとり、大切に保管しておきます。
(「.keystore_org」も保管しておいてもいいでしょう。)