SSLHandshakeException:没有主题备用名称

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

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的主机名与cert中提供的CN的主机名不匹配。我在这里阅读了有关定义自定义主机名验证程序的解决方法。但是我无法在我的代码中提出实现此解决方法的位置。

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。如果可以通过一些不同的解决方法解决此异常,请提出建议。

回答:

谢谢,布鲁诺让我了解了“通用名称”和“主题备用名称”。如我们所知,证书是使用CN生成的,其DNS名称为网络,并要求使用主题备用名称条目(即san =

ip:10.0.0.1)重新生成新证书。这是 。

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

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"));

}

以上是 SSLHandshakeException:没有主题备用名称 的全部内容, 来源链接: utcz.com/qa/413338.html

回到顶部