這裡介紹如何停用各種 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 伺服器加密協定版本

要檢查 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 檢測

使用 nmapssl-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

關閉 SSLv2 與 SSLv3 加密協定

以下整理各種 HTTPS 網頁伺服器關閉 SSLv2 與 SSLv3 的設定方式。

Apache 伺服器

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

Nginx 伺服器

Step 1
在 Nginx 的設定檔中加入 ssl_protocols 的設定:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Step 2
重新啟動 Nginx 伺服器:

sudo service nginx restart

Lighttpd 伺服器

Step 1
在 Lighttpd 的設定檔中加入以下設定:

ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"

Step 2
重新啟動 Lighttpd 伺服器:

sudo service lighttpd restart

Tomcat 伺服器

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

IIS 伺服器

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.imStackExchange行政院國家資通安全會報Disable SSLv3KINAMOStackOverflowredhat