SSLHandshakeException:不存在主题备用名称

2024-04-24

我通过 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 的主机名不匹配。我读到了定义自定义主机名验证程序的解决方法here http://docs.oracle.com/cd/E17904_01/web.1111/e13734/proxy.htm。但我无法在代码中找到应该实现解决方法的位置。

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"));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSLHandshakeException:不存在主题备用名称 的相关文章

  • 搜索栏小部件未启动可搜索活动

    我正在尝试使用操作栏中的搜索栏小部件在我的 Android 应用程序上实现搜索 我正在关注 http developer android com guide topics search search dialog html http dev
  • 在java中使用朴素贝叶斯(weka)进行简单的文本分类

    我尝试在我的java代码中使用朴素贝叶斯weka库进行文本分类 但我认为分类的结果不正确 我不知道问题是什么 我使用 arff 文件作为输入 这是我的训练数据 relation hamspam attribute text string a
  • java.library.path 中没有 ocijdbc12

    我正在尝试使用 OCI 驱动程序通过 java 程序连接到 oracle 以下是配置 Windows 7 32 位 JDK 1 7 Oracle 客户端 11g R2 ojdbc7 jar在我的独立应用程序的类路径中 但我收到以下异常 Ex
  • 是否可以使用 Kafka Streams 访问消息头?

    随着添加Headers http apache spinellicreations com kafka 0 11 0 0 javadoc org apache kafka common header Header html到记录 生产者记录
  • 如何使用户输入与变量相关?

    我不知道如何准确地表达这个问题 但这就是我想要实现的目标 我正在使用堆栈实现河内塔插图 这是里面的main 功能 System out println Type the source pole number and the destinat
  • springdoc-openapi:如何添加POST请求的示例?

    Controller有以下方法 ApiResponses value ApiResponse responseCode 200 GetMapping value API URI PREFIX PRODUCTS URI produces Me
  • 块作用域变量

    这将编译 class X public static void main String args int a 2 int a 3 这不会 class X public static void main String args int a 2
  • 选择性罐包装

    我有一个小program jar 它使用了巨大的library jar 的一小部分 有没有一种工具可以将多个 jar 重新打包成一个 以便它可以独立运行并且尽可能小 Update 大小事项 有proguard http proguard s
  • 通过两个标准比较两个对象[重复]

    这个问题在这里已经有答案了 我有一个包含布尔字段的类用户 我想对用户列表进行排序 我希望布尔字段等于 true 的用户位于列表的顶部 并且我想按名称对它们进行排序 这是我的课程 public class User int id String
  • 查看两个对象是否具有相同的类型

    假设我有一个类 A 并且 B C D 都是从 A 派生的 如果我想知道引用的对象的类型是什么 我可以声明 pseudo code if obj instanceof B lt is B gt else if obj instanceof C
  • 没有找到适合 jdbc.sqlite 的驱动程序

    所以首先我之前看到过这个问题 我查看了以前的答案并尝试用它来解决我的问题 但是我做不到 我正在创建一个图书馆系统 并为注册类和登录类编写了代码 并为数据库创建了一个类 当我尝试运行该程序时 我收到一条消息 指出没有找到合适的驱动程序 后跟数
  • 如何在运行时获取类名,但仅获取类名?

    如何在运行时获取类名 但仅获取实际的类名而不是整个 com xyz etc 我的意思只是最后一个句点之后的名字部分 您必须将以下代码片段用于对象 yourObject getClass getSimpleName 或供课堂使用 yourCl
  • 将列表沿元素拆分为子列表

    我有这个清单 List
  • 将问号 (?) 替换为 (\\?)

    我正在尝试定义一个模式来匹配文本中带有问号 的文本 在正则表达式中 问号被认为是 一次或根本不 那么我可以用 替换文本中的 符号来解决模式问题吗 String text aaa aspx pubid 222 zzz Pattern p Pa
  • Java中的引用变量到底是什么?它与其他变量有何不同?

    我一直在研究 Java 中的继承 作者声明 被引用的对象类型 而不是引用变量的类型 决定了将执行哪个版本的重写方法 这种说法非常令人困惑 这本书所指的是多态性 更具体地通过动态调度 简而言之 想象一下以下类 public class Per
  • Java 中的冒号是什么意思?

    Java 中的冒号是什么意思 我有这个 public static List
  • hibernate session.flush 和 spring @transactional

    我在我的应用程序中使用 Spring 和 Hibernate 并使用 Spring Transaction 所以我有一个带注释的服务层 Transaction方法和 DAO 层具有数据库查询方法 Transactional readOnly
  • 我想在Java中使用关于随机索引的索引

    我使用Java 当我在Java中使用ArrayList时 如果我随机访问索引号 这可能吗 如果这是不可能的 我应该怎么做 例如 ArrayList
  • -XX:MinHeapFreeRatio 和 -XX:MaxHeapFreeRatio 的目的是什么

    请告诉我这些选项的目的 谷歌搜索后我想 MinHeapFreeRatio 表示 GC 后将确保堆内存中指定的最小空间百分比是可用的 和 MaxHeapFreeRatio告诉 GC后堆内存中的空闲空间不会超过指定的百分比 如果空闲内存超过指定
  • JavaFX 3D 面孔着色...再次

    我研究了这个question https stackoverflow com questions 26831871 coloring individual triangles in a triangle mesh on javafx 但我还

随机推荐