我正在尝试向 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 的类。
转到 WebLogic 管理控制台 -> 环境 -> 服务器 -> 您的服务器 -> 配置 -> SSL
点击“锁定并编辑”
打开“高级”翻盖
将“主机名验证”从“BEA 主机名验证器”更改为“自定义主机名验证器”
将“自定义主机名验证器”设置为
weblogic.security.utils.SSLWLSWildcardHostnameVerifier
点击“保存”,然后点击“激活更改”
重新启动服务器。
答案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: