TLS / SSL密碼強化的建議
傳輸層安全性(TLS)及其前身安全套接字層(SSL)是廣泛使用的協議,旨在通過身份驗證,加密和完整性來保護客戶端和服務器之間的數據傳輸安全。
與常見假設相反,TLS / SSL不僅是網站和Web應用程序中廣泛使用的技術(使用HTTP協議),而且TLS / SSL也被其他一些服務和協議廣泛使用,包括但不限於電子郵件服務器( SMTP,POP和IMAP協議),FTP服務器,聊天服務器(XMPP協議),虛擬專用網絡(TLS / SSL VPN),網絡設備。
為了保護正在傳輸的數據,TLS / SSL使用一個或多個密碼套件。密碼套件是認證,加密和消息認證碼(MAC)算法的組合。所有這些都在協商TLS / SSL連接的安全設置以及數據的安全傳輸時使用。
以下一些是密碼套件可以使用的算法的示例。
功能 | 算法 |
---|---|
密鑰交換 | RSA,Diffie-Hellman,ECDH,SRP,PSK |
認證 | RSA,DSA,ECDSA |
批量密碼 | RC4,3DES,AES |
消息驗證 | HMAC-SHA256,HMAC-SHA1,HMAC-MD5 |
除了在若干監管標准中的要求之外,主要瀏覽器在沒有TLS的情況下將站點標記為“不安全”,它也可能被視為服務網站和Web應用程序的要求。然而,獲得正確的TLS實施可能會比預期的要簡單一些。最糟糕的是,糟糕的TLS配置可能會提供虛假的安全感,同時使網站和Web應用程序容易受到一系列攻擊。
許多常見的TLS配置錯誤在於密碼套件選擇不當。舊的或過時的密碼套件,尤其是那些遭受各種攻擊的密碼套件,可能允許攻擊者在傳輸過程中成功攔截或篡改秘密數據。以下是要對TLS / SSL實施進行的推薦配置列表。
禁用SSL 2.0和SSL 3.0
SSL 2.0是1995年第一個公開發布的SSL版本。此版本的SSL包含許多導致SSL 3.0引入的安全問題。SSL 3.0於1996年發布,完全重新設計了協議。
由於SSL2.0中出現的問題,協議使用起來不安全,應該完全禁用。
由於POODLE(Padding Oracle On Downgraded Legacy.Encryption)漏洞,SSL 3.0使用起來也不安全,應該被禁用以避免攻擊者檢索到安全連接的明文。此外,Elliptic Curve Cryptography(本文稍后將討論)不能與SSL3.0一起使用。
Internet Explorer 6是唯一仍然使用SSL3.0的瀏覽器。因此,除非仍然需要支持舊版Internet Explorer 6瀏覽器,否則應禁用SSL 3.0,如稍后所述。
禁用TLS 1.0和1.1
除非需要支持舊版瀏覽器,否則還應禁用TLS 1.0和1.1。PCI DSS規定自2018年6月30日起不再使用TLS 1.0,並強烈建議禁用TLS 1.1; 因為這些協議可能會受到FREAK,POODLE,BEAST和CRIME等漏洞的影響。
除非需要支持舊版瀏覽器,否則還應禁用TLS 1.0和1.1。PCI DSS規定自2018年6月30日起不再使用TLS 1.0,並強烈建議禁用TLS。如果仍然支持TLS 1.0是業務需求,強烈建議禁用TLS 1.0壓縮以避免CRIME攻擊。
此外,禁用弱密碼也很重要。應禁用DES和RC4等弱密碼。DES可以在幾個小時內被破壞,而RC4被發現比以前想象的要弱。雖然可能已經建議過去使用RC4來緩解BEAST攻擊,但鑒於對RC4密碼的最新攻擊,微軟再次發布了一個建議。還值得注意的是,PCI DSS也禁止使用RC4批量密碼。
禁用TLS 1.0和1.1可能會影響以下用戶代理(及其舊版本)(不同操作系統上的特定用戶代理版本可能會有所不同)。
- Android 4.3
- Chrome 29
- Firefox 26
- Internet Explorer 10
- Java 6u45,7u25
- OpenSSL 0.9.8y
- Safari 6.0
組態
根據您的業務用例(例如,需要支持舊版瀏覽器和法規要求),您可能需要選擇稍微不同的密碼套件配置。的Mozilla的SSL配置生成器可以用於獲得根據您的要求使用不同的瀏覽器“配置文件”(現代,中間和舊配置文件)的最佳TLS配置。
以下是現代配置文件的細分(最老的兼容客戶端:Firefox 27,Chrome 30,Windows 7上的Internet Explorer 11,Edge,Opera 17,Safari 9,Android 5.0和Java 8)
根據所討論的Web服務器(例如Apache HTTP Server,Nginx ...),啟用/禁用TLS協議和支持的TLS密碼套件的語法會略有不同。
Nginx的
# Enable TLSv1.2, disable SSLv3.0, TLSv1.0 and TLSv1.1
ssl_protocols TLSv1.2;
# Enable modern TLS cipher suites
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
# The order of cipher suites matters
ssl_prefer_server_ciphers on;
Apache HTTP Server
# Enable TLSv1.2, disable SSLv3.0, TLSv1.0 and TLSv1.1
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
# Enable modern TLS cipher suites
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
# The order of cipher suites matters
SSLHonorCipherOrder on
# Disable TLS compression
SSLCompression off
# Necessary for Perfect Forward Secrecy (PFS)
SSLSessionTickets off
下表將上面的密碼套件字符串分解為優先順序(最佳密鑰交換算法/最強加密優先)。
訂購 | 密鑰交換算法 | 認證算法 | 批量加密算法 | Mac算法 |
---|---|---|---|---|
#1 | 橢圓曲線Diffie-Hellman(ECDH) | 橢圓曲線數字簽名算法(ECDSA) | Galois計數器模式下的AES 256(AES256-GCM) | SHA384 |
#2 | 橢圓曲線Diffie-Hellman(ECDH) | RSA | Galois計數器模式下的AES 256(AES256-GCM) | SHA384 |
#3 | 橢圓曲線Diffie-Hellman(ECDH) | 橢圓曲線數字簽名算法(ECDSA) | ChaCha20(CHACHA20) | POLY1305 |
#4 | 橢圓曲線Diffie-Hellman(ECDH) | RSA | ChaCha20(CHACHA20) | POLY1305 |
#5 | 橢圓曲線Diffie-Hellman(ECDH) | 橢圓曲線數字簽名算法(ECDSA) | Galois計數器模式下的AES 128(AES128-GCM) | SHA256 |
#6 | 橢圓曲線Diffie-Hellman(ECDH) | RSA | Galois計數器模式下的AES 128(AES128-GCM) | SHA256 |
#7 | 橢圓曲線Diffie-Hellman(ECDH) | 橢圓曲線數字簽名算法(ECDSA) | AES 256(AES256) | SHA384 |
#8 | 橢圓曲線Diffie-Hellman(ECDH) | RSA | AES 256(AES256) | SHA384 |
#9 | 橢圓曲線Diffie-Hellman(ECDH) | 橢圓曲線數字簽名算法(ECDSA) | AES 128(AES128) | SHA256 |
#10 | 橢圓曲線Diffie-Hellman(ECDH) | RSA | AES 128(AES128) | SHA256 |
該字符串在現代瀏覽器和TLS / SSL客戶端中提供最強的加密(Galois計數器模式中的AES僅在TLS 1.2中受支持)。此外,如果服務器和TLS / SSL客戶端都支持它,則字符串還提供Perfect Forward Secrecy(SSLSessionTicket
必須設置s才能off
在Apache HTTP Server中使用)。