WebLogic SSL握手失败的信任存储问题

3
当我尝试在Weblogic中调用HTTPS服务时,出现了SSL握手失败的情况。我已经将服务器证书添加到Weblogic的信任存储-"cacerts"中。
在Weblogic启动脚本中添加信任存储的命令如下:
     JAVA_OPTIONS="-Dweblogic.security.SSL.trustedCAKeyStore="/weblogic92/server/lib/cacerts" ${JAVA_OPTIONS}"

导出JAVA_OPTIONS

我是否遗漏了其他内容 - 有没有解决此问题的指针?

使用SSLPoke.java在应用服务器框中测试ssl连接并且测试成功。

   java -Djavax.net.ssl.trustStore=/weblogic92/server/lib/cacerts 
   -Djavax.net.ssl.trustStorePassword=changeit SSLPoke 192.16.2.6 8443

Weblogic服务器日志跟踪:

       javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1628)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:230)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:224)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1027)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:120)
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:574)
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:510)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:888)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1117)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:629)
    at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)

可能是引号的问题吗?尝试使用以下命令:JAVA_OPTIONS="-Dweblogic.security.SSL.trustedCAKeyStore=/weblogic92/server/lib/cacerts" ${JAVA_OPTIONS} - Xargos
@Xargos - 不是引用问题,我甚至尝试使用变量。虽然SSL选项在启动日志中显示,但当我进行SSL调用时,应用程序层面会出现错误。 - Sekhar
当你执行 keytool -v -list -keystore /weblogic92/server/lib/cacerts 命令时,你可以看到你的服务器吗?另外你也可以尝试使用 -Djavax.net.ssl.trustStore=/weblogic92/server/lib/cacerts - Display Name is missing
哪个是解决方案的答案? - kAmol
3个回答

1

您还可以尝试以下几个方法:

  1. 您是否尝试过JAVA_OPTIONS="${JAVA_OPTIONS} -Dweblogic.security.SSL.trustedCAKeyStore=/weblogic92/server/lib/cacerts"

  2. 使用控制台(服务器->服务器名称->密钥库)添加证书

  3. 您可能还需要添加以下Java选项:

    1. -Dweblogic.security.SSL.verbose=true

    2. -Dweblogic.security.SSL.enable.renegotiation=true

    3. -Dsun.security.ssl.allowUnsafeRenegotiation=true

  4. 在服务器->服务器名称->SSL(高级)中检查使用JSSE SSL。

  5. 检查使用服务器证书。

  6. 将主机名验证更改为“无”


我在Weblogic管理控制台中没有看到任何选项"In servers->server_name->SSL (advanced) check Use JSSE SSL."。我使用的是9.2.2版本的Weblogic服务器。尝试了选项1和3。 - Sekhar
目前在日志中,我可以看到这个设置 "java.protocol.handler.pkgs = weblogic.utils|weblogic.utils|weblogic.utils|weblogic.net",我需要更改 handler.pkgs 吗? - Sekhar
我有一个管理员和两个托管实例 - 上述设置1和3应用于托管实例级别的启动脚本。我需要将其应用于管理员实例吗? - Sekhar
哦...没意识到是WebLogic 9.2.2版本(weblogic92可能是一个指针)。在这种情况下,这个方法可能行不通,因为我写这个的时候是考虑的WebLogic 11g。至于最后一条评论,我通常会将它添加到setDomainEnv.sh文件中(不确定你的版本是否存在此文件),但你不需要将其添加到管理实例中。顺便问一下,执行步骤1和3是否导致了不同的错误,还是仍然是相同的错误? - Xargos
1
最后,我能够解决这个问题,多亏了你的“更改主机名验证”指针,非常感谢! - Pieter De Bie

1

我知道这是一个很旧的帖子,但当我部署在Weblogic(12.1)上的Web应用程序需要通过HTTPS与外部webservice通信时,我也遇到了同样的挑战,并经过各种解决方案最终使其正常工作。以下是我工作中的一些指针,希望对未来的某个人有所帮助。

关于此主题的Oracle官方文档可以在这里找到。

How WebLogic Server Locates Trust
---------------------------------

WebLogic Server uses the following algorithm when it loads its trusted CA certificates:

1. If the keystore is specified by the -Dweblogic.security.SSL.trustedCAkeystore 
   command-line argument, load the trusted CA certificates from that keystore.
2. Else if the keystore is specified in the configuration file (config.xml), load 
   trusted CA certificates from the specified keystore. If the server is configured 
   with DemoTrust, trusted CA certificates will be loaded from the 
   WL_HOME\server\lib\DemoTrust.jks and the JDK cacerts keystores.
3. Else if the trusted CA file is specified in the configuration file (config.xml), 
   load trusted CA certificates from that file (this is only for compatibility 
   with 6.x SSL configurations).
4. Else load trusted CA certificates from WL_HOME\server\lib\cacerts keystore.

我尝试了选项1,即提供cacert路径 -Dweblogic.security.SSL.trustedCAkeystore ,并在运行的JDK中导入建议信任库中的证书,但它没有起作用。虽然我知道导入成功了,因为我编写了一个Java类来访问相同的HTTPS位置,并在同一JDK上运行它,但是从Weblogic外部运行。

随后,我尝试了选项2,即将证书导入到位于WL_HOME \ server \ lib \ DemoTrust.jks的DemoTrust.jks中。这样做成功地允许我的部署Web应用程序通过HTTPS与外部Web服务进行通信。


简单完成选项2的方法是:http://saltnlight5.blogspot.com/2016/07/wls-how-to-import-ssl-cert-into-wls.html - kAmol

0
这是一个引号的问题。删除无意义的内部引号:
JAVA_OPTIONS="-Dweblogic.security.SSL.trustedCAKeyStore=/weblogic92/server/lib/c‌​acerts ${JAVA_OPTIONS}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接