AmazonLinux2023に構築したWebサーバであえてTLSv1.0、1.1を有効化したときのメモ

`※2023年にTLSv1.0、1.1について有効化することは推奨されてませんが、必要に迫られたときの調査と解決に至るまでのメモをまとめました`
うまく行かなかった手順も含めて記載しています。

## 作成するEC2の情報

|項目|バージョン等|
|---|---|
|AMI|ami-06373f281e72070d8|
|AMIの説明|Amazon Linux 2023 AMI 2023.2.20231002.0 arm64 HVM kernel-6.1|
|アーキテクチャ|64bit、Arm|
|インスタンスタイプ|t4g.small（2023年12月31日まで無料トライアルなので）|
|セキュリティグループ|22,80,443番ポートのAnyWhereな接続を許可するインバウンドルールを新規作成|
|EBS|ルートボリュームのみ、8GB、gp3|

その他、作成後のインスタンスに対してElasticIPをアタッチしました

## 作成したEC2の確認とWebサーバインストール
ssh接続後、まずopensslのバージョン確認
```
$ sudo su
# openssl version
OpenSSL 3.0.8 7 Feb 2023 (Library: OpenSSL 3.0.8 7 Feb 2023)
```

httpdとmod_sslインストール
```
# dnf install httpd mod_ssl
```

httpdのバージョン確認
```
# httpd -v
Server version: Apache/2.4.56 (Amazon Linux)
Server built:   Mar 15 2023 00:00:00
```

httpdの自動起動設定＆起動
```
# systemctl is-enabled httpd
disabled

# systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

# systemctl start httpd
```

httpd起動後、EC2の管理画面上で「パブリック IPv4 DNS」に記載のアドレスをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/ec7a257d-b7f1-67b8-7bf4-714186b98b95.png)

ブラウザでアクセスしてHTTP、HTTPSのそれぞれでIt worksが表示されることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/bb6c1223-de29-944f-6ce1-7aa62d5ea33e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/9a30e65e-33cc-766c-785d-9a98acd97b8b.png)

https~~でアクセスしたときのリクエストについて開発者ツールで確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/e7adde9f-6bc7-1df6-f07f-597468161dd3.png)
プロトコルバージョンについて「TLSv1.3」の記述を確認できました


## SSLのテスト1回目（初期状態）
SSLのテストには[SSL Labsのテストツール](https://www.ssllabs.com/ssltest/)を使用

↓「Click here to ignore~~~」をクリックして証明書のエラーを無視して検証できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/459b9dd1-e298-05fe-41c8-f243bd7e2891.png)
↓
TLSv1.3がサポートされていること、Protocol Supportについて100点であることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/280ad368-0a7e-3ea5-e32e-56148f7c4a23.png)

デフォルトの状態でTLSv1.0、1.1が無効化されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/b311d6f5-36c7-e6fe-a282-2aaf0c9f11a9.png)

このときのhttpdのssl.confは以下のような状態(抜粋)
```conf:/etc/httpd/conf.d/ssl.conf
<VirtualHost _default_:443>

#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on

#   List the protocol versions which clients are allowed to connect with.
#   The OpenSSL system profile is configured by default.  See
#   update-crypto-policies(8) for more details.
#SSLProtocol all -SSLv3
#SSLProxyProtocol all -SSLv3

#   User agents such as web browsers are not configured for the user's
#   own preference of either security or performance, therefore this
#   must be the prerogative of the web server administrator who manages
#   cpu load versus confidentiality, so enforce the server's cipher order.
SSLHonorCipherOrder on

#   SSL Cipher Suite:
#   List the ciphers that the client is permitted to negotiate.
#   See the mod_ssl documentation for a complete list.
#   The OpenSSL system profile is configured by default.  See
#   update-crypto-policies(8) for more details.
#SSLCipherSuite PROFILE=SYSTEM

</VirtualHost>
```
SSLProtocolがコメントアウトされていることを確認

## TLSv1.0、1.1についてssl.confの中で有効化してテスト（失敗）
`※この手順は誤りでしたが一応記載`

