新しい Debian/OpenSSL では TLS 1.0 が機能しない

新しい Debian/OpenSSL では TLS 1.0 が機能しない

Debian 10 を実行しているサーバーを Debian 12 (および 6.x カーネル) を実行しているサーバーに移行していますが、動作していないと思われる最後の問題は TLS 1.0 です。これを解決しようとしています。

SECLEVELここで説明されているように、およびを変更することを認識していますMinProtocolhttps://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

関連情報