1 回答

TA貢獻1839條經驗 獲得超15個贊
仔細查看您的服務器端 SslContextFactory 使用情況,并著眼于您實際使用的內容(剝離以僅顯示 SslContextFactory 使用情況)
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStoreResource(Resource.newResource(urlKeyStore));
sslContextFactory.setKeyStorePassword(credential);
sslContextFactory.setExcludeCipherSuites(
"SSL_RSA_WITH_DES_CBC_SHA",
"SSL_DHE_RSA_WITH_DES_CBC_SHA",
"SSL_DHE_DSS_WITH_DES_CBC_SHA",
"SSL_RSA_EXPORT_WITH_RC4_40_MD5",
"SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
"SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
"SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA");
sslContextFactory.setExcludeProtocols("");
有幾件事很突出。
首先,既然你是服務端,那你就應該使用服務端版本...
SslContextFactory sslContextFactory = new SslContextFactory.Server();
接下來,您的使用.setExcludedCipherSuites()不完整并引入了漏洞。
刪除(或注釋掉)整行。
使用 SslContextFactory 為您提供的默認值。
通過該行,可以為 TLS/SSL 使用無證書和無加密配置。
另外,你的使用setExcludedProtocols("")不好。它正在設置要排除的單個空白協議。這很糟糕,因為您將自己暴露于各種 SSL 漏洞(更不用說 TLS 漏洞了)
也刪除(或注釋掉)整行。
使用 SslContextFactory 為您提供的默認值。
通過該行,可以為 TLS/SSL 使用無協議(這意味著無加密)配置。
上述 2 個配置會產生大量警告日志,您應該努力擁有一個沒有警告的配置。
對于上述兩個問題,您可能會從連接中使用的密碼套件的名稱中了解到一些信息。
String cipherSuiteName =
(String) HttpServletRequest.getAttribute("javax.servlet.request.cipher_suite");
您甚至可以獲得javax.net.ssl.SSLSession連接中使用的。
SslSession sslSession =
(SslSession) HttpServletRequest.getAttribute(
"org.eclipse.jetty.servlet.request.ssl_session");
System.out.println("protocol is " + sslSession.getProtocol());
System.out.println("cipher suite is " + sslSession.getCipherSuite());
System.out.println("peer certs is " + sslSession.getPeerCertificates());
最后,您的代碼沒有任何跡象表明您甚至想要來自該配置的客戶端證書。
你是否忘記了其中一個...
sslContextFactory.setNeedClientAuth(true);
sslContextFactory.setWantClientAuth(true);
還是您真的不需要客戶證書?
添加回答
舉報