小编lii*_*mai的帖子

Microsoft HTTP Server API - 使用SSL,如何要求客户端证书?

我目前正在实施使用Microsoft HTTP服务器API 2.0版(小HTTP服务器http://msdn.microsoft.com/en-us/library/windows/desktop/aa364510(v=vs.85).aspx).

我需要在服务器端启用HTTPS,并在客户端请求进入时要求客户端证书(我需要客户端能够验证服务器和服务器以验证客户端,并且它们应该通过SSL进行通信).

到目前为止,我已经能够启用服务器端SSL,因此我可以安全地连接到{ https://127.0.0.1:9999/hello }站点,向服务器发出请求并接收响应,但我无法进行打开请求客户端证书的功能(并验证它).

我在应用程序代码中说,我在听"{ https://127.0.0.1:9999/hello }" URL(这是我添加到URL组URL),然后我用Netsh.exe工具来绑定9999端口到SSL:

C:\>netsh http add sslcert ipport=0.0.0.0:9999 certhash=e515b6512e92f4663252eac72c28a784f2d78c6 appid={2C565242-B238-11D3-442D-0008C779D776} clientcertnegotiation=enable
Run Code Online (Sandbox Code Playgroud)

我不确定这个"clientcertnegotiation = enable"究竟应该做什么,文档说它应该"开启证书谈判".所以现在我添加了一个额外的函数调用到我的HTTP Server代码:

  DWORD answer = 0;
  HTTP_SSL_CLIENT_CERT_INFO sslClientCertInfo;
  ULONG bytesReceived;
  answer = HttpReceiveClientCertificate(hReqQueue, pRequest->ConnectionId, 0,
      &sslClientCertInfo, sizeof( HTTP_SSL_CLIENT_CERT_INFO ), &bytesReceived, NULL );
Run Code Online (Sandbox Code Playgroud)

我明白现在应该提示客户端提供证书,但它不起作用(我可能做错了,所以这就是我在这里写我的问题的原因)."answer"的值是1168(ERROR_NOT_FOUND).我使用的是Firefox浏览器作为客户端,我添加了一个证书有:工具 - >选项 - >查看证书 - >导入,因此火狐也许应该使用证书或弹出一些证书也许,但我怀疑没有按火狐完全没有收到服务器的客户端证书请求.

那么HTTP服务器应该在哪个位置请求客户端证书?我认为在收到请求后应该是正确的.为了证明我究竟在做什么,我使用微软的HTTP服务器示例应用程序代码(http://msdn.microsoft.com/en-us/library/windows/desktop/aa364640(v=vs.85). aspx),我已经修改了:

#include "precomp.h"
#include <iostream>

//
// Macros.
//
#define INITIALIZE_HTTP_RESPONSE( resp, status, reason )    \
do                                                      \
{                                                       \
    RtlZeroMemory( (resp), sizeof(*(resp)) );           \ …
Run Code Online (Sandbox Code Playgroud)

c++ windows client-certificates

16
推荐指数
1
解决办法
4345
查看次数

标签 统计

c++ ×1

client-certificates ×1

windows ×1