CentOS7を利用して外部連携用にApacheでHTTPサーバを立てた時にHTTPS通信が受けられない事態が発生した
前提条件
- CentOS7(CentOS Linux release 7.6.1810 (Core))
- Apache2(httpd-2.4.6-88)
- OpenSSL(openssl-1.0.2k-16)
発生した事象
外部連携先から正常にHTTP通信出来なかった。
アクセスログに何も表示されず、外部連携先ではエラー結果として下記のような文言が表示されたらしい
Remote host closed connection during handshake
以前からTLS1.0が利用されている事は認識していたので、プロトコル指定(SSLProtocol)でTLS1.0も許可しても結果は変わらず。
暗号化方式が一致しないのかと思い、暗号化方式(SSLCipherSuite)の設定を緩くしても結果は変わらず。
仕方が無いので、最後の手段でtcpdumpを利用したパケットキャプチャにて状況の把握を開始する。
結果としては、下記の結果につきるものだった。
SSLv2 Record Layer: Client Hello
えええ!!SSLv2ですか!!
とはいえ、ちょいと昔はTLSを利用していてもハンドシェイクは互換性のために
SSLv2の方式を許可する事が一般的だったらしいのですが、CentOS7に標準で導入されるOpenSSLではもう対応していないとのこと。
対応策
別途古いOpenSSLを導入
TLSで利用するモジュールをOpenSSLからNSSに変更したことで、SSLv2のハンドシェイクに対応できました。
以下はNSSの設定内容となります。
鍵をストアのようなところに格納してNSSNicknameとNSSCertificateDatabaseで指定するところ以外はOpenSSLの設定と同じようなものです。
※連携先とは接続元IPの制限をかけていて、一般に公開しているサービスではないのでで、全体的に脆弱な部分は目をつむる感じで。。。
Listen 14443
<VirtualHost *:14443>
DocumentRoot {DocumentRoot}
NSSPassPhraseDialog builtin
NSSPassPhraseHelper /usr/libexec/nss_pcache
NSSSessionCacheSize 10000
NSSSession3CacheTimeout 86400
NSSRenegotiation off
NSSRequireSafeNegotiation off
NSSEngine on
NSSCipherSuite +rsa_aes_256_sha
NSSProtocol TLSv1.0
NSSNickname {NSSNickname}
NSSCertificateDatabase /etc/httpd/alias
</VirtualHost>
最後に
今回、CentOS5からCentOS7にサーバのバージョンを上げた事で、今まで接続出来ていた通信が接続不能となりました。
新しくなることで接続不能になる可能性は想定していましたが、設定レベルでどうにか出来ると高を括っていました。
でも、yumでインストール可能な基本パッケージだけでどうにか出来てよかった。
その他
SSLv2を利用したハンドシェイクで正常に通信出来るかの検証のために、Java1.4を別途準備してHTTPS通信を実行した。
まさか、今更Java1.4を利用することが来るとは思わなかった。
古いものの検証には、古いものが必要なんですね。。。