SSIS SecurityNegotiationException: не удалось установить безопасный канал для SSL / TLS (нет сертификата)

#c# #ssis

#c# #ssis

Вопрос:

Я интегрируюсь с веб-сервисом через SSIS. Я продолжаю получать сообщение об ошибке, которое, по-видимому, связано с невозможностью установить связь с сертификатом.

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

Службе не требуется сертификат, так что это SSIS? Я новичок в службах SSIS, поэтому это может быть основной проблемой.

Исключение:

 System.ServiceModel.Security.SecurityNegotiationException: Could not establish secure channel for SSL/TLS with authority 'myurl'. ---> 
 

System.Net.WebException: запрос был прерван: не удалось создать безопасный канал SSL / TLS

Код ниже:

     var wsBinding = new WSHttpBinding(SecurityMode.Transport);
    wsBinding.Name = "wsHttpBinding_GlobalCredentials";
    wsBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;

    
    System.Net.ServicePointManager.ServerCertificateValidationCallback  = delegate { return true; };

    EndpointAddress endpointAddress = new EndpointAddress("https://myurl/myservice.svc/Soap12_NoAuth");


    using (GlobalCredentialsClient globalCredentialsClient = new GlobalCredentialsClient(wsBinding, endpointAddress))
    {
        try
        {
            globalCredentialsClient.ChannelFactory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication();                    
            globalCredentialsClient.ChannelFactory.Credentials.ServiceCertificate.SslCertificateAuthentication.CertificateValidationMode = X509CertificateValidationMode.None;

            
            GlobalAccount checkCredentialsResult = globalCredentialsClient.CheckCredentials(username, password);

            MessageBox.Show("Result: "   checkCredentialsResult.OrgID.ToString());

            Dts.Variables["sOrgName"].Value = checkCredentialsResult.Created;

            globalCredentialsClient.Close();
        }
        catch (CommunicationException ce)
        {
            MessageBox.Show("Comms exc "   ce.ToString());
            globalCredentialsClient.Abort();

        }
    }
 

Ответ №1:

Просто догадка, это может быть несоответствие между версиями TLS. Что .NET — это приложение, которое выходит из строя?

Вы можете попробовать установить версию TLS прямо перед вызовом API.

 System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12
 

или

 System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11
 

Комментарии:

1. Не используйте TLS11, он отключен и не будет работать.

2. @jdweng я полностью согласен. Хотя иногда вам необходимо поддерживать устаревшие системы

3. Пять лет назад отрасль решила исключить TLS 1.0 / 1.1, потому что хакеры смогли расшифровать сообщения. Наконец, в июне этого года Microsoft выпустила обновление для системы безопасности на сервере, на котором отключен протокол TLS 1.0 / 1.1. Поскольку обновление для системы безопасности было запущено, все были вынуждены обновиться до 1.2 / 1.3, если они этого не делали за последние 5 лет. Очень маловероятно, что кто-либо все еще использует TLS 1.0 / 1.1. Выход из TLS 1.1 может привести к возникновению исключений при сбое.