CPPRestSdk выдает ошибку Ошибка SSL: WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA SSL недействительный ЦС для соединения HTTPS

Я получал сообщение об ошибке, когда запускал старый проект, который требовал, чтобы мой REST-клиент подключался к REST-серверу. Мой клиент был реализован с помощью проекта Microsoft cpprestsdk.

Мой URL-адрес имел форму;

https://localhost:5276/Command

Я получал ошибку:

Ошибка SSL: WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA Недопустимый ЦС SSL. WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID Общее имя SSL не совпадает. Срок действия сертификата WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID SLL истек.

Код остальных клиентов:

#include <cpprest/http_client.h>
#include <cpprest/json.h>

using namespace web;
using namespace web::http;
using namespace web::http::client;

#include <iostream>
using namespace std;

void display_json(
   json::value const & jvalue, 
   utility::string_t const & prefix)
{
   wcout << prefix << jvalue.serialize() << endl;
}

pplx::task<http_response> make_task_request(
   http_client & client,
   method mtd,
   json::value const & jvalue)
{
   return (mtd == methods::GET || mtd == methods::HEAD) ?
      client.request(mtd, L"/restdemo") :
      client.request(mtd, L"/restdemo", jvalue);
}

void make_request(
   http_client & client, 
   method mtd, 
   json::value const & jvalue)
{
   make_task_request(client, mtd, jvalue)
      .then([](http_response response)
      {
         if (response.status_code() == status_codes::OK)
         {
            return response.extract_json();
         }
         return pplx::task_from_result(json::value());
      })
      .then([](pplx::task<json::value> previousTask)
      {
         try
         {
            display_json(previousTask.get(), L"R: ");
         }
         catch (http_exception const & e)
         {
            wcout << e.what() << endl;
         }
      })
      .wait();
}

int main()
{
   http_client client(U("https://localhost:5276/Command"));

   auto getvalue = json::value::object();
   getvalue[L"First"] = json::value::string(L"First Value");
   getvalue[L"Second"] = json::value::string(L"Second Value");
   getvalue[L"Third"] = json::value::number(3);

   wcout << L"\nPOST (get some values)\n";
   display_json(getvalue, L"S: ");
   make_request(client, methods::POST, getvalue);

   return 0;
}

На момент написания этой статьи я взял образец кода из Блог Мариуса Банкила.

Я использовал cpprestsdk в качестве пакета nuget от Visual Studio. Текущая версия пакета 2.10.12.1.


person Ganesh Kamath - 'Code Frenzy'    schedule 12.11.2019    source источник


Ответы (1)


Чтобы исправить это, я изменил строку создания клиентского объекта с

http_client client(U("https://localhost:5276/Command"));

to

http_client_config config;
config.set_validate_certificates(false);
http_client client(U("https://localhost:5276/Command"), config);
person Ganesh Kamath - 'Code Frenzy'    schedule 12.11.2019
comment
Интересный подход. Честно говоря, я сомневаюсь в здравом уме преднамеренно не проверять доверие ни к узлу (доверие ЦС), ни к хосту (проверка DN и/или SAN) для чего-то вроде REST API, если только оно не находится точно в том состоянии, в котором вы находитесь: локальная служба где вы эффективно используете REST в качестве механизма RPC. Так что... покупатель, будьте осторожны. - person WhozCraig; 12.11.2019