プロローグ
新しい SSL/TLS 証明書を使用して MySQL DB インスタンスに接続するようにアプリケーションを更新
2020年3月5日までにRDSのcaを更新してくださいという話。
手順通りやれば問題ないのだが、いくつかハマりポイントがあったので記事にした。 猛烈にハマったので記事にした。
前提
・java
・tomcat
・mysql
・証明書はJKS形式
・クライアントの証明書を先に更新し、mysqlの証明書は後から更新
(同時の場合は、ダウンロードする証明書が異なる)
手順
1.証明書の取得
先にクライアントを更新するので、2015,2019のバンドル版をダウンロード 2015と2019の証明書をダウンロード
場所は現在と同じでよいかと。
$ cd /etc/pki/java
$ wget https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem
$ wget https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem
$ wget https://s3.amazonaws.com/rds-downloads/rds-ca-2019-ap-northeast-1.pem
$ wget https://s3.amazonaws.com/rds-downloads/rds-ca-2015-ap-northeast-1.pem
--2020-01-22 21:19:38-- https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem
s3.amazonaws.com (s3.amazonaws.com) をDNSに問いあわせています... 52.216.139.61
s3.amazonaws.com (s3.amazonaws.com)|52.216.139.61|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1456 (1.4K) [binary/octet-stream]
`rds-ca-2019-root.pem' に保存中
100%[==========================================================================================================================================>] 1,456 --.-K/s 時間 0s
2020-01-22 21:19:40 (12.8 MB/s) - `rds-ca-2019-root.pem' へ保存完了 [1456/1456]
[root@letsnote java]# wget https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem
--2020-01-22 21:19:40-- https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem
s3.amazonaws.com (s3.amazonaws.com) をDNSに問いあわせています... 52.216.139.61
s3.amazonaws.com (s3.amazonaws.com)|52.216.139.61|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1432 (1.4K) [binary/octet-stream]
`rds-ca-2015-root.pem' に保存中
100%[==========================================================================================================================================>] 1,432 --.-K/s 時間 0s
2020-01-22 21:19:41 (13.0 MB/s) - `rds-ca-2015-root.pem' へ保存完了 [1432/1432]
[root@letsnote java]# wget https://s3.amazonaws.com/rds-downloads/rds-ca-2019-ap-northeast-1.pem
--2020-01-22 21:19:41-- https://s3.amazonaws.com/rds-downloads/rds-ca-2019-ap-northeast-1.pem
s3.amazonaws.com (s3.amazonaws.com) をDNSに問いあわせています... 52.216.139.61
s3.amazonaws.com (s3.amazonaws.com)|52.216.139.61|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1464 (1.4K) [binary/octet-stream]
`rds-ca-2019-ap-northeast-1.pem' に保存中
100%[==========================================================================================================================================>] 1,464 --.-K/s 時間 0s
2020-01-22 21:19:42 (13.3 MB/s) - `rds-ca-2019-ap-northeast-1.pem' へ保存完了 [1464/1464]
[root@letsnote java]# wget https://s3.amazonaws.com/rds-downloads/rds-ca-2015-ap-northeast-1.pem
--2020-01-22 21:19:42-- https://s3.amazonaws.com/rds-downloads/rds-ca-2015-ap-northeast-1.pem
s3.amazonaws.com (s3.amazonaws.com) をDNSに問いあわせています... 52.216.139.61
s3.amazonaws.com (s3.amazonaws.com)|52.216.139.61|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1448 (1.4K) [binary/octet-stream]
`rds-ca-2015-ap-northeast-1.pem' に保存中
100%[==========================================================================================================================================>] 1,448 --.-K/s 時間 0s
2020-01-22 21:19:43 (10.0 MB/s) - `rds-ca-2015-ap-northeast-1.pem' へ保存完了 [1448/1448]
クライアントとサーバを同時に更新する場合は、SSL/TLS を使用した DB インスタンスへの接続の暗号化 から、2019バージョンにする。東京リージョンの場合は、rds-ca-2019-ap-northeast-1.pem
2.証明書の変換
pemをjksに変換する
pem->der、der->jksの2ステップを踏む必要がある
jksに変換するとき、現在の証明書と異なるファイル名にすること
パスワードは現在と同じで構わない。証明書アクセス用なので、DBのパスワードとは無関係。
$ cd /etc/pki/java
$ openssl x509 -outform der -in ./rds-ca-2019-root.pem -out ./rds-ca-2019-root.der
$ openssl x509 -outform der -in ./rds-ca-2015-root.pem -out ./rds-ca-2015-root.der
$ openssl x509 -outform der -in ./rds-ca-2019-ap-northeast-1.pem -out ./rds-ca-2019-ap-northeast-1.der
$ openssl x509 -outform der -in ./rds-ca-2015-ap-northeast-1.pem -out ./rds-ca-2015-ap-northeast-1.der
$ ll
lrwxrwxrwx. 1 root root 40 6月 9 2019 cacerts -> /etc/pki/ca-trust/extracted/java/cacerts
-rw-r--r-- 1 root root 1029 1月 22 21:23 rds-ca-2015-ap-northeast-1.der
-rw-r--r-- 1 root root 1448 3月 7 2015 rds-ca-2015-ap-northeast-1.pem
-rw-r--r-- 1 root root 1016 1月 22 21:23 rds-ca-2015-root.der
-rw-r--r-- 1 root root 1432 3月 7 2015 rds-ca-2015-root.pem
-rw-r--r-- 1 root root 1040 1月 22 21:23 rds-ca-2019-ap-northeast-1.der
-rw-r--r-- 1 root root 1464 9月 19 02:07 rds-ca-2019-ap-northeast-1.pem
-rw-r--r-- 1 root root 1034 1月 22 21:23 rds-ca-2019-root.der
-rw-r--r-- 1 root root 1456 9月 5 02:53 rds-ca-2019-root.pem
[root@letsnote java]#
$ keytool -import -file ./rds-ca-2019-root.der -destkeystore ./rds-combined-ca-bundle-2019.jks -deststoretype jks -alias rds_root
キーストアのパスワードを入力してください:
キーストアのパスワードが短すぎます - 6文字以上にしてください
キーストアのパスワードを入力してください:
新規パスワードを再入力してください:
所有者: CN=Amazon RDS Root 2019 CA, OU=Amazon RDS, O="Amazon Web Services, Inc.", ST=Washington, L=Seattle, C=US
発行者: CN=Amazon RDS Root 2019 CA, OU=Amazon RDS, O="Amazon Web Services, Inc.", ST=Washington, L=Seattle, C=US
シリアル番号: c73467369250ae75
有効期間の開始日: Fri Aug 23 02:08:50 JST 2019 終了日: Fri Aug 23 02:08:50 JST 2024
証明書のフィンガプリント:
MD5: 66:EC:63:BB:25:C4:A5:34:82:C6:C0:18:2E:88:9F:0D
SHA1: D4:0D:DB:29:E3:75:0D:FF:A6:71:C3:14:0B:BF:5F:47:8D:1C:80:96
SHA256: F2:54:C7:D5:E9:23:B5:B7:51:0C:D7:9E:F7:77:7C:1C:A7:E6:4A:3C:97:22:E4:0D:64:54:78:FC:70:AA:D0:08
署名アルゴリズム名: SHA256withRSA
サブジェクト公開鍵アルゴリズム: 2048ビットRSA鍵
バージョン: 3
拡張:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 73 5F 60 D8 BC CB 03 98 F4 2B 17 34 2E 36 5A A6 s_`......+.4.6Z.
0010: 60 FF BC 1F `...
]
]
#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#3: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#4: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 73 5F 60 D8 BC CB 03 98 F4 2B 17 34 2E 36 5A A6 s_`......+.4.6Z.
0010: 60 FF BC 1F `...
]
]
この証明書を信頼しますか。 [いいえ]: はい
証明書がキーストアに追加されました
$ keytool -import -file ./rds-ca-2015-root.der -destkeystore ./rds-combined-ca-bundle-2019.jks -deststoretype jks -alias rds_root_2015
$ keytool -import -file ./rds-ca-2019-ap-northeast-1.der -destkeystore ./rds-combined-ca-bundle-2019.jks -deststoretype jks -alias rds_ap-northeast-1
$ keytool -import -file ./rds-ca-2015-ap-northeast-1.der -destkeystore ./rds-combined-ca-bundle-2019.jks -deststoretype jks -alias rds_ap-northeast-1_2015
$ ll
-rw-r--r-- 1 root root 1029 1月 22 21:23 rds-ca-2015-ap-northeast-1.der
-rw-r--r-- 1 root root 1448 3月 7 2015 rds-ca-2015-ap-northeast-1.pem
-rw-r--r-- 1 root root 1016 1月 22 21:23 rds-ca-2015-root.der
-rw-r--r-- 1 root root 1432 3月 7 2015 rds-ca-2015-root.pem
-rw-r--r-- 1 root root 1040 1月 22 21:23 rds-ca-2019-ap-northeast-1.der
-rw-r--r-- 1 root root 1464 9月 19 02:07 rds-ca-2019-ap-northeast-1.pem
-rw-r--r-- 1 root root 1034 1月 22 21:23 rds-ca-2019-root.der
-rw-r--r-- 1 root root 1456 9月 5 02:53 rds-ca-2019-root.pem
-rw-r--r-- 1 root root 4313 1月 22 21:26 rds-combined-ca-bundle-2019.jks
$ keytool -v -list -keystore ./rds-combined-ca-bundle-2019.jks
キーストアのパスワードを入力してください:
キーストアのタイプ: jks
キーストア・プロバイダ: SUN
キーストアには4エントリが含まれます
別名: rds_root_2015
作成日: 2020/01/22
エントリ・タイプ: trustedCertEntry
所有者: CN=Amazon RDS Root CA, OU=Amazon RDS, O="Amazon Web Services, Inc.", L=Seattle, ST=Washington, C=US
発行者: CN=Amazon RDS Root CA, OU=Amazon RDS, O="Amazon Web Services, Inc.", L=Seattle, ST=Washington, C=US
シリアル番号: 42
有効期間の開始日: Thu Feb 05 18:11:31 JST 2015 終了日: Thu Mar 05 18:11:31 JST 2020
証明書のフィンガプリント:
MD5: CF:C1:A2:0D:A1:C1:B1:3C:12:0B:C1:5A:E5:33:73:EF
SHA1: E8:11:88:56:E7:A7:CE:3E:5E:DC:9A:31:25:1B:93:AC:DC:43:CE:B0
SHA256: AF:EB:B8:40:BE:0C:1A:F6:5E:63:E0:CB:D7:9C:CE:35:65:4B:F6:0F:4E:07:62:54:BB:A9:35:E9:63:6D:53:F7
署名アルゴリズム名: SHA1withRSA
サブジェクト公開鍵アルゴリズム: 2048ビットRSA鍵
バージョン: 3
拡張:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 4E 02 EE AC 3E F6 15 C8 4C ED 2C F5 05 C1 8F 9C N...>...L.,.....
0010: 84 08 49 83 ..I.
]
]
#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#3: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#4: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 4E 02 EE AC 3E F6 15 C8 4C ED 2C F5 05 C1 8F 9C N...>...L.,.....
0010: 84 08 49 83 ..I.
]
]
*******************************************
*******************************************
別名: rds_ap-northeast-1
作成日: 2020/01/22
エントリ・タイプ: trustedCertEntry
所有者: CN=Amazon RDS ap-northeast-1 2019 CA, OU=Amazon RDS, O="Amazon Web Services, Inc.", L=Seattle, ST=Washington, C=US
発行者: CN=Amazon RDS Root 2019 CA, OU=Amazon RDS, O="Amazon Web Services, Inc.", ST=Washington, L=Seattle, C=US
シリアル番号: 7045
有効期間の開始日: Thu Sep 19 01:56:20 JST 2019 終了日: Fri Aug 23 02:08:50 JST 2024
証明書のフィンガプリント:
MD5: E1:E7:BE:95:BC:D4:C1:F8:BE:8C:44:EE:A1:34:48:0C
SHA1: 47:A3:F9:20:64:5C:9F:9D:48:8C:7D:E6:0B:86:D6:05:13:00:16:A1
SHA256: 90:91:AF:2D:FA:F4:ED:88:2A:4A:B3:3B:9B:4E:DD:2A:8C:BA:41:0A:AB:22:04:17:EF:3D:57:61:85:C2:20:ED
署名アルゴリズム名: SHA256withRSA
サブジェクト公開鍵アルゴリズム: 2048ビットRSA鍵
バージョン: 3
拡張:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 73 5F 60 D8 BC CB 03 98 F4 2B 17 34 2E 36 5A A6 s_`......+.4.6Z.
0010: 60 FF BC 1F `...
]
]
#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:0
]
#3: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#4: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 2E 6A 0E 4B 59 85 4A 38 FE B2 75 0F C7 80 E0 4B .j.KY.J8..u....K
0010: 74 A4 2C 56 t.,V
]
]
*******************************************
*******************************************
別名: rds_ap-northeast-1_2015
作成日: 2020/01/22
エントリ・タイプ: trustedCertEntry
所有者: CN=Amazon RDS ap-northeast-1 CA, OU=Amazon RDS, O="Amazon Web Services, Inc.", L=Seattle, ST=Washington, C=US
発行者: CN=Amazon RDS Root CA, OU=Amazon RDS, O="Amazon Web Services, Inc.", L=Seattle, ST=Washington, C=US
シリアル番号: 44
有効期間の開始日: Fri Feb 06 07:03:06 JST 2015 終了日: Fri Mar 06 07:03:06 JST 2020
証明書のフィンガプリント:
MD5: D0:F8:8E:C5:33:AF:FC:6B:76:92:0F:78:C4:BE:4A:CE
SHA1: 4B:2D:8A:E0:C1:A3:A9:AF:A7:BB:65:0C:5A:16:8A:39:3C:03:F2:C5
SHA256: DC:11:19:D5:45:F2:2A:CF:13:B6:6E:29:D9:3F:E8:AC:75:F6:9E:EC:CB:D3:AE:F3:CB:22:EC:A4:FD:77:17:F8
署名アルゴリズム名: SHA1withRSA
サブジェクト公開鍵アルゴリズム: 2048ビットRSA鍵
バージョン: 3
拡張:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 4E 02 EE AC 3E F6 15 C8 4C ED 2C F5 05 C1 8F 9C N...>...L.,.....
0010: 84 08 49 83 ..I.
]
]
#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:0
]
#3: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#4: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 88 8A 33 44 3A 9F 52 B8 12 62 F1 B3 76 57 C4 83 ..3D:.R..b..vW..
0010: 5B C0 4C 11 [.L.
]
]
*******************************************
*******************************************
別名: rds_root
作成日: 2020/01/22
エントリ・タイプ: trustedCertEntry
所有者: CN=Amazon RDS Root 2019 CA, OU=Amazon RDS, O="Amazon Web Services, Inc.", ST=Washington, L=Seattle, C=US
発行者: CN=Amazon RDS Root 2019 CA, OU=Amazon RDS, O="Amazon Web Services, Inc.", ST=Washington, L=Seattle, C=US
シリアル番号: c73467369250ae75
有効期間の開始日: Fri Aug 23 02:08:50 JST 2019 終了日: Fri Aug 23 02:08:50 JST 2024
証明書のフィンガプリント:
MD5: 66:EC:63:BB:25:C4:A5:34:82:C6:C0:18:2E:88:9F:0D
SHA1: D4:0D:DB:29:E3:75:0D:FF:A6:71:C3:14:0B:BF:5F:47:8D:1C:80:96
SHA256: F2:54:C7:D5:E9:23:B5:B7:51:0C:D7:9E:F7:77:7C:1C:A7:E6:4A:3C:97:22:E4:0D:64:54:78:FC:70:AA:D0:08
署名アルゴリズム名: SHA256withRSA
サブジェクト公開鍵アルゴリズム: 2048ビットRSA鍵
バージョン: 3
拡張:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 73 5F 60 D8 BC CB 03 98 F4 2B 17 34 2E 36 5A A6 s_`......+.4.6Z.
0010: 60 FF BC 1F `...
]
]
#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#3: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
Key_CertSign
Crl_Sign
]
#4: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 73 5F 60 D8 BC CB 03 98 F4 2B 17 34 2E 36 5A A6 s_`......+.4.6Z.
0010: 60 FF BC 1F `...
]
]
*******************************************
*******************************************
keytool -v -list -keystore ./rds-combined-ca-bundle-2019.jks
で証明書の一覧が表示されるので、4つ入っていることを確認すること。
有効期間の開始日、終了日も確認できる。
3.context.xmlの更新
更新前にtomcatは停止すること。
urlのtrustCertificateKeyStoreUrl=file:///etc/pki/java/rds-combined-ca-bundle.jks
を作成したjksファイル名にする。
<Resource name="jdbc/honyaDB" auth="Container"
type="javax.sql.DataSource"
username="honya"
password="honyapasswd"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://honya.ap-northeast-1.rds.amazonaws.com:3306/honyaDB?useUnicode=true&characterEncoding=UTF-8&useSSL=true&requireSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file:///etc/pki/java/rds-combined-ca-bundle.jks&trustCertificateKeyStoreType=JKS&trustCertificateKeyStorePassword=password"
/>
エピローグ
context.xml を保存した瞬間に反映されしまうので焦った
(検証環境なので、そうでもないけど)
証明書を同じファイル名にすればcontext.xmlの変更は要らないが、同じファイル名で新旧を管理するとトラブルの元なので、ファイル名は変更することにした。
2019版証明書(rds-ca-2019-ap-northeast-1.pem)で試したら、しっかり動かなかった
2.証明書の変換 にて証明書をインストールするところは、バンドル版の証明書を使用してはいけない。
最初の一つしかインストールされないからだ。
サーバ側はawsコンソールでポチポチするだけなので、「SSL/TLS 証明書の更新」を参考にしてください。
参考
新しい SSL/TLS 証明書を使用して MariaDB DB インスタンスに接続するようにアプリケーションを更新