ssl.confを編集
```diff:/etc/httpd/conf.d/ssl.conf
#SSLProtocol all -SSLv3
#SSLProxyProtocol all -SSLv3
+SSLProtocol all -SSLv3 +TLSv1 +TLSv1.1

#SSLCipherSuite PROFILE=SYSTEM
+SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
```
- SSLProtocol の設定値にTLSv1、TLSv1.1を明示
- SSLCipherSuite の設定になんかいろいろ許可する感じの設定を追記（よくわかってない）

httpdのシンタックスチェックと再起動
```
# httpd -t
Syntax OK

# systemctl restart httpd
```

SSL Labsのサイトで再チェックしたところTLSv1.0、1.1が有効となっていないことを確認。。:pensive:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/8db34f20-35ee-b884-f0a8-510551eff7c4.png)

## OpenSSLの設定を確認
openssl側の方で設定していそうなことや、セキュリティレベルを下げると良いという情報を発見。
参考サイト：https://github.com/openssl/openssl/issues/13299

opensslの設定ファイルの場所を確認
```
# openssl version -d
OPENSSLDIR: "/etc/pki/tls"

# ll /etc/pki/tls/
total 16
lrwxrwxrwx. 1 root root    49 Aug 15 18:22 cert.pem -> /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
drwxr-xr-x. 2 root root    75 Oct  4 07:01 certs
-rw-r--r--. 1 root root   412 Sep  6 22:25 ct_log_list.cnf
lrwxrwxrwx. 1 root root    50 Sep  6 22:29 fips_local.cnf -> /etc/crypto-policies/back-ends/openssl_fips.config
drwxr-xr-x. 2 root root     6 Sep  6 22:29 misc
-rw-r--r--. 1 root root 12163 Sep  6 22:25 openssl.cnf
drwxr-xr-x. 2 root root    27 Oct  4 07:01 private
```

openssl.cnfを確認(抜粋)
```conf:/etc/pki/tls/openssl.cnf 
 # Use this in order to automatically load providers.
openssl_conf = openssl_init

[openssl_init]
providers = provider_sect
# Load default TLS policy configuration
ssl_conf = ssl_module

[ ssl_module ]
system_default = crypto_policy

[ crypto_policy ]
.include = /etc/crypto-policies/back-ends/opensslcnf.config
```
上から順に
- `openssl_conf` の設定で openssl_init セクションを参照する
- openssl_init セクションの `ssl_conf` の設定で ssl_module セクションを参照する
- ssl_module セクションの `system_default` の設定で crypto_policy セクションを参照する
- crypto_policy セクションの中で外部のファイルをインクルードする

という設定の流れを読めました

opensslcnf.configの中は以下の通り
```conf:/etc/crypto-policies/back-ends/opensslcnf.config
CipherString = @SECLEVEL=2:kEECDH:kRSA:kEDH:kPSK:kDHEPSK:kECDHEPSK:kRSAPSK:-aDSS:-3DES:!DES:!RC4:!RC2:!IDEA:-SEED:!eNULL:!aNULL:!MD5:-SHA384:-CAMELLIA:-ARIA:-AESCCM8
Ciphersuites = TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256
TLS.MinProtocol = TLSv1.2
TLS.MaxProtocol = TLSv1.3
DTLS.MinProtocol = DTLSv1.2
DTLS.MaxProtocol = DTLSv1.2
SignatureAlgorithms = ECDSA+SHA256:ECDSA+SHA384:ECDSA+SHA512:ed25519:ed448:rsa_pss_pss_sha256:rsa_pss_pss_sha384:rsa_pss_pss_sha512:rsa_pss_rsae_sha256:rsa_pss_rsae_sha384:rsa_pss_rsae_sha512:RSA+SHA256:RSA+SHA384:RSA+SHA512:ECDSA+SHA224:RSA+SHA224

[openssl_init]
alg_section = evp_properties

[evp_properties]
rh-allow-sha1-signatures = yes
```
- `TLS.MinProtocol`という設定値にTLSv1.2の記載を発見:flushed:
- `CipherString`という設定値の中でセキュリティレベルについて2に設定してそうな記述を発見

