【发布时间】:2025-11-26 19:30:01
【问题描述】:
我有一个在 WebLogic 12.2.1 中运行的 JAX-RS Web 服务。我可以使用浏览器通过 HTTP 和 HTTPS 调用服务。由于 SSL 证书是自签名的,所以在浏览器提示时我必须信任它。
在一个测试独立程序中(重要部分如下图),我也可以用HTTP调用服务,在URL中提供服务器的IP地址。
ClientConfig config = new ClientConfig();
Client client = ClientBuilder.newClient(config);
WebTarget target = client.target(UriBuilder.fromUri("http://XXX.XXX.XXX.XXX:5320/MLM").build());
Invocation.Builder builder = target.path("Services/Init").request();
Response response = builder.get();
String responseBody = response.readEntity(String.class);
但是,当我将客户端代码中的 URL(将端口和 IP 地址更改为主机名)更改为 HTTPS 时,出现以下异常。
Exception in thread "main" javax.ws.rs.ProcessingException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching XXXX.XXXX.XXXX.XXXX found
at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:287)
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:255)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:684)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:681)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:681)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:411)
at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:311)
证书中的公用名与服务器的主机名相同。我还可以从运行客户端程序的位置 ping 主机名。客户端程序使用以下 JVM 参数运行,我指定了存储 SSL 证书的密钥库文件。
-Djavax.net.ssl.trustStore=mlm-sit.jks -Djavax.net.ssl.trustStorePassword=xxxxxx
可能出了什么问题?
提前致谢。
【问题讨论】:
-
看看this。尝试使用 SSL 配置客户端
-
谢谢peeskillet。该链接很有用。我的问题的根本原因是我更改密钥库时没有重新启动服务器。原始证书的公用名与服务器的主机名不匹配。所以我不得不换一个新的证书和密钥库。
标签: java web-services ssl jax-rs weblogic12c