OpenSSL WinINET 客户端
Posted
技术标签:
【中文标题】OpenSSL WinINET 客户端【英文标题】:OpenSSL WinINET client 【发布时间】:2012-12-28 14:37:00 【问题描述】:我有一个工作的客户端和一个服务器,一旦完成就会有一个有效的 SSL 证书。
目前,为了进行测试,我只是通过添加标志INTERNET_FLAG_IGNORE_CERT_CN_INVALID
和SECURITY_FLAG_IGNORE_UNKNOWN_CA
来禁用客户端中的 SSL 验证,如下所示:
HINTERNET hRequest = HttpOpenRequest(hConnection,
"GET","index.html",
NULL,NULL,NULL,
INTERNET_FLAG_RELOAD|
INTERNET_FLAG_EXISTING_CONNECT
#ifdef __HTTPS__
| INTERNET_FLAG_SECURE |INTERNET_FLAG_IGNORE_CERT_CN_INVALID|SECURITY_FLAG_IGNORE_UNKNOWN_CA
#endif
,
dwContext);
我让它在我的笔记本电脑上完美运行。现在我正试图在我的电脑上使用它。完全相同的代码。复制并粘贴文件(均为 Visual Studio Professional 2008),现在我收到 12045
错误。这意味着Invalid Certificate Authority
我尝试禁用 Windows 防火墙,但没有奏效。两台电脑连接到同一个路由器
有什么想法会导致这种情况吗?
谢谢!
编辑
基本上和here by Microsoft描述的一样,只有这篇文章是针对Windows CE
的
【问题讨论】:
“复制并粘贴文件” - 什么文件?__HTTPS__
是否在客户端 PC 的项目中定义?
目前它是 VS 项目中的单个源文件。是的,__HTTPS__
已定义。我现在看到了groups.google.com/forum/?fromgroups=#!topic/… 但不知道它是否与它有关,我对整个 WinAPI 的东西都很陌生
【参考方案1】:
this 有帮助吗?
如果服务器 SSL 证书是由未知或无效的证书颁发机构 WinInet HttpSendRequest API 或 MFC CInternetFile::SendRequest 将失败并出现错误 12045 (ERROR_INTERNET_INVALID_CA)。
我认为你应该在发出请求之前调用InternetSetOption()
,就像这样,因为HttpOpenRequest()
flags没有指定SECURITY_FLAG_IGNORE_UNKNOWN_CA
:
HINTERNET hRequest = HttpOpenRequest(hConnection,...
#ifdef __HTTPS__
DWORD dwFlags;
DWORD dwBuffLen = sizeof(dwFlags);
InternetQueryOption(hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
InternetSetOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof (dwFlags));
#endif
HttpSendRequest(hRequest,...
【讨论】:
感谢您的回答。我现在收到错误12057
,即ERROR_WINHTTP_SECURE_CERT_REV_FAILED
。不知道这是什么意思,但如果我目前在笔记本电脑上运行,它仍然可以从那里运行,所以没有服务器错误
正如这里建议的 groups.google.com/forum/?fromgroups=#!topic/… 我已将 SECURITY_FLAG_IGNORE_REVOCATION
添加到您的代码中。现在它可以工作了。谢谢!
“但如果我目前正在笔记本电脑上运行” - 您是否在笔记本电脑上生成和/或信任服务器证书?这可以解释你没有在那台机器上得到错误。无论如何,证书吊销检查是disabled by default。编辑:很好,你解决了! :-)
我不记得曾经信任过任何一台计算机上的证书。但至少它现在正在运行。希望一旦我们转向受信任的证书,就不会有任何问题。非常感谢!以上是关于OpenSSL WinINET 客户端的主要内容,如果未能解决你的问题,请参考以下文章