## TLSv1.0、1.1についてopensslcnf.configを編集してテスト（失敗）
`※この手順は誤りでしたが一応記載`

TLSの最小プロトコルについてTLSv1.0を許容するような設定変更を実施
```diff:/etc/crypto-policies/back-ends/opensslcnf.config
Ciphersuites = TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256
-TLS.MinProtocol = TLSv1.2
+TLS.MinProtocol = TLSv1
TLS.MaxProtocol = TLSv1.3
```

必要かわからないけどhttpdを再起動
```
# systemctl restart httpd
```

SSL Labsのサイトで再チェックしたところTLSv1.0、1.1が有効となっていないことを確認。。:pensive::pensive:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/3419010d-c608-cbc8-ad1f-e3cf8c06c266.png)

`TLS.MinProtocolの設定については元に戻しました。`

## openssl.cnfでセキュリティレベルを0に編集してテスト（成功）
```diff:/etc/pki/tls/openssl.cnf
[openssl_init]
-ssl_conf = ssl_module
+ssl_conf = ssl_legacy_sect

↓末尾に追記
+[ssl_legacy_sect]
+system_default = system_default_legacy_sect
+
+[system_default_legacy_sect]
+Options = UnsafeLegacyRenegotiation
+CipherString = DEFAULT@SECLEVEL=0
```

- TLSv1.2を最小とする設定がなされた opensslcnf.config を読み込むのをやめる
- ssl_legacy_sect セクション、system_default_legacy_sect セクションを新設（ファイル末尾に追記）
- `ssl_conf` の設定で ssl_module セクションを参照していた箇所について新設した ssl_legacy_sect セクションを参照するよう書き換え
- `Options` の設定でUnsafeLegacyRenegotiationを設定
- `CipherString` の設定でセキュリティレベルについて0にする

というような内容。

必要かわからないけどhttpdを再起動
```
# systemctl restart httpd
```

SSL Labsのサイトで再チェックしたところTLSv1.0、1.1が有効となったことを確認！:heart_eyes:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/493ef498-4bd2-5eaf-da7f-c410beac1283.png)

ちなみに推奨されていないTLSv1.0、1.1を有効化したことでページ上部のProtpcol Supportのスコアが下がったことも確認できました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/b1539670-3f43-1763-baac-7d2a15596bf5.png)

## ブラウザ(FireFox)で動作確認
TLSv1.0、1.1での通信を行うためにブラウザの設定を一時的に書き換える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/2f4d4ea7-50eb-8b65-1464-d0412fbddd7f.png)
↓
TLSのバージョンについて最小と最大のそれぞれを1（TLSv1.0）とする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/6a844270-480e-eceb-bef1-5fa0ad3b70ec.png)
↓
It worksの表示されるアドレスにアクセスしたときのリクエストについて開発者ツールで確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384986/be148f9c-d030-a640-18c4-34006b256595.png)
プロトコルバージョンについて「TLSv1」の記述を確認できました

## 参考ページ
- [OpenSSL 3.0 will continue to support TLS 1.0 and 1.1? · Issue #13299 · openssl/openssl](https://github.com/openssl/openssl/issues/13299)
    - そもそもOpenSSL3がTLSv1.0、1.1に対応しているのかを調査していたときに読んだissue
    - セキュリティレベルについての言及もありました（よくわかってない）
- [TLS 1.0及び1.1の無効化とTLS 1.3の有効化について（10月9日土曜日実施予定） - 日経テレコン２１からのお知らせ](https://t21help.nikkei.co.jp/oshirase/2021/09/20210929-1.html)
    - 動作確認に使用するブラウザ(FireFox)でTLSv1.0や1.1での通信が行うにあたっての設定変更の方法を調べたときに読んだページ
- [SSL Server Test (Powered by Qualys SSL Labs)](https://www.ssllabs.com/ssltest/)
    - 構築したWebサーバのTLSのサポート状況を確認するのに使用したツール