https://weakdh.org 上的 Tomcat 解決方案有拼寫錯誤?
為https://weakdh.org/sysadmin.html上的 Tomcat 修復列出的非 GCM 密碼是否有拼寫錯誤?
在“Apache Tomcat”標題下和文本“在 server.xml 文件(用於 JSSE)”下,有以下連接器密碼配置。
我的問題與底部 14 個密碼有關(名稱中沒有 GCM 的密碼)
(為了可讀性添加了新行)
<Connector ciphers="[GCM Ciphers], TLS_ECDHE_RSA_WITH_AES_128_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_SHA256, TLS_ECDHE_RSA_WITH_AES_128_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_SHA, TLS_ECDHE_RSA_WITH_AES_256_SHA384, TLS_ECDHE_ECDSA_WITH_AES_256_SHA384, TLS_ECDHE_RSA_WITH_AES_256_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_SHA, TLS_DHE_RSA_WITH_AES_128_SHA256, TLS_DHE_RSA_WITH_AES_128_SHA, TLS_DHE_DSS_WITH_AES_128_SHA256, TLS_DHE_RSA_WITH_AES_256_SHA256, TLS_DHE_DSS_WITH_AES_256_SHA, TLS_DHE_RSA_WITH_AES_256_SHA " />
應該是這些 CBC 密碼嗎?
<Connector ciphers="[GCM Ciphers], TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA " />
似乎他們在名稱中缺少 CBC_。
範例:
TLS_DHE_RSA_WITH_AES_256_SHA 應該是TLS_DHE_RSA_WITH_AES_256_CBC_SHA。根據https://www.openssl.org/docs/apps/ciphers.html,後者存在而前者不存在。
如果您查看weakdh.org站點上的其他修復程序,您會看到其他產品使用不同的密碼命名約定。使用 OpenSSL 密碼列表,您可以將這些名稱映射到 Tomcat 使用的名稱,並找出它們映射到 CBC 密碼。
我嘗試使用在我的 server.xml 中發布的weakdh.org中的密碼,但它沒有效果。即使一個密碼拼寫錯誤或不是合法的密碼名稱,Tomcat 也會忽略這些密碼,並且 Tomcat 會退回到使用 JVM 的預設密碼。將 CBC_ 添加到密碼名稱後,Tomcat 開始使用連接器密碼屬性中列出的密碼。
weakdh.org 解決方案是否有錯別字,還是我遺漏了什麼?
來自weakdh.org 的密碼似乎對您的系統無效,所以,是的,它正在回退到預設值。weakdh.org 上列出的那些可能適用於他們測試過的其他系統,或者它們可能完全是錯誤的,我不能完全確定,但我知道的是它們不在列表中,所以它們可能在任何地方都無效。
要從http://markmail.org/message/zn4namfhypyxum23獲取系統的有效密碼套件列表:
來自:克里斯托弗·舒爾茨 (chr...@christopherschultz.net)
全部,
接下來,下面的程式碼可用於獲取目前可用的 SSL 密碼,並將顯示它們是否在您的特定 JVM 中啟用。請注意,這些都不是 Tomcat 特定的:
import java.util.Iterator; import java.util.Map; import java.util.TreeMap; import javax.net.ssl.SSLServerSocketFactory; public class SSLInfo { public static void main(String[] args) throws Exception { SSLServerSocketFactory ssf = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault(); String[] defaultCiphers = ssf.getDefaultCipherSuites(); String[] availableCiphers = ssf.getSupportedCipherSuites(); TreeMap ciphers = new TreeMap(); for(int i=0; i<availableCiphers.length; ++i ) ciphers.put(availableCiphers[i], Boolean.FALSE); for(int i=0; i<defaultCiphers.length; ++i ) ciphers.put(defaultCiphers[i], Boolean.TRUE); System.out.println("Default\tCipher"); for(Iterator i = ciphers.entrySet().iterator(); i.hasNext(); ) { Map.Entry cipher=(Map.Entry)i.next(); if(Boolean.TRUE.equals(cipher.getValue())) System.out.print('*'); else System.out.print(' '); System.out.print('\t'); System.out.println(cipher.getKey()); } } }
編譯上述程式碼並從命令行執行
java SSLInfo
以獲取系統的有效密碼字元串列表。