首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SSLHandshakeException:不存在主题备用名称

SSLHandshakeException:不存在主题备用名称
EN

Stack Overflow用户
提问于 2012-04-21 18:24:23
回答 1查看 165.6K关注 0票数 57

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

代码语言:javascript
复制
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的主机名不匹配。我读到了一个定义自定义主机名验证器here的变通方法。但是我不能在我的代码中确定我应该在哪里实现解决方法。

代码语言:javascript
复制
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。如果这个异常可以用一些不同的解决方法来解决,请给出建议。

EN

回答 1

Stack Overflow用户

发布于 2012-04-23 04:15:50

与某些浏览器不同,Java在服务器身份验证(RFC2818,第3.1节)和IP地址方面严格遵循HTTPS规范。

使用主机名时,可以退回到服务器证书的主题DN中的通用名称,而不是使用主题备用名称。

使用IP地址时,证书中必须有使用者备用名称条目(类型为IP地址,而不是DNS名称)。

您将在this answer中找到有关该规范以及如何生成此类证书的更多详细信息。

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10258101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档