使用HttpClient携带证书报错_Certificate for <IP> doesn't match any of the subject alternative names:[域名]

使用HttpClient携带pfx证书通过Https协议发送SOUP报文调用WebService接口时报如下错误:

Exception in thread "main" javax.net.ssl.SSLPeerUnverifiedException: Certificate for <IP地址> doesn't match any of the subject alternative names: [域名]
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.verifyHostname(SSLConnectionSocketFactory.java:467)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:397)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:355)
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:359)
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
    at vodafone.KeystoreUtil.main(KeystoreUtil.java:76)

 

问题分析:

颁发的证书是给制定域名的而非IP地址,因为服务器没有加入Public DNS,所以域名无法访问,我在调用接口时直接使用了IP地址,而不是域名。

问题解决:

在hosts配置文件中添加IP地址和域名的映射记录,在调用接口时使用域名进行调用,发现问题解决。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`std::make_shared<std::thread>(&HTTPClient::get_list(value), this)` 这句代码不符合预期,因为 `std::make_shared` 的第一个参数是要构造的对象类型,第二个参数是构造函数的参数列表。而 `&HTTPClient::get_list(value)` 并不是构造函数。 如果你想创建一个带有参数的成员函数指针并将其传递给 `std::thread` 构造函数,你可以使用 `std::bind` 或者 lambda 表达式来实现。下面是一个使用 `std::bind` 的例子: ```c++ #include <memory> #include <thread> #include <functional> class HTTPClient { public: void get_list(int value) { // do something } }; int main() { HTTPClient client; auto t = std::make_shared<std::thread>(std::bind(&HTTPClient::get_list, &client, 42)); t->join(); return 0; } ``` 在这个例子中,我们使用 `std::bind` 来创建一个带有参数的成员函数指针,并将 `client` 的地址作为第一个参数传递给 `std::bind`。然后,我们将返回的函数对象传递给 `std::make_shared`,并将返回的智能指针存储在 `t` 中。 你也可以使用 lambda 表达式来实现: ```c++ #include <memory> #include <thread> class HTTPClient { public: void get_list(int value) { // do something } }; int main() { HTTPClient client; auto t = std::make_shared<std::thread>([&]() { client.get_list(42); }); t->join(); return 0; } ``` 在这个例子中,我们使用一个捕获了 `client` 的引用的 lambda 表达式来调用成员函数,并将 lambda 表达式传递给 `std::make_shared`。这种方法更加简洁,但是可能会使代码更加难以阅读。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值