【2020年3月5日まで】RDS証明書を更新する for java

# プロローグ

[新しい SSL/TLS 証明書を使用して MySQL DB インスタンスに接続するようにアプリケーションを更新](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/ssl-certificate-rotation-mysql.html)

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 インスタンスへの接続の暗号化](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html) から、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ファイル名にする。

```xml:context.xml
<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&amp;characterEncoding=UTF-8&amp;useSSL=true&amp;requireSSL=true&amp;verifyServerCertificate=true&amp;trustCertificateKeyStoreUrl=file:///etc/pki/java/rds-combined-ca-bundle.jks&amp;trustCertificateKeyStoreType=JKS&amp;trustCertificateKeyStorePassword=password"
/>
```

# エピローグ

context.xml を保存した瞬間に反映されしまうので焦った:scream:
（検証環境なので、そうでもないけど）

証明書を同じファイル名にすればcontext.xmlの変更は要らないが、同じファイル名で新旧を管理するとトラブルの元なので、ファイル名は変更することにした。

2019版証明書(rds-ca-2019-ap-northeast-1.pem)で試したら、しっかり動かなかった:sweat_smile:

2.証明書の変換 にて**証明書をインストールするところは、バンドル版の証明書を使用してはいけない。
![alert-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63018/71abad87-2851-d04e-9b6d-b18d98c7e74a.gif)
最初の一つしかインストールされないからだ。**

サーバ側はawsコンソールでポチポチするだけなので、「SSL/TLS 証明書の更新」を参考にしてください。


# 参考

[新しい SSL/TLS 証明書を使用して MariaDB DB インスタンスに接続するようにアプリケーションを更新](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/ssl-certificate-rotation-mariadb.html)

[SSL/TLS を使用した DB インスタンスへの接続の暗号化](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html)

[SSL/TLS 証明書の更新](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL-certificate-rotation.html)