這裡介紹如何停用各種 HTTPS 網頁伺服器的 SSLv2 與 SSLv3 加密協定。
由於 SSLv2 存在 DROWN(Decrypting RSA with Obsolete and Weakened eNcryption,CVE-2016-0800)安全性漏洞,而 SSLv3 也有 POODLE(Padding Oracle On Downgraded Legacy Encryption,CVE-2014-3566)的漏洞,所以目前若要架設 HTTPS 安全加密的網頁伺服器,最好把 SSLv2 與 SSLv3 都停用。
要檢查 HTTPS 伺服器加密協定版本,可以使用 openssl
或是 nmap
指令。
openssl
檢測使用 openssl
測試網頁伺服器是否支援 SSLv2 加密協定:
openssl s_client -connect blog.gtwang.org:443 -ssl2
如果伺服器有關閉 SSLv2 加密協定的話,就會出現類似這樣的錯誤訊息:
CONNECTED(00000003) 140062201157536:error:1407F0E5:SSL routines:SSL2_WRITE:ssl handshake failure:s2_pkt.c:429: [略]
或是
CONNECTED(00000003) write:errno=104
這樣就代表伺服器有關閉不安全的 SSLv2 協定。
測試伺服器是否支援 SSLv3 加密協定:
openssl s_client -connect blog.gtwang.org:443 -ssl3
若伺服器有關閉 SSLv3 協定的話,錯誤訊息會類似這樣:
CONNECTED(00000003) 140010726107040:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1275:SSL alert number 40 140010726107040:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:598: [略]
nmap
檢測使用 nmap
的 ssl-enum-ciphers
指令稿也可以列出網頁伺服器支援的加密協定版本,它的輸出訊息會比 openssl
更好閱讀,也更詳細:
nmap --script ssl-enum-ciphers -p 443 blog.gtwang.org
Starting Nmap 6.40 ( http://nmap.org ) at 2017-04-28 09:18 CST Nmap scan report for blog.gtwang.org (45.118.135.69) Host is up (0.056s latency). rDNS record for 45.118.135.69: li1442-69.members.linode.com PORT STATE SERVICE 443/tcp open https | ssl-enum-ciphers: | SSLv3: No supported ciphers found | TLSv1.0: | ciphers: | TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_RSA_WITH_AES_128_CBC_SHA - strong | TLS_RSA_WITH_AES_256_CBC_SHA - strong | compressors: | NULL | TLSv1.1: | ciphers: | TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_RSA_WITH_AES_128_CBC_SHA - strong | TLS_RSA_WITH_AES_256_CBC_SHA - strong | compressors: | NULL | TLSv1.2: | ciphers: | TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 - strong | TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 - strong | TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 - strong | TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 - strong | TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - strong | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - strong | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - strong | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - strong | TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_RSA_WITH_AES_128_CBC_SHA - strong | TLS_RSA_WITH_AES_128_CBC_SHA256 - strong | TLS_RSA_WITH_AES_128_GCM_SHA256 - strong | TLS_RSA_WITH_AES_256_CBC_SHA - strong | TLS_RSA_WITH_AES_256_CBC_SHA256 - strong | TLS_RSA_WITH_AES_256_GCM_SHA384 - strong | compressors: | NULL |_ least strength: strong Nmap done: 1 IP address (1 host up) scanned in 4.20 seconds
如果不指定連接埠,nmap
就會把所有的連接埠都掃一遍:
nmap --script ssl-enum-ciphers blog.gtwang.org
以下整理各種 HTTPS 網頁伺服器關閉 SSLv2 與 SSLv3 的設定方式。
Step 1
找出所有牽涉到 SSL 加密的 Apache 設定檔。
grep -r SSLEngine /etc/httpd/*
Step 2
修改每個牽涉到 SSL 加密的 Apache 設定檔,在 SSLProtocol
的設定中加入 -SSLv2
與 -SSLv3
:
SSLProtocol all -SSLv2 -SSLv3
Step 3
重新啟動 Apache 伺服器。CentOS Linux 可執行:
sudo service httpd restart
Ubuntu Linux 則執行:
sudo service apache2 restart
Step 1
在 Nginx 的設定檔中加入 ssl_protocols
的設定:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Step 2
重新啟動 Nginx 伺服器:
sudo service nginx restart
Step 1
在 Lighttpd 的設定檔中加入以下設定:
ssl.use-sslv2 = "disable" ssl.use-sslv3 = "disable"
Step 2
重新啟動 Lighttpd 伺服器:
sudo service lighttpd restart
Step 1
修改 server.xml
設定檔,加入 sslEnabledProtocols
指定 SSL 版本:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslEnabledProtocols = "TLSv1,TLSv1.1,TLSv1.2" />
Step 2
重新啟動 Tomcat 伺服器:
sudo /tomcat_path/bin/shutdown.sh sudo /tomcat_path/bin/startup.sh
Step 1
建立一個 disable_ssl3.reg
檔:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server] "Enabled"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server] "Enabled"=dword:00000000
Step 2
用滑鼠點兩下 disable_ssl3.reg
檔,執行之。
參考資料:aip.im、StackExchange、行政院國家資通安全會報、Disable SSLv3、KINAMO、StackOverflow、redhat