从 Weblogic 发送服务请求时证书验证错误

从 Weblogic 发送服务请求时证书验证错误

我正在尝试向 salesforce.com 发出服务调用。我已将证书链添加到我的密钥库中,但当服务验证域证书时,它会挂在 CN 子域部分的通配符上,但这是我直接从网站获取的证书。我发现 WebLogic 不支持证书 CN 中的通配符。是否可以在不使证书无效的情况下修改 CN。

当我从 WebLogic OSB 内部测试服务时出现的错误是:

调用导致错误:[Security:090504]从 sensis-proxy-vs.sensis.com.au 收到的证书链 - 161.117.32.128 --> cs5.salesforce.com 主机名验证检查失败。证书包含 *.salesforce.com,但检查应为 cs5.salesforce.com。

答案1

这里的问题是,WebLogic 的默认主机名验证器不支持 CN 包含主机名通配符的 SSL 证书。

可以更改 WebLogic 的主机名验证器,并且 WebLogic 附带一个可以使用通配符验证 CN 的类。

  1. 转到 WebLogic 管理控制台 -> 环境 -> 服务器 -> 您的服务器 -> 配置 -> SSL

  2. 点击“锁定并编辑”

  3. 打开“高级”翻盖

  4. 将“主机名验证”从“BEA 主机名验证器”更改为“自定义主机名验证器”

  5. 将“自定义主机名验证器”设置为weblogic.security.utils.SSLWLSWildcardHostnameVerifier

  6. 点击“保存”,然后点击“激活更改”

  7. 重新启动服务器。

答案2

朋友,您正在寻找调试 weblogic 服务器的 SSL 问题的方法吗?

错误:

FINE: ……….. Eating Exception ……….
java.security.NoSuchAlgorithmException: Algorithm ECDH not available
+ at javax.crypto.KeyAgreement.getInstance(DashoA13*..)+

原因:

这类似于客户端和服务器无法就通用密码(算法)进行协商,因此握手失败。

简单来说:密码由客户端初始化,服务器必须选择客户端提供的任意一个密码才能通过 SSL 进行通信。如果服务器不支持客户端通用的任何此类密码算法,则通信将无法进行。

因此,如果可以强制客户端(Weblogic)使用较弱的密码,并且服务器对使用有限密码没有任何限制,那么我们就可以通过 SSL 建立连接。

解决:

默认情况下,Weblogic Server 使用 SSL 的 certicom 实现。

上述异常是因为 SSL 的 certicom 实现无法获得通用密码协商。

我们可以告诉 Weblogic 服务器使用 SUN 的 SSL 实现来解决这个问题。

为了使用 SSL 的 SUN 实现,我们可以在 Weblogic 服务器中使用以下属性:

  • Djavax.net.ssl.keyStore
  • Djavax.net.ssl.keyStoreType
  • Djavax.net.ssl.keyStore密码
  • Djavax.net.ssl.trustStore
  • Djavax.net.ssl.trustStoreType
  • Djavax.net.ssl.trustStore密码
  • Djava.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol

所有上述属性都可以用作 JAVA 属性,以便 WLS JVM 使用这些值而不是使用它自己的实现。

我们还可以在代码中使用上述属性,如下所示:

System.setProperty( “javax.net.ssl.keyStore”, “***” );
System.setProperty( “javax.net.ssl.keyStoreType”, “JKS” );
System.setProperty( “javax.net.ssl.keyStorePassword”, “***” );
System.setProperty( “javax.net.ssl.trustStore”, “***” );
System.setProperty( “javax.net.ssl.trustStoreType”, “JKS” );
System.setProperty( “javax.net.ssl.trustStorePassword”, “***” );
Security.addProvider( new com.sun.net.ssl.internal.ssl.Provider() );
System.setProperty( “java.protocol.handler.pkgs”, “com.sun.net.ssl.internal.www.protocol” );

笔记- 对于 SSL 运行时调试,您也可以使用管理控制台。对于服务器,请登录管理控制台 >>>> 服务器 >>> MS1 >>> 调试 >>>> weblogic 树 >>>> ssl 选项。选中该选项并单击启用。

答案3

转到 WebLogic 管理控制台 -> 环境 -> 服务器 -> 您的服务器 -> 配置 -> SSL

打开“高级”翻盖

将“主机名验证”从“BEA 主机名验证器”更改为“无”

点击“保存”

重新启动服务器。

答案4

或者,我们也可以像下面这样工作。

上面的答案#设置“将“自定义主机名验证器”设置为weblogic.security.utils.SSLWLSWildcardHostnameVerifier”对我来说不起作用。

我已完成以下步骤,它对我有用:

前往

WebLogic 管理控制台 -> 环境 -> 服务器 -> 您的服务器 -> 配置 -> SSL

  • 点击“锁定并编辑”

    • 打开“高级”翻盖

    • 将“主机名验证”从“BEA 主机名验证器”更改为“无”

    • 点击“保存”,然后点击“激活更改”

    • 重新启动服务器。

并且连接到此 SSL 启用环境的客户端应用程序我已经使用以下 -D 选项运行 java :

-Dweblogic.security.SSL.ignoreHostnameVerification=true

现在我能够从客户端应用程序连接到启用 SSL 的环境。在内部,我的客户端需要与 Weblogic 服务器中启用 t3s (SSL) 的 JMS 配合使用。它解决了我在客户端应用程序中遇到的以下异常:

javax.naming.CommunicationException: t3s://slc09kty.MYHost.com:7202: Destination 10.XX.XX.164, 7202 unreachable; nested exception is:
        javax.net.ssl.SSLKeyException: Hostname verification failed:

相关内容