java - 为什么 Java 运行时在 SSL 信任存储的工作方式以及我们如何处理它方面存在如此大的差异?

标签 java ssl jvm truststore

我们碰巧运行一个公开 http://和 https://端点的 REST API Web 服务。 https://端点背后有一个 SSL 证书,需要时不时地更新一次。每当我们更新 SSL 证书时,运行与我们服务交互的 Java 程序的用户都会提示他的程序不再工作,并且他必须更改 Java 证书信任存储中的某些内容。我们的用户使用任何语言(PHP、C#、Ruby,等等)开发程序,当我们更改证书时,他们都不会提示,但有些 Java 用户每隔一段时间就会遇到问题。

Java 运行时在这方面有何特殊之处?我们应该怎样做才能提高用户体验?

最佳答案

We have users with programs developed in anything - PHP, C#, Ruby, whatever else - and none of them ever complain when we change the certificate yet some Java users have problems every other time.

  • PHP:直到最近,PHP 默认情况下根本不验证证书。这只是 changed with PHP 5.6 。如果它验证它使用 UNIX 上的系统 CA 存储,该存储通常具有所需的 CA。因此,您的 PHP 客户端可能只是不验证证书,因此不会出现问题。
  • C# - 使用系统 CA 存储,通常包含所需的 CA
  • Ruby:使用系统 CA 存储
  • Perl:要么根本不验证,要么使用系统 CA 存储,要么使用来自 mozilla 的 CA 存储,具体取决于模块的版本以及您使用的发行版。

Java 带有自己的 CA 存储,其中包含的 CA 数量远少于系统通常附带的 CA。而且还取决于Java版本。因此,客户端使用的 Java 版本可能无法识别您使用的根 CA。此外,较旧的 Java 版本不支持 SNI。而且它们存在 DH key 较弱的问题,不支持 RSA 等更大的 key 。由于存在许多旧的且不受支持的 Java 安装,请选择影响您的应用程序的问题。

关于java - 为什么 Java 运行时在 SSL 信任存储的工作方式以及我们如何处理它方面存在如此大的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32372567/

相关文章:

java.lang.NullPointerException : println needs a message android database error

security - 重用 session 时更改 SSL 协议(protocol)版本

docker - 如何使安全的 nginx-proxy 指向单个服务器中的不同路径?

jvm - BLOCKED 线程会导致高 CPU 消耗吗

java - 依赖冲突并且找不到 jar 来解决该问题

java - 在 spring-data-elasticsearch 中使用 ElasticsearchTemplate 获取 id 的计数和列表

ssl - haproxy 无法使用 ssl 选项绑定(bind)套接字

java - VIsualVM 从列表中丢失本地 Java 进程

c++ - 如何在 Java native 代理出错时获取 *native* 堆栈跟踪?

java - 无法为正确的数学结果制定代码