Java 如何防止此消息-“;您与example.com的连接是使用过时的加密技术加密的。”在chrome证书详细信息中?

Java 如何防止此消息-“;您与example.com的连接是使用过时的加密技术加密的。”在chrome证书详细信息中?,java,google-chrome,ssl-certificate,embedded-jetty,Java,Google Chrome,Ssl Certificate,Embedded Jetty,更新:(接受了答案并在底部用有用的链接更新了问题) 使用 爪哇7 Jetty服务器(嵌入式) 服务器上安装的自签名证书。 使用以下命令生成: keytool-genkey-keyalg RSA-sigalg SHA256withRSA-alias selfsigned-keystore mykeystore.jks-validity 360-keysize 2048 Chrome浏览器作为客户端 当我查看证书的详细信息时,证书会显示: 证书指纹: MD5:XXXXXXXXXXXXX

更新(接受了答案并在底部用有用的链接更新了问题)

使用

  • 爪哇7
    • Jetty服务器(嵌入式)
    • 服务器上安装的自签名证书。 使用以下命令生成: keytool-genkey-keyalg RSA-sigalg SHA256withRSA-alias selfsigned-keystore mykeystore.jks-validity 360-keysize 2048

    • Chrome浏览器作为客户端

当我查看证书的详细信息时,证书会显示:

证书指纹:
MD5:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
SHA1:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
签名算法名称:SHA256withRSA
版本:3

我在jetty方面也做了以下工作,以确保排除一些不好的密码套件并避免SSLV3协议(因为最近的贵宾犬攻击导致chrome逐步淘汰了SSLV3):

sslContextFactory.setIncludeCipherSuites(新字符串[]){
“TLS_DHE_RSA.*”、“TLS_ECDHE.*”、});
sslContextFactory.SetExcludeCipherSuite(新字符串[]{“.*NULL.*”,
“*RC4.*”、“*MD5.*”、“*DES.*”、“*DSS.*”});
setExcludeProtocols(新字符串[]{“SSLv3”});
sslContextFactory.setRenegotiationAllowed(false);
我错过了什么?

应该做些什么来确保chrome不会抱怨过时的密码?

我已经深入到chromium代码库中查看了这个?但我还不知道原因

Chrome在设置过时的加密消息之前检查以下内容



有用的链接

正如您在代码中指出的,toy需要使用AES_128_GCM、AES_256_GCM或CHACHA20_POLY1305作为密码,才能将密码术视为现代密码术。这与证书无关,但与服务器配置有关

Chrome实际上还不支持AES_256_GCM,java也不支持CHACHA20_POLY1305。甚至AES_128_GCM也仅在Java8中受支持。如果您没有使用Java8,默认情况下不包括“现代”加密。如果您使用的是Java8,jetty文档将解释如何配置密码套件


如果您没有Java8,那么您似乎可以使用BouncyCastle,它被设置为一个提供程序()来使用GCM启用密码套件。不过,我自己还没有测试过。

,-Chromium CodebaseUpdate:也用4096大小的键进行了测试。chrome还是这么说的。它是
SHA1
。您应该使用
SHA256
进行消息身份验证。@BoristheSpider:知道我如何避免这种情况吗-带RSA的sigalg SHA256。。。这是我在keytool命令中使用的。。。。我是否应该明确排除Jetty SSL配置中具有SHA1的所有密码套件?是什么决定了哪个algo用于消息验证?是的。我已经使用256位键很长时间了。谢谢你的回答。因此,您的意思是,如果我们使用Java 7,“可能”不可能解决这个问题,因为Java中的加密技术支持不支持现代加密技术(在chrome浏览器中)。。。又称作具有身份验证和256位密钥支持的密码(如果我不正确,请更正我)。。。。[全部]:该领域的其他专家以及那些尝试在JAVA 7和JETTY SERVER上设置SSL的人能否证实这一点?@acthota经过一些搜索,Bouncy Castle似乎为较旧的JAVA版本提供了支持。我已经相应地编辑了我的答案。@All:[接受评论]:chrome官方链接上说:您可能看到这样一条消息:“您到example.com的连接使用了过时的加密技术。”这通常意味着到当前网站的连接使用了过时的密码套件。[续][续]此链接()中的CipherSuite部分还清楚地显示Java 7中不支持GCM CipherSuite。这个答案()似乎也提出了同样的建议。如果你认为这会使答案更全面,请在你的答案中加入我的评论/链接。接受你的回答。谢谢你抽出时间。(由于我没有足够的声誉,无法对您的答案进行投票:()
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;
}