RHEL9で古い暗号鍵、RSA/SHA1、SHA-1を使うとTLS接続ができない問題とその解決策
Red Hat Enterprise Linux 9 (RHEL9) では、セキュリティの向上を目的とした暗号化ポリシーの強化が行われています。この強化により、古い暗号鍵や非推奨のSHAハッシュアルゴリズム(特にRSA/SHA1、SHA-1)を使用している場合、TLS接続が失敗することがあります。本記事では、この問題の背景や原因、解決策を詳細に解説します。
RHEL9系から sshd OpenSSH で RSA/SHA1 が使えない
OpenSSH のセキュリティポリシーが変更、今後はRSA/SHA1 徐々に廃止していくそうです。
下記を定義すれば SHA1 を継続して使用することもできるらしいが、もちろん非推奨です。いずれ廃止なのでやめた方がいいです。推奨する方法は証明書の再発行などで適切な暗号化を利用してください。
PubkeyAcceptedAlgorithms=+ssh-rsa
一応やり方はこんな感じです。 ~/.ssh/config ※非推奨
PubkeyAcceptedAlgorithms +ssh-rsa
HostkeyAlgorithms +ssh-rsa
StrictHostKeyChecking no
1. TLS接続失敗の原因:RHEL9の暗号化ポリシー強化
RHEL9では、暗号化関連のシステム設定が「暗号ポリシーフレームワーク」という仕組みで統一的に管理されています。このフレームワークは、システム全体で使用される暗号アルゴリズムやTLSプロトコルの設定を制御し、デフォルトでは最新かつ安全なアルゴリズムのみを許可します。
1.1 暗号ポリシーの種類
RHEL9で利用可能な暗号ポリシーは以下の4種類です:
DEFAULT
: 推奨される安全な設定(デフォルト)。SHA-1やRSA 1024ビットなど古い暗号は無効。LEGACY
: 古い暗号化アルゴリズムも許可。互換性重視。FUTURE
: より強固なセキュリティ設定。SHA-1やTLS 1.2も非推奨。FIPS
: FIPS 140-2に準拠する高セキュリティモード。
デフォルトのDEFAULT
ポリシーでは、以下が制限されています:
- RSA鍵長が2048ビット未満の鍵は無効。
- SHA-1を使用した署名アルゴリズムは無効。
- TLS 1.0およびTLS 1.1プロトコルは無効。
2. TLS接続失敗の具体例
2.1 古い証明書の問題
TLS証明書がSHA-1で署名されている場合、RHEL9のシステムではその証明書を信頼できないため、TLSハンドシェイクが失敗します。
例:SHA-1証明書の確認
以下のコマンドで証明書の署名アルゴリズムを確認できます。
openssl x509 -in cert.pem -text -noout | grep "Signature Algorithm"
出力例:
Signature Algorithm: sha1WithRSAEncryption
この場合、証明書はSHA-1を使用しており、RHEL9では無効となります。
2.2 RSA鍵長の問題
RSA鍵の長さが1024ビットの場合も、RHEL9のデフォルト設定では不十分と判断され、TLS通信が失敗します。
例:RSA鍵長の確認
以下のコマンドでRSA鍵の長さを確認できます。
openssl rsa -in private_key.pem -text -noout | grep "Private-Key"
出力例:
Private-Key: (1024 bit)
この場合、鍵長が1024ビットのため、RHEL9では推奨されません。
3. 解決策
TLS接続失敗を解消するための解決策を以下に示します。推奨度の高い順に記載しています。
3.1 暗号鍵や証明書の更新(※推奨)
セキュリティを保ちながら問題を解決するには、古い暗号鍵や証明書を更新することが最善です。
更新方法:
- SHA-256以上を使用:
証明書署名にSHA-256以上を使用してください。現在、汎用的です。 - RSA鍵を2048ビット以上にする:
OpenSSLで新しいRSA鍵を生成する例:
openssl genrsa -out private_key.pem 2048
- 証明書を再発行:
更新した鍵を使って、認証局(CA)から新しい証明書を発行してください。
3.2 暗号ポリシーを「LEGACY」に変更(互換性重視)
古い暗号化アルゴリズムを一時的に許可する場合、暗号ポリシーをLEGACY
に設定します。ただし、セキュリティリスクが伴うため注意が必要です。これするとセキュリティレベルやや下げることになります。
設定手順:
update-crypto-policies --set LEGACY
設定後にシステムや該当するサービスを再起動します。
現在のポリシーを確認:
update-crypto-policies --show
3.3 アプリケーション固有の設定を変更
一部のアプリケーションでは、システムの暗号ポリシーに依存せず、独自に設定を調整できます。たとえば、OpenSSLやApache HTTP Serverの設定を変更することで問題を回避できます。
例:OpenSSLで古いアルゴリズムを許可
openssl.cnf
ファイルを編集し、古いアルゴリズムを許可します。
[system_default_sect]
MinProtocol = TLSv1.0
CipherString = DEFAULT:@SECLEVEL=1
4. 問題解決後の検証
TLS通信が正常に機能するか確認するため、以下のツールを使用してください。
4.1 OpenSSLでサーバとのTLS接続をテスト
openssl s_client -connect <サーバ>:443
このコマンドで、TLSハンドシェイクが成功するか確認します。
4.2 暗号化アルゴリズムの検証
接続時に使用される暗号化アルゴリズムを確認します。
openssl s_client -connect <サーバ>:443 | grep "Cipher"
5. まとめ
RHEL9でTLS接続が失敗する問題は、暗号鍵や署名アルゴリズムの古さが原因であることが多いです。最善策は、暗号鍵や証明書を更新し、最新のセキュリティ要件を満たすようにすることです。一時的な対応として暗号ポリシーをLEGACY
に変更することも可能ですが、長期的には推奨されません。
セキュリティと互換性のバランスを考慮し、適切な対策を講じましょう!