Я интегрируюсь с веб-сервисом через 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();
}
}
Просто подозрение, что это может быть несоответствие между версиями TLS. Какое приложение .NET дает сбой?
Вы можете попробовать установить версию TLS прямо перед вызовом API.
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12
или
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11
@jdweng Я полностью согласен. Хотя иногда вам нужно поддерживать устаревшие системы
Пять лет назад индустрия решила отказаться от TLS 1.0/1.1, потому что хакеры смогли расшифровать сообщения. Наконец, в июне этого года Microsoft выпустила обновление безопасности на сервере, отключившем TLS 1.0/1.1. Поскольку обновление безопасности было выпущено, все были вынуждены обновиться до 1.2/1.3, если они не сделали этого за последние 5 лет. Маловероятно, что кто-то все еще использует TLS 1.0/1.1. Выход из TLS 1.1 может привести к возникновению исключений при сбое.
Не используйте TLS11, он отключен и не будет работать.