
Debian 10 を実行しているサーバーを Debian 12 (および 6.x カーネル) を実行しているサーバーに移行していますが、動作していないと思われる最後の問題は TLS 1.0 です。これを解決しようとしています。
SECLEVEL
ここで説明されているように、およびを変更することを認識していますMinProtocol
。https://stackoverflow.com/a/61568390/6110631しかし、何らかの理由でこれは機能しませんでした。
作業システムでは、次のものがあります。
[system_default_sect]
MinProtocol = TLSv1.0
CipherString = ALL:@SECLEVEL=1
新しいシステムでも同じ方法で追加してみましたが、TLS 1.0 はまだ動作しないようです。Apache サーバー (依存アプリケーション) では、次のようになります。
AH02039: Certificate Verification: Error (68): CA signature digest algorithm too weak
TLS 1.0 はデフォルトで無効になっているだろうと考えていたので、これはある程度予想していたので、構成をさらにいじってみました。私が行った変更はどれも機能していないようで、ポート ミラーを介してクライアントの観点からパケット キャプチャを実行すると、すべての TLS ネゴシエーションが完全に失敗していることがわかりました (Client Hello, の直後) Alert (Level: Fatal, Description: Protocol Version)
。
を調べてみたらopenssl s_client
、TLS 1.0 全体で何かが壊れているようです。
既存の Debian 10 サーバーでは、次のようになります。
# openssl version
OpenSSL 1.1.1n 15 Mar 2022
# openssl s_client -connect OLDHOST -tls1
CONNECTED(00000003)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = OLDHOST
verify return:1
---
Certificate chain
0 s:CN = OLDHOST
i:C = US, O = Let's Encrypt, CN = R3
1 s:C = US, O = Let's Encrypt, CN = R3
i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
2 s:C = US, O = Internet Security Research Group, CN = ISRG Root X1
i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
ただし、新しい Debian 12 サーバーでは、次のようになります。
# openssl version
OpenSSL 3.0.9 30 May 2023 (Library: OpenSSL 3.0.9 30 May 2023)
# openssl s_client -connect NEWHOST -tls1
CONNECTED(00000003)
140101680407744:error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error:../ssl/record/rec_layer_s3.c:1544:SSL alert number 80
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 136 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1695085443
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
TLS 1.2 は引き続き正常に動作しますが、TLS 1.0 および TLS 1.1 ではこの問題が発生します。
DEFAULT:@SECLEVEL=1
、および sec level 1、sec level 0、ALL、DEFAULT、LEGACY などの組み合わせを試してみましたが、ALL:@SECLEVEL=1
どれも機能しないようです。変更の合間に Apache とサーバー全体を定期的に再起動しています。
Apache 設定にこれを追加してみましたが、次のようになります。
Protocols h2 http/1.1
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ALL:@SECLEVEL=0
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets off
残念ながら、これ以上の洞察は得られなかったその他の関連する質問/回答:
いくつかの場所では、現在ではこれを機能させるには 1 から 0 に下げる必要があると示唆しているようですSECLEVEL
。たとえば、SHA1 証明書の場合、私はそれを実行しましたが、まだうまくいきません。
TLS 1.0および1.1のサポートはないOpenSSL 3 では削除されています (確認しました) ので、適切な構成であればサポートされるはずです。
文書化された解決策はすべて機能していないようで、一日中デバッグに費やしても解決に近づいていないようです。古い暗号を機能させるための他の解決策を見つけた人はいますか?ALL
暗号をレベル 0 と 1 の両方で指定していますが、私の言う通りには機能していないようです。これはかなり奇妙に思えます。
答え1
私はこれが起こり得ること、そしておそらく設定の不具合であることを知っていました... 実際、それが原因でした。
SECLEVEL を 0 に設定することは確かに必要ですが、複数の場所でこれを設定しており、すべてで更新していませんでした。
特に、特定の仮想ホストには がまだありましたがSSLCipherSuite ALL:@SECLEVEL=1
、これは古いバージョンの OpenSSL では問題なく動作していましたが、現在は にする必要がありますSSLCipherSuite ALL:@SECLEVEL=0
。
(私はこれを一般的な Apache 設定と /etc/ssl/openssl.cf に設定していましたが、これは仮想ホスト レベルで設定されていたため、それが上書きされていました。他のすべての仮想ホストはすでにレベル 0 になっていて、当然ながら 1 に上書きされた 1 つの仮想ホストを使用してテストしていただけです...)
繰り返しになりますが、TLS 1.0は最近のカーネル、Apache、OpenSSLではサポートされていないと言う人(この質問へのコメントなど)は、間違っているそして彼らは正しい構成。これはよくある誤解のようです。
現在、エンド クライアントはまだ接続されていません (TLS ハンドシェイクの失敗)。そのため、まだ何かが間違っていますが、openssl s_client
以前とは異なり、現在は適切にネゴシエートされているため、進歩しています。
の満杯解決策としては、certbot と acme.sh の両方がデフォルトで ECDSA を優先するようになったため、不足している暗号を取得するには RSA を明示的に要求する必要があることにも気付きました。証明書が同じタイプで更新されていたため、古いサーバーは正常に「動作」していました。
openssl.cnf
新しい稼働システムからの抜粋:
cat /etc/ssl/openssl.cnf | grep -v "#"
openssl_conf = openssl_init
[openssl_init]
providers = provider_sect
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
MinProtocol = TLSv1.0
CipherString = ALL@SECLEVEL=0