SSL 与 WinHTTP

2024-06-24

我用 winhttp 创建了一个简单的 Web 服务器,它只有一个客户端,一个网站。在我启用 SSL 之前它工作得很好。我没有收到任何错误,并且一切似乎都正常,但网站在尝试连接时收到错误代码 104,并且我在服务器中没有看到任何活动。该网站是由专业人士创建的,因此该错误很可能出现在我的代码中。由于我对网络编程一无所知,所以我用 C++ 创建了一个测试客户端来调试问题。 没有 SSL,它可以连接到服务器。但是当我尝试设置客户端证书时,它失败了。所以现在我有两个问题。

这是服务器代码的相关部分:

ULONG ret = NO_ERROR;
HRESULT hr = S_OK;
HTTPAPI_VERSION ver = HTTPAPI_VERSION_1;

ret = HttpInitialize(ver,HTTP_INITIALIZE_SERVER|HTTP_INITIALIZE_CONFIG,NULL);
if(ret!=NO_ERROR)
    return;

SOCKADDR_IN sa;
HTTP_SERVICE_CONFIG_SSL_SET scssl;
memset(&sa,0,sizeof(sa));
sa.sin_addr.S_un.S_addr = 0;
sa.sin_family = AF_INET;
sa.sin_port = 443;
scssl.KeyDesc.pIpPort = (SOCKADDR*)&sa;
scssl.ParamDesc.AppId = AppID;
scssl.ParamDesc.DefaultCertCheckMode = 0;
scssl.ParamDesc.DefaultFlags = HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT;
scssl.ParamDesc.DefaultRevocationFreshnessTime = 0;
scssl.ParamDesc.DefaultRevocationUrlRetrievalTimeout = 10000;
scssl.ParamDesc.pSslCertStoreName = L"MY";
scssl.ParamDesc.pDefaultSslCtlIdentifier = NULL;
scssl.ParamDesc.pDefaultSslCtlStoreName = NULL;
scssl.ParamDesc.pSslHash = (void*)ServerCertHash;
scssl.ParamDesc.SslHashLength = ARRAYSIZE(ServerCertHash);
ret = HttpSetServiceConfiguration(NULL,HttpServiceConfigSSLCertInfo,&scssl,sizeof(scssl),NULL);
if(ret!=NO_ERROR)
    return;

ret = HttpCreateHttpHandle(&m_RequestQueue,0);
if(ret!=NO_ERROR)
    return;

wcsncpy(m_Url,L"https://+:443/WebShop/",256);
ret = HttpAddUrl(m_RequestQueue,m_Url,NULL);
if(ret!=NO_ERROR)
    return;

该文档没有说明当 pDefaultSslCtlIdentifier 为 NULL 时会发生什么,但我猜这意味着服务器接受任何受信任的证书。我尝试设置我需要的,但 HttpSetServiceConfiguration 调用失败。

在客户端,WinHttpSetOption 失败,并且 GetLastError() 返回 6。有时我会在调试输出中看到访问冲突错误。报告的地址接近请求的值。 客户端代码:

