更新:(接受答案并在底部使用有用的链接更新了问题)
使用
-
Java 7
- Jetty 服务器(嵌入式)
- 服务器上安装的自签名证书。
使用命令生成:
keytool -genkey -keyalg RSA -sigalg SHA256withRSA -alias selfsigned -keystore mykeystore.jks -validity 360 -keysize 2048
- Chrome 浏览器作为客户端
当我查看其详细信息时,证书显示了这一点:
Certificate fingerprints: MD5: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX SHA1: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX SHA256: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Signature algorithm name: SHA256withRSA Version: 3
我还在 jetty 方面做了以下操作,以确保排除一些不良的 CipherSuites 并避免 SSLV3 协议(protocol)(因为 chrome 由于最近的 POODLE 攻击而逐步淘汰了 SSLV3):
sslContextFactory.setIncludeCipherSuites(new String[] {
"TLS_DHE_RSA.*", "TLS_ECDHE.*", });
sslContextFactory.setExcludeCipherSuites(new String[] { ".*NULL.*",
".*RC4.*", ".*MD5.*", ".*DES.*", ".*DSS.*" });
sslContextFactory.setExcludeProtocols(new String[] { "SSLv3" });
sslContextFactory.setRenegotiationAllowed(false);
我在这里缺少什么?
应该采取什么措施来确保 Chrome 不会提示过时的加密技术?
我已经深入研究了 chromium 代码库来看到这个?但我还无法弄清楚原因。
Chrome 在设置过时的加密消息之前检查以下内容。
if (net::SSLConnectionStatusToVersion(ssl.connection_status) >=
net::SSL_CONNECTION_VERSION_TLS1_2 &&
net::IsSecureTLSCipherSuite(
net::SSLConnectionStatusToCipherSuite(ssl.connection_status))) {
site_connection_details_.assign(l10n_util::GetStringFUTF16(
IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_CONNECTION_TEXT,
subject_name));
} else {
site_connection_details_.assign(l10n_util::GetStringFUTF16(
IDS_PAGE_INFO_SECURITY_TAB_WEAK_ENCRYPTION_CONNECTION_TEXT,
subject_name));
}
bool IsSecureTLSCipherSuite(uint16 cipher_suite) {
int key_exchange, cipher, mac;
if (!GetCipherProperties(cipher_suite, &key_exchange, &cipher, &mac))
return false;
// Only allow forward secure key exchanges.
switch (key_exchange) {
case 10: // DHE_RSA
case 14: // ECDHE_ECDSA
case 16: // ECDHE_RSA
break;
default:
return false;
}
switch (cipher) {
case 13: // AES_128_GCM
case 14: // AES_256_GCM
case 17: // CHACHA20_POLY1305
break;
default:
return false;
}
// Only AEADs allowed.
if (mac != kAEADMACValue)
return false;
return true;
}
有用的链接
- https://security.stackexchange.com/questions/42161/configuring-gcm-cipher-suites-in-jetty-based-server
- https://stackoverflow.com/a/21290409/1103377
- https://www.chromium.org/Home/chromium-security/education/tls#TOC-Deprecation-of-TLS-Features-Algorithms-in-Chrome
- https://code.google.com/p/chromium/codesearch#chromium/src/chrome/app/generated_resources.grd&q=IDS_PAGE_INFO_SECURITY_TAB_WEAK_ENCRYPTION_CONNECTION_TEXT&sq=package:chromium&type=cs&l=9563
最佳答案
正如您在代码中指出的那样,玩具需要使用 AES_128_GCM、AES_256_GCM 或 CHACHA20_POLY1305 作为密码才能被认为是现代密码学。这与证书无关,而是与服务器配置有关。
Chrome实际上还不支持AES_256_GCM,而java还不支持CHACHA20_POLY1305。即使 AES_128_GCM 仅在 java 8 中受支持。如果您不使用 java 8,则默认情况下不包含“现代”加密技术。如果您使用的是 java 8,jetty 文档说明了如何配置密码套件。
如果您没有 java 8,似乎您可以使用 Bouncy CaSTLe,将其设置为提供程序 ( http://www.bouncycastle.org/wiki/display/JA1/Provider+Installation ) 以使用 GCM 启用密码套件。不过我自己还没有测试过。
关于java - 如何在 Chrome 证书详细信息中阻止此消息 - "Your connection to example.com is encrypted with obsolete cryptography."?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29587309/