Windows HTTP服务器API HTTPS服务器

Windows Http Server API HTTPS Server

本文关键字:服务器 HTTPS API Windows HTTP      更新时间:2023-10-16

我想在C 中使用Windows Server API设置HTTPS服务器,我使用了示例代码,它可以与HTTP一起使用,但是我无法与HTTPS一起使用。

(我不希望客户端SSL我只有一个是https)

https://msdn.microsoft.com/en-us/library/windows/desktop/aa364640(v = vs.85).aspx

我尝试了" httpsetserviceconfiguration http_service_config_ssl_set"这是我的尝试:

PHTTP_SERVICE_CONFIG_SSL_SET p_ssl_settings = new HTTP_SERVICE_CONFIG_SSL_SET();
p_ssl_settings->KeyDesc.pIpPort = new SOCKADDR();
inet_pton(AF_INET, "0.0.0.0", p_ssl_settings->KeyDesc.pIpPort);
p_ssl_settings->ParamDesc.SslHashLength = 40;
p_ssl_settings->ParamDesc.pSslHash = "dec5a1a952967a613f27dec98ab78a248cd9f782";
p_ssl_settings->ParamDesc.AppId = {0x4dbfb575, 0xe1ef, 0x4239,{0x9a, 0x1d, 0xe9, 0x4c, 0xf8, 0x4d, 0xc2, 0x2d}};
p_ssl_settings->ParamDesc.pSslCertStoreName = nullptr;
p_ssl_settings->ParamDesc.DefaultCertCheckMode = 0;
p_ssl_settings->ParamDesc.DefaultRevocationFreshnessTime = 0;
p_ssl_settings->ParamDesc.DefaultRevocationUrlRetrievalTimeout = 0;
p_ssl_settings->ParamDesc.pDefaultSslCtlIdentifier = nullptr;
p_ssl_settings->ParamDesc.pDefaultSslCtlStoreName = nullptr;
p_ssl_settings->ParamDesc.DefaultFlags = HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT;

const auto retcode = HttpSetServiceConfiguration(
    hReqQueue,
    HTTP_SERVICE_CONFIG_ID::HttpServiceConfigSSLCertInfo,
    p_ssl_settings,
    sizeof HTTP_SERVICE_CONFIG_SSL_SET,
    nullptr
);
if (retcode != NO_ERROR) {
    throw exception(string("HttpSetServiceConfiguration failed with " + to_string(retcode)).c_str());
}

但是,当我运行代码时,获取错误:87是不良参数错误,但对我而言,参数可以正常接缝。

在此网页上,提到句柄必须为零:(ServiceHandle [in]保留。必须为零。)

https://msdn.microsoft.com/en-us/library/windows/desktop/aa364503(v = vs.85).aspx

但是,当我传递nullptr或hander变量时,值为零,我会获得错误代码'6'(句柄无效),所以我不确定

我尝试了" netsh http add sslcert ipport = 0.0.0.0:50001 certhash = de ... appid {...}

,但我无法正确理解这一点,因为我会遇到错误1312:(我是我的appid不好,但我不知道如何为我的Visual Studio C .exe获取它)指定的登录会话不存在。它可能已经终止。

我尝试了" https://localhost:50001/"作为URL。

我该如何使用C " httpsetserviceconfiguration"或netsh?

好吧,我发现了我使用的httpinitialize(版本,flags,保留)函数的问题,我只给它'http_initialize_server',而我应该添加'http_initialize_config',所以这是主要问题,尽管很难仅从错误代码87中弄清楚。

原始:

HttpInitialize(HTTPAPI_VERSION_1, HTTP_INITIALIZE_SERVER, nullptr);

修复:

HttpInitialize(HTTPAPI_VERSION_1, HTTP_INITIALIZE_CONFIG | HTTP_INITIALIZE_SERVER, nullptr);