首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SSL通配符证书验证主机

使用SSL通配符证书验证主机
EN

Stack Overflow用户
提问于 2015-07-02 21:55:27
回答 1查看 632关注 0票数 1

我的HTTPS客户端使用Poco C++与我们的服务器连接,服务器使用通配符证书(*.example.com)。连接在CertificateValidationException中失败,错误消息是“来自x.y.z.w:应用程序验证失败的不可接受的证书”。

奇怪的是,它并不总是失败,只是大多数时候。经过多次调试后,我的预感是,它与拓扑(例如跨越子网)或主机名如何/何时被转换为I.P.地址有关。

我认为这是因为在一切都按预期工作的情况下,本地DNS正在路由主机名。但是,在不工作的情况下(上面的错误消息),主机名翻译在本地框上,就像我的PC。

有办法缩小这里发生的事吗?这是一个常见的或已知的问题吗?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-06-28 21:09:27

我自己也遇到了同样的症状。使用Poco::Net::HTTPSClientSession,我可以很好地连接到非通配符站点,但是在连接到*.example.com通配符站点时出现了异常和消息失败。不过,请注意,我观察到的行为是100%一致的,从来没有间断。

在通过Poco源代码进行调试之后,我发现了HTTPSClientConnection类如何设置自身以执行证书验证的问题。我在Poco问题#1303上注册了pocoproject.org,但是如果您使用no构造函数创建一个HTTPSClientSession,那么在使用通配符证书连接到服务器时总是会得到这个异常。例如:

代码语言:javascript
复制
Poco::URI uri("http://blah.example.com");   // SSL cert is for *.example.com
Poco::Net::HTTPSClientSession session;      // Note no-arg constructor
session.setHost(uri.getHost());
session.setPort(uri.getPort());

Poco::Net::HTTPRequest req;
// Populate req...

session.sendRequest(req);      // Throws CertificateValidationException:
                               // "Unacceptable certificate from x.x.x.x,
                               // application verification failure"

问题是,在验证证书时,如果主机名尚未设置,各种Poco::Net类将查找对等名称作为IP地址,然后尝试将该IP地址与通配符证书CN匹配(很明显,x.y.z.w将无法与*.example.com匹配)。

好消息是有几个简单的解决办法。最简单的方法是只使用HTTPSClientSession(主机、端口)构造函数,它将在基础SecureStreamSocket上设置正确的主机名,以便后续的证书验证与证书(CN=*.example.com)匹配真正的主机名(blah.example.com),而不是IP地址:

代码语言:javascript
复制
Poco::URI uri("http://blah.example.com");
Poco::Net::HTTPSClientSession session(uri.getHost(), uri.getPort());      // Calls SecureStreamSocket::setPeerHostName() internally

还有其他解决办法:首先创建您自己的SecureStreamSocket,在其上调用setPeerHostName(),然后将其传递到适当的HTTPSClientSession构造函数中,等等。如果需要,请参阅上面的问题跟踪器链接以获得更多的想法。

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

https://stackoverflow.com/questions/31195309

复制
相关文章

相似问题

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