Не удается получить доступ к зашифрованному SSL-ресурсу через библиотеку ComVisible - PullRequest
0 голосов
/ 17 января 2019

Я использовал C # для создания DLL, которая использует WebRequest для доступа к WebService. Эта DLL объявлена ​​как ComVisible, поэтому я могу использовать ее с Delphi. Если WebRequest работает в незашифрованном виде, все работает нормально. Но когда я использую https в качестве протокола, я получаю следующее сообщение об ошибке:

Базовое соединение было закрыто: при отправке произошла непредвиденная ошибка.
Невозможно прочитать данные из транспортного соединения: Eine vorhandene Verbindung wurde vom Remotehost geschlossen.

Но та же DLL работает, когда я использую ее из приложения .NET.

Я создал минимальный пример проекта, чтобы проверить, можно ли воспроизвести ошибку, и у меня возникла та же проблема.

Вот код с веб-запросом

[Guid("D0AAE68A-D2C0-4015-8DE6-471879267418"), ClassInterface(ClassInterfaceType.AutoDual), ProgId("WebRequestTest")]
[ComVisible(true)]
public class ComClient
{
    public bool Authenticate(string customer)
    {
        var request = WebRequest.Create(@"https://server.azurewebsites.net/api/authenticate?apikey=xxxx&customer=" + customer);
        request.Method = "GET";
        try
        {
            using (var response = (HttpWebResponse)request.GetResponse())
            {
                using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
                {
                    string responseString = streamReader.ReadToEnd();
                    Trace.WriteLine(responseString);
                    return true;
                }
            }
        }
        catch (Exception exc)
        {
            Trace.WriteLine(exc);
            return false;
        }
    }
}

В Delphi код также маленький и простой

procedure TForm1.btnTestClick(Sender: TObject);
var
  client: TComClient;
begin
  client := TComClient.Create(self);
  if client.Authenticate('xxxxxxxx') then
    Application.MessageBox('Ok', '', MB_OK + MB_ICONINFORMATION)
  else
    Application.MessageBox('Error', '', MB_OK + MB_ICONINFORMATION);

  client.Free;
  client := nil;
end;

Чтобы проверить это на чистом .NET, я создал небольшой модульный тест, который работает без ошибок.

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        ComClient client = new ComClient();
        bool result = client.Authenticate("xxxxxxxx");
        Assert.IsTrue(result);
    }
}

Мне кажется, что .NET Framework не полностью инициализируется при использовании сборки .NET из COM-приложения. Как уже упоминалось, вызов работает нормально, если я переключаюсь на http вместо https.

1 Ответ

0 голосов
/ 18 января 2019

Я нашел решение через комментарий Тав. Пока ServicePointManager.SecurityProtocol содержит протоколы TLS | TLS11 | TLS12 для приложений .NET, только протоколы SSL3 и TLS назначаются как приложения COM. Поскольку Azure AppServices по умолчанию настроены таким образом, что минимальная версия TLS составляет 1,2, необходимо либо соответствующим образом перенастроить AppService, либо явно добавить TLS1.2 в сборку COM.

ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
...