Debian SSL证书错误:cannot verify xxx certificate / javax.net.ssl



我有一个奇怪的问题(这是100%的服务器配置问题),例如我想从Dropbox下载一些东西:

解决dl.dropboxusercontent.com…23.23.160.146 50.17.227.107,54.221.248.69,……连接到dl.dropboxusercontent.com|23.23.160.146|:443…连接。错误:无法验证dl.dropboxusercontent.com的证书,由"/C=US/ST=CA/O=SonicWALL Inc./CN=SonicWALL Firewall DPI-SSL ":
遇到自签名证书。连接到如果不安全,请使用'——no-check-certificate '。

是的,我知道我可以使用-non-check-certificate,但是当我想在Java应用程序中使用SSL连接时,我有这样的东西:

javax.net.ssl.SSLHandshakeException:sun.security.validator. validatoreexception: PKIX路径构建失败sun.security.provider.certpath.SunCertPathBuilderException:无法查找到请求目标的有效认证路径

这个应用程序在其他服务器或本地机器上工作得很好,有什么想法是错的吗?

/C=US/ST=CA/O=SonicWALL Inc./CN=SonicWALL Firewall DPI-SSL

您的流量被深度包检测防火墙明显截获,该防火墙充当MITM代理来监视您的流量。

通常可以认为是"合法的"MITM攻击者。(然而,这可能是合法的,取决于一些法律和道德方面。)您的本地网络管理员应该能够告诉您一些相关信息。如果这是公司网络的一部分,则该公司正在监视您的流量,包括HTTPS连接的内容(因此它不再是端到端安全的)。如果防火墙正常工作,它应该仍然保护从防火墙到服务器的连接(可能很难知道它是否正确检查证书)

一般来说,这样的防火墙或代理充当自己的证书颁发机构,有效地按照请求伪造每个证书。

公司网络上的大多数客户端会信任它颁发的证书(就像您面对的那个),因为系统管理员也会将CA证书作为受信任的证书安装到该网络中的每台机器中。您可能有操作系统信任的根证书。

但是,网络管理员很可能没有将此CA证书安装到JRE安装中(默认情况下,JRE使用自己的一组信任锚)。

尝试从参考机器导出该CA证书(请参阅上面的名称)并将其导入您正在使用的信任库(JRE的默认信任库:cacerts或您构建并通过javax.net.trustStore属性传递给应用程序的新信任库)。

通常,您可以使用如下内容(假设您已将防火墙的CA导出为" firewallca.pem "):

keytool -import -file firewallca.pem -alias firewallca -keystore truststore.jks

如果truststore.jks文件不存在,将创建它。否则,您可以在JRE的lib/security目录中获取cacerts文件的副本。您也可以直接在cacerts文件上执行此操作(使用-keystore /path/to/truststore.jks,前提是您有对它的写访问权限)。

如果您选择不在默认信任存储库(即cacerts文件)上这样做,而是使用本地信任存储库(如truststore.jks),那么您可以在运行应用程序时使用此系统属性来使用它:-Djavax.net.trustStore=/path/to/truststore.jks

有关配置信任库的其他方法,请查看此答案。


解决这个问题的另一种方法是告诉Java使用操作系统的信任库。我假设你在这里使用的是Windows。使用这些系统属性应该可以工作:

-Djavax.net.trustStore=NONE -Djavax.net.trustStoreType=WINDOWS-ROOT

(如果这不起作用,请尝试使用WINDOWS-MY代替WINDOWS-ROOT)

WINDOWS-MY/WINDOWS-ROOT有一点错误,因为它会丢失Windows存储中的一些证书:它使用证书"友好名称"(非唯一)作为密钥库别名(唯一),因此具有给定友好名称的证书将隐藏具有相同名称的其他证书。(这有效地减少了不幸受信任的CA证书的数量。)

由于您所处的环境假定所有流量都要通过您的DPI防火墙,因此您可能最多只需要使用一个CA证书。只要它不与任何其他证书共享其在Windows列表中的"友好名称",您就应该没问题。

您需要在客户机的Java密钥存储库中添加服务器的SSL证书。看看这篇文章:

解决javax.net.ssl.SSLHandshakeException: sun.security.validator. validatoreexception: PKIX路径构建失败错误?

提示:这是因为您的客户机的JVM不"信任"服务器的SSL证书,所以您需要在您的密钥库中添加证书。

相关内容

最新更新