gpt4 book ai didi

java - SSLHandshakeException : No subject alternative names present

转载 作者:IT老高 更新时间:2023-10-28 20:24:11 26 4
gpt4 key购买 nike

我正在通过 java 代码调用 HTTPS SOAP Web 服务。我已经在 jre cacerts keystore 中导入了自签名证书。现在我得到了:

com.sun.xml.internal.ws.com.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present

服务 URL 的主机名与证书中提供的 CN 的主机名不匹配。我读到了定义自定义主机名 validator 的解决方法 here .但我无法确定我应该在我的代码中实现解决方法的位置。

public SOAPMessage invokeWS(WSBean bean) throws Exception {

SOAPMessage response=null;
try{

/** Create a service and add at least one port to it. **/
String targetNameSpace = bean.getTargetNameSpace();
String endpointUrl = bean.getEndpointUrl();
QName serviceName = new QName(targetNameSpace, bean.getServiceName());
QName portName = new QName(targetNameSpace, bean.getPortName());
String SOAPAction = bean.getSOAPAction();
HashMap<String, String> map = bean.getParameters();


Service service = Service.create(serviceName);
service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointUrl);

/** Create a Dispatch instance from a service. **/
Dispatch dispatch = service.createDispatch(portName, SOAPMessage.class,
Service.Mode.MESSAGE);

// The soapActionUri is set here. otherwise we get a error on .net based
// services.
dispatch.getRequestContext().put(Dispatch.SOAPACTION_USE_PROPERTY,
new Boolean(true));
dispatch.getRequestContext().put(Dispatch.SOAPACTION_URI_PROPERTY,
SOAPAction);

/** Create SOAPMessage request. **/
// compose a request message
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage message = messageFactory.createMessage();

// Create objects for the message parts
SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();

SOAPElement bodyElement = body.addChildElement(bean.getInputMethod(),
bean.getPrefix(), bean.getTargetNameSpace());

...more code to form soap body goes here

// Print request
message.writeTo(System.out);

// Save the message
message.saveChanges();

response = (SOAPMessage)dispatch.invoke(message);
}
catch (Exception e) {
log.error("Error in invokeSiebelWS :"+e);
}
return response;
}

请忽略 WSBean 参数,因为命名空间和其他 wsdl 属性都来自该 bean。如果这个异常可以通过一些不同的解决方法解决,请提出建议。

最佳答案

谢谢,Bruno 提醒我常用名称和主题备用名称。我们发现证书是使用 CN 生成的,带有网络的 DNS 名称,并要求使用主题备用名称条目重新生成新证书,即 san=ip:10.0.0.1。这是实际解决方案

但是,我们设法找到了一个解决方法,我们可以使用它在开发阶段运行。只需在我们建立 ssl 连接的类中添加一个静态 block 。

static {
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier()
{
public boolean verify(String hostname, SSLSession session)
{
// ip address of the service URL(like.23.28.244.244)
if (hostname.equals("23.28.244.244"))
return true;
return false;
}
});
}

如果您碰巧使用的是 Java 8,有一种更巧妙的方法可以实现相同的结果:

static {
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> hostname.equals("127.0.0.1"));
}

关于java - SSLHandshakeException : No subject alternative names present,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10258101/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com