java - 如何在 Chrome 证书详细信息中阻止此消息 - "Your connection to example.com is encrypted with obsolete cryptography."?

标签 java google-chrome ssl-certificate embedded-jetty

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

使用

    Java 7
    • Jetty 服务器(嵌入式)
    • 服务器上安装的自签名证书。 使用命令生成:

      keytool -genkey -keyalg RSA -sigalg SHA256withRSA -alias selfsigned -keystore mykeystore.jks -validity 360 -keysize 2048

    • Chrome 浏览器作为客户端

enter image description here

当我查看其详细信息时,证书显示了这一点:

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;
}

有用的链接

最佳答案

正如您在代码中指出的那样,玩具需要使用 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/

相关文章:

asp.net - 如何在 Windows 和 .NET 上运行的 AWS ElasticBeanstalk 上自动安装 SSL 证书?

java - 从 ByteArrayOutputStream 修剪填充

java - 我无法使用按键绑定(bind)移动我的 JLabel?

java - Java移位运算符0十六进制数

javascript - console.dir 和 console.log 有什么区别?

javascript - TwentyTwenty 隐藏后点击显示没有高度

javascript - 在 Chrome 扩展中从 JavaScript 调用网站 API 时出现跨域错误

SSL 中间 SHA2

java - 在 Spring Data JPA 中连接两个表并从存储库查询两个表数据

ios - 令人困惑的 SSL 证书错误 - 是否允许端口号?