Вызов HTTPS с использованием RestSharp в функции Azure дает «Не удалось установить соединение SSL» - PullRequest
0 голосов
/ 16 апреля 2019

Как я могу вызвать HTTPS-сайт из функции Azure, используя определенный сертификат для установления HTTPS-соединения?

У меня есть функция Azure, которая должна взаимодействовать с удаленным сервером с сертификатом.Удаленный сервер - это банк.

При установке сертификата и локальном запуске запускается эмулятор функций Azure и выполняется соединение.

При загрузке в Azure я получаю это сообщение

The SSL connection could not be established, see inner exception. Authentication failed, see inner exception. 

Я попытался включить сертификат в SLL функции Azure. Я установил все сертификаты в цепочке сертификатов в виде общедоступных сертификатов (.cer) изакрытый сертификат (.pfx)

Попытка получить сертификат с отпечатком не удалась.

X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
try
    {
        store.Open(OpenFlags.ReadOnly);
        X509Certificate2Collection certificates = store.Certificates;

        foreach (var certificate2 in certificates)
        {
            if (certificate2.Thumbprint.ToLower() == thumbprint.ToLower())
            {
                return certificate2;
            }
        }
     }

В этом случае я пытаюсь использовать цикл вместо того, чтобы искать сертификат с помощью встроенной функции, чтобы найти Cert с помощьюОтпечаток

Когда это не сработало, я предоставил сертификат (.pfx) в виде файла.

Получение сертификата работает.

certificate = new X509Certificate2(filename, password, X509KeyStorageFlags.MachineKeySet);

X509KeyStorageFlags.MachineKeySet необходим вФункция Azure, но не при запуске локального эмулятора функций Azure

RestSharp работает в эмуляторе функций Azure

var client = new RestClient(BaseUrl)
{
    Timeout = 180000,
    ClientCertificates = new X509CertificateCollection() { cert }

};
client.AddDefaultHeader("Content-type", "application/json");
var request = new RestRequest(Query, Method.POST);
request.Parameters.Clear();
request.AddParameter("application/json", jsonSwish, ParameterType.RequestBody);
IRestResponse response = await client.ExecuteTaskAsync(request);

Я получаю сообщение «Не удалось установить соединение SSL ...»

Я добавил это до создания Клиента, но это не решило проблему

ServicePointManager.Expect100Continue = true;
ServicePointManager.DefaultConnectionLimit = 9999;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Затем я создал простой PHP с HTTPна входе и создает выход HTTPS с CURL и необходимым сертификатом в качестве параметров для CURL.Это работает, но это уродливое решение.

Как я могу вызвать HTTPS-сайт из функции Azure, используя специальный сертификат для установления HTTPS-соединения?

1 Ответ

0 голосов
/ 16 апреля 2019

Из описания есть код в веб-приложении, который отправляет HTTPS-запрос бэкэнд-службе, использующей сертификат, которому доверяют только в вашей сети.Поскольку сервер веб-приложений не имеет доверенного корневого сертификата, происходит сбой с ошибкой «не доверенный».Если я неправильно понимаю конфигурацию, пожалуйста, дайте мне знать.

Однако приведенная ниже информация основана на этом конкретном предположении.

К сожалению, невозможно импортировать сертификат в доверенное корневое хранилище в Azure Web Apps из-за проблем безопасности.Единственный способ обойти эту ошибку - обработать проверку в коде приложения, аналогичную описанной здесь: https://stackoverflow.com/a/34204814. В прошлом мы успешно использовали эти шаги, например:

  1. Создайте новый сертификат для получения файла PFX для загрузки.
  2. Загрузка PFX в службу приложений в области SSL-сертификатов
  3. Выполните шаги 1 и 2 по этой ссылке для загрузки сертификата: https://azure.microsoft.com/en-us/blog/using-certificates-in-azure-websites-applications/
  4. Добавьте комбинацию изкод в шаге 3 по приведенной выше ссылке и код здесь: Веб-приложение Azure, вызывающее предварительную службу с самоподписанным сертификатом SSL .По сути, получите сертификат из хранилища сертификатов, но из функции ServerCertificateValidationCallback, а затем верните true, если сертификаты соответствуют для проверки.Код выглядит примерно так:

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) =>
            {
                if (sslPolicyErrors == SslPolicyErrors.None)
                {
                    return true;
                }
 
                var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
                certStore.Open(OpenFlags.ReadOnly);
                var certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, "THUMBPRINT", false);
 
                if (certCollection.Count > 0)
                {
                    var validCertificate = certCollection[0];
                    var passedCert = new X509Certificate2(certificate);
                    certStore.Close();
 
                    return validCertificate.Equals(passedCert);
                }
                certStore.Close();
                return false;
            };
 
...