OpenSSL WinINET 客户端

Posted

技术标签:

【中文标题】OpenSSL WinINET 客户端【英文标题】:OpenSSL WinINET client 【发布时间】:2012-12-28 14:37:00 【问题描述】:

我有一个工作的客户端和一个服务器,一旦完成就会有一个有效的 SSL 证书。

目前,为了进行测试,我只是通过添加标志INTERNET_FLAG_IGNORE_CERT_CN_INVALIDSECURITY_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 客户端的主要内容,如果未能解决你的问题,请参考以下文章

Wininet 客户端端口 - delphi 2010

Wininet SSL 与每个请求的客户端证书智能卡访问

WinInet 未定义标识符

Delphi 中用于 FTP 的 WinInet 包装器

wininet如何处理cookies

在 WinINet 中手动验证服务器证书