带有SHA-2签名证书的SunCertPathBuilderException

时间:2014-01-15 02:10:19

标签: java security ssl

我最近获得了一个新网站的证书,并按照建议使用SHA-2签名算法生成。在我尝试使用Java(java.net.URLConnection)建立与该网站的安全连接之前,一切看起来都很好,这导致了

SunCertPathBuilderException: unable to find valid certification path to requested target

通常发生在自签名证书上。只有这不是自签名证书,并且HTTPS请求在浏览器中正常工作。

当我使用SHA-1签名算法重新键入证书时,问题就消失了。

为什么我不能将SHA-2签名证书与最近的JDK(1.7.0_45)一起使用? 有什么办法可以让JDK接受SHA-2签名证书吗?

1 个答案:

答案 0 :(得分:1)

我们在java中使用sha-2证书相当多,所以我很确定sha-2本身不是问题,而是发布它的CA.

可能因为它是sha-2证书,它是从较新的sha-2 CA发布的,该CA已在Web浏览器中注册,但在Java的默认信任库(cacerts文件)中。 sha-1证书可能有效,因为它是从较旧的CA颁发的, 存在于信任库中。

您需要导出颁发sha-2网站证书的CA证书并将其导入您的java信任库。如果您将网址放入网络浏览器,您应该可以点击锁定图标并查看整个链条。 CA证书就是顶级证书。

  1. 以base64格式获取CA证书作为ca.cer(如果需要,我可以发布确切的步骤)。请注意,keytool要求cert为base64格式,否则将拒绝它。
  2. 运行此命令(将JAVA_HOME替换为您的JDK路径): JAVA_HOME \ bin \ keytool -keystore JAVA_HOME \ jre \ lib \ security \ cacerts -import -file ca.cer -alias newca
  3. 系统将提示您输入密码,输入“changeit”,不带引号
  4. 您将被问到“信任此证书?[否]”输入“是”
  5. 现在java.net.URLConnection应该可行。我们会遇到这个问题,如果Oracle会发布cacerts文件的更新,那就太好了。