我们碰巧运行一个公开 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/