通过HTTPS托管第三方Web服务,在使用Web服务时,我面临SSL握手失败错误。
出于安全原因,我们无法访问第三方网址或服务,只有我们的客户才能从该环境访问。
我已经做了足够的打击和试验,但仍然没有成功。
我们的应用程序在Weblogic 9.2上运行。
第三方提供了证书(.p7b格式)。我已经在javakeystore(cacerts)中导入了这些证书,甚至在weblogic密钥库(demotrust.jks)中,但仍然是同样的错误。我尝试了在密钥库中导入证书的不同组合,我也可以在密钥库中看到证书的条目。
即使我们已经要求客户端在那里生成存根(因为我们无法从我们的环境访问),使用HTTP存根生成但使用HTTPS,它会导致SSL握手失败。
我认为如果我们解决了这个问题,那么应用程序也会运行。
应用程序在http上运行正常,但在https上它会导致SSL握手失败错误。
我已经正确地从(.p7b转换为.cer格式然后导入),甚至使用.p7b到.pem到.der格式,然后在java密钥库demotrust.jks中导入,但仍然不起作用。< / p>
我错过了任何步骤,请告诉我。
答案 0 :(得分:1)
我们也面临同样的问题。我们尝试连接安装了256encryption SSL证书的第三方服务器。当我们尝试从java(v1.7)连接它时,我们得到handshake_failure错误。
我们按照以下步骤解决问题:
从第三方服务器下载有效的SSL证书链,并将其安装在Windows中的jdk密钥库cacerts(位于C:\ Program Files \ Java \ jdk1.7.0_79 \ jre \ lib \ security)中。使用以下开源Java class to extract certificate from 3rd party URL
要在密钥库中安装证书,可以使用以下命令 keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias helloroot -file hello.cer
完成上述步骤后,问题仍然存在,然后我们在与第三方服务器团队进行通信后了解了TLSv1.1,TLSv1.2。第三方服务器正在使用并强制客户端仅通过TLSv1.1和更新版本进行连接。
我们使用的是java 1.7和Grails 2.3.1。我们强制grails在连接HTTPS URL时使用TLSv1.1。有以下方法可以强制grails使用TLSv1.1或更新版本
通过配置BuildConfig.groovy文件并添加了jvmArgs:[&#39; -Dhttps.protocols = TLSv1.1&#39;]
grails.project.fork = [ ... run:[maxMemory:1280,minMemory:128,debug:false,maxPerm:256,forkReserve:true, jvmArgs:[&#39; -Dhttps.protocols = TLSv1.1&#39;] ] , ... ]
您可以在运行Grails应用程序时传递-Dhttps.protocol参数
grails run-app -Dhttps.protocols = TLSv1.1
答案 1 :(得分:0)
通过将证书添加到cacerts文件并将其指向weblogic,解决了同样问题。 最初的证书链未正确导入cacerts文件。