char* types[] = {"application/soap+xml",NULL};
hint = InternetOpen("WebTestClient",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
if(hint!=NULL)
{
    InternetSetStatusCallback(hint,&HTTPStatusCallbackFunc);
    hsession = InternetConnect(hint,"127.0.0.1",443,NULL,NULL,3,0,NULL);
    if(hsession!=NULL)
    {
        hreqest = HttpOpenRequest(hsession,"GET","/WebShop/","HTTP/1.1",NULL,(LPCSTR*)types,INTERNET_FLAG_SECURE|INTERNET_FLAG_IGNORE_CERT_CN_INVALID,NULL);
        if(hreqest!=NULL)
        {
            if(SetupSSL(hreqest))
            {
                if(HttpSendRequest(hreqest,NULL,0,inbuf,inlen))
                {
                    ...
                }
            }
            InternetCloseHandle(hreqest);
        }
        InternetCloseHandle(hsession);
    }
    InternetCloseHandle(hint);
}

bool SetupSSL(HINTERNET request)
{
    HCERTSTORE store = CertOpenSystemStore(NULL,"MY");
    DWORD ret = 0;
    bool ok = false;

    if(store==NULL)
        return false;
    PCCERT_CONTEXT context = CertFindCertificateInStore(store,X509_ASN_ENCODING,0,CERT_FIND_SUBJECT_STR,L"WebClient",NULL);
    if(context!=NULL)
    {
        // this fails
        ok = WinHttpSetOption(request,WINHTTP_OPTION_CLIENT_CERT_CONTEXT,(LPVOID)context,sizeof(CERT_CONTEXT))==TRUE;
        if(!ok)
            ret = GetLastError();  // returns 6
        CertFreeCertificateContext(context);
    }
    CertCloseStore(store,0);
    return ok;
};

我用这个脚本创建了证书:

makecert -r -pe -n "CN=BeeLSoft" -ss CA -sr LocalMachine -a sha1 -sky signature -cy authority -sv Root.pvk Root.cer

makecert -pe -n "CN=beelsoft.dyndns.org" -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -ic Root.cer -iv Root.pvk -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 -sv Server.pvk Server.cer
pvk2pfx -pvk Server.pvk -spc Server.cer -pfx Server.pfx

makecert -pe -n "CN=WebClient" -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -ic Root.cer -iv Root.pvk -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 -sv Client.pvk Client.cer
pvk2pfx -pvk Client.pvk -spc Client.cer -pfx Client.pfx

我不明白这些东西,但它应该创建适合 SSL 的证书。

如果有关于这个主题的好的教程,那就太好了。到目前为止我发现的内容足以编写上面的代码。


None

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

SSL 与 WinHTTP 的相关文章

  • 使用可加载内核模块修改帧缓冲区(/dev/graphics/fb0)参数

    Problem 我必须配置 Android 平台使用的各种 LCD 显示器 几乎在所有情况下 都没有针对感兴趣的 LCD 显示器免费提供的电气规格 但通过经验和逆向工程 可以很好地猜测参数 我正在尝试使用可加载内核模块来微调显示参数 也欢迎
  • 根据当前文化调用不同(本地化)视图

    我在用着LocalizationAttribute它实现了ActionFilterAttribute本地化视图 我简单地说 Localize 在控制器上 我使用 LocalizeStrings resx 文件根据当前线程上的语言进行应用 一
  • HTML 文档

    有没有一个工具可以从 VS2010 生成的 XML 文档文件生成 HTML 页面 我在谷歌上搜索了这样的工具 但没有找到 我下载并安装了SandCastle 但我不明白如何使用它 尝试使用Sandcastle 帮助文件生成器 http sh
  • 获取当前用户的 NetworkCredential (C#)

    我正在尝试从控制台应用程序调用 Web 服务 并且我需要向客户端提供System Net NetworkCredential object 是否有可能创建一个NetworkCredential启动应用程序的用户的对象而不提示输入用户名 密码
  • 在 2 个 .c 文件之间共享函数

    dir1有dir2 file1 c和file1 h dir2 有 file2 c 现在 如果我想在 file2 c 中访问 file1 c 中定义的函数 我需要在 file1 h 中声明它并在 file2 c 中包含 file1 h 这是一
  • 如何将 CroppedBitmap 转换为 BitmapImage

    我正在尝试将 CroppedBitmap 转换为 BitmapImage 编辑 不使用内存流 我尝试过直接转换它 似乎这不是一个选择 这应该没那么难 我正在尝试剪切 BitmapImage 的一部分 并创建一个仅包含新裁剪的 Bitmap
  • 在异步方法中使用时 HttpClient 标头被清空

    我正在使用 NET Framework 4 6 1 我的 Web api 中有一个控制器 其中有静态 HttpClient 来处理所有 http 请求 在 IIS 上托管我的应用程序后 大约每月一次 我的应用程序的所有传入请求都会出现以下异
  • 将标准库添加到C++ eclipse项目中

    一个 非常 新手 C 问题 有没有办法自动将标准库添加到 C eclipse 项目中 我安装了 CDT 主要功能插件 您可以手动添加 STL 标头的路径路径和符号 gt 包含选项卡 http help eclipse org galileo
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • 除法时的小数舍入误差 (C#)

    我基本上有四个数字 比如 100 200 300 400 我需要计算概率为 100 100 200 300 400 200 100 200 300 400 等等在 当我使用小数数据类型来存储这些概率时 由于舍入问题 它们不会达到 1 在不使
  • 实体框架中的导航属性是什么

    我是实体框架的新手 当Visual Studio创建模型图时我们主要可以看到Entities Propertie和Navigation Properties这两个东西 那么这些Navigation Properties是什么 如何使用它们
  • 简单的喷射器将具体类型与生活方式结合起来

    我正在寻找一种可以使用指定的生活方式注册具体类型的方法 基本上如下所示 public void SomeFunction Type concrete Lifestyle lifestyle gt container Register con
  • 为什么 ASP.Net MVC Range 属性采用类型?

    我只是想知道为什么范围验证属性可以采用类型和两个字符串作为参数 这是为了根据枚举或类似的东西验证字符串吗 另外 我想做的是找到一种简单的方法来验证必须出现在枚举中的 3 个字符的字符串 有什么建议吗 谢谢 亚历克斯 我确实发现你提到的 Ra
  • PC 上 XNA 中的信箱和缩放

    有没有一种方法可以让我基本上以 1080p 或 720p 作为默认分辨率来开发 XNA 游戏 然后根据设置的分辨率将游戏中的所有内容缩放到适当的大小 而不必在每个 Sprite 中设置缩放因子Draw 方法 我的想法是 我可以基于 1080
  • Task.Delay 到底是如何工作的?

    他们说 Task Delay 是一个异步 Thread Sleep 为了测试这一点 我写了下面的代码 我希望立即打印 One 然后 3 秒后将打印结果变量 15 2 秒后 将打印 Two 但似乎并非如此 一 不会立即打印 3 秒后打印 On
  • 如何以一对一/零关系更新员工和身份用户

    我正在尝试更新员工记录 也想更新身份用户 如果我先单独更新身份用户 例如 UserManager Update user Context Entry employee State System Data Entity EntityState
  • 从不同的线程访问对象

    我有一个服务器类 它基本上等待来自客户端的连接 在该类中 我创建了一个 NetworkStream 对象 以便能够从客户端接收字节 由于 NetworkStream Read 方法不是异步的 这意味着它将等到从客户端读取字节才能继续执行类似
  • 如何从与 C# lambda 集成(而非代理集成)的 Amazon API 网关获取正确的 http 状态代码?

    我正在使用 C lambda 与 API 网关集成 我希望 API 网关返回正确的错误代码 例如 400 404 500 等 API网关模块tf文件 provider aws version lt 2 70 0 region var aws
  • Unity 错误“内部构建系统错误。后端退出,代码为 -1073740791。”摧毁/杀死了我的项目

    好吧 我可能在这里夸大了 但这是真的 当我开始打开它时 该项目由于错误 内部构建系统错误 后端退出 代码为 1073740791 而被破坏 应用程序 这个项目已经在Google Play上发布了 也许和设置有关 有人可以帮忙吗 完整错误 I

随机推荐

  • Git 克隆已经是克隆的存储库

    做这个手术有什么副作用吗 git clone已经是另一个远程存储库的克隆的存储库 没有副作用 但您应该准确了解克隆存储库时会发生什么 一些理论 问题 是 当您 以正常方式 克隆存储库时 即在调用时没有调整任何时髦的旋钮git clone y
  • Angular2 CLI Socket.io(第 3 方库导入)

    angular cli 0 0 39 node 6 2 2 os win32 x64 我尝试导入socket io 客户端 http socket io 进入使用生成的 angular2 应用程序角度 cli https github co
  • 如何根据条件选择列?

    我有一个名为 status 的变量 我在此 select 语句之前设置了它 Select ordr num as num ordr date as date ordr ship with as shipwith From order whe
  • Maven+Tomcat热部署

    我在互联网上搜索了这个问题 但没有找到单一的解决方案 我们有一个 Maven 项目 它使用配置文件来构建适合 dev qa prod 环境的工件 使用 YUI 插件缩小 JS 和 CSS 它使用 Spring 进行依赖注入 使用 strut
  • 使用 NSDataDetector 进行 NSDate 检测

    我尝试从 NSString 获取 NSDateUNKNOWN格式 所以我写了一个如下所示的函数 void dateFromString NSString string NSError error NULL NSDataDetector de
  • 如何修复“用户警告:Distutils 在 Setuptools 之前导入”? [复制]

    这个问题在这里已经有答案了 当我克隆一些包含 python 工具的包时 出现错误 Errors lt lt unique id cmake home scpark cps ws logs unique id build cmake 001
  • 不变违规:ViewPagerAndroid 已从 React Native 中删除。'react-native-viewpager' 而不是 'react-native'

    当我使用这个示例在我的应用程序上实现图像滑块时 我遇到了这个错误 import React Component from react import View Text TouchableOpacity ViewPagerAndroid fr
  • React Draft.js Wysiwyg:如何以编程方式在光标位置插入文本?

    我正在使用反应草案所见即所得 https jpuri github io react draft wysiwyg 我需要将应用程序的一个组件中的任意文本插入到编辑器组件中 我通过剪贴板作为从一个组件传输到另一个组件的中介来执行此操作 但是d
  • 如何使用 MaterializeCss 创建自动完成表单?

    我正在寻找 MaterializeCss 的自动完成表单 有任何插件吗 我尝试使用 select2 但 css 看起来不太好 Materialise 是一个很棒的库 我能够让它工作 document ready function var i
  • 显示 p:dataTable 行号

    于明镜example http www mkyong com jsf2 how to display datatable row numbers in jsf 他们展示了如何在 JSF 中显示数据表行号 他们使用 javax faces m
  • 如何将swaggerhub生成的flask swagger服务器部署到heroku?

    我正在尝试部署从 swaggerhub 生成的 Flask swagger 服务器 下面是我使用的文件夹结构和 procfile 有谁知道如何在heroku中部署这个flask swagger服务器吗 project swagger cod
  • Mathematica:获取图形基元和指令

    如何从图形基元和指令中获取图形基元和指令Graphics目的 Leonid Shifrin 在帖子中展示了如何删除它们Mathematica 删除图形基元 https stackoverflow com questions 6317253
  • IE9 createElement 和设置innerHTML 在设置操作上放置标签?

    不确定我是否遗漏了一些明显的东西 因为这是我第一次尝试使用原始 DOM api 而不是通过 jQuery 等 做很多事情 考虑以下代码 我在其中使用 document createElement 手动创建 TBODY 然后设置它的inner
  • 在 QGis 中打开 Mapbox 地图

    我正在寻找一种在 QGis 中显示我的 Mapbox 地图的方法 在 mapbox com 上编辑的 Baselayer 以及从tilemill 上传的数据 这里有人已经找到方法了吗 有一个功能或插件可以做到这一点吗 感谢您未来的回答 Ad
  • 将数据帧中的 NaN 转换为零

    我有字典并使用创建了 Pandas cars pd DataFrame from dict cars dict orient index 和 对索引进行排序 按字母顺序排列汽车 cars sort index axis 1 排序后 我注意到
  • 我应该使用 Web API 还是 Web 方法?

    我正在尝试了解 Web api 和一些有关 Web 方法的新闻 我听说我们应该停止使用一些来源的 Web 方法 此外 如果不再使用 Web 方法 Web API 是否会成为继任者 Web 方法是 ASMX 技术的一部分 ASMX 是一项遗留
  • E0145 成员可能未初始化 - cmake - VS2017

    我正在尝试将 C 应用程序与 PCL 库链接 我使用 VCPKG 安装了 PCL 及其所有依赖项 我正在使用 Visual Studio 2017 和 cmake 3 12 for X64 当我尝试构建解决方案时 它给了我以下错误 E014
  • 了解 scikit-learn GridSearchCV - 参数调整和平均性能指标

    我试图了解 scikit learn 中的 GridSearchCV 究竟如何实现机器学习中的训练 验证 测试原理 正如您在下面的代码中看到的 我理解它的作用如下 将 数据集 分为 75 和 25 其中 75 用于参数调整 25 是保留的测
  • “识别”命令无法识别图像文件。 (赫罗库)

    我正在尝试让 Paperclip 与 Heroku 和 Amazon S3 一起使用 在本地主机 Mac OS 和 Amazon 上一切正常 但是当我部署到 heroku 并尝试该功能时 出现此错误 2 errors prohibited
  • SSL 与 WinHTTP

    我用 winhttp 创建了一个简单的 Web 服务器 它只有一个客户端 一个网站 在我启用 SSL 之前它工作得很好 我没有收到任何错误 并且一切似乎都正常 但网站在尝试连接时收到错误代码 104 并且我在服务器中没有看到任何活动 该网站