Наш главный сервер обращается к мыльной веб-службе через https на нескольких разных серверах, чтобы подтвердить, что транзакция завершена.
Код - dotnet 3.5 (vb), он работает для различных сервисов обратного вызова, которые мы настроили, пока мы только не перевели новую в производство, и она отказывается общаться, выдавая следующую ошибку:
Unhandled Exception: System.ServiceModel.Security.SecurityNegotiationException:
Could not establish secure channel for SSL/TLS with authority 'www.xyzzy.com'.
---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
Соответствующий фрагмент кода выглядит так:
Dim epAddr As New System.ServiceModel.EndpointAddress(sys.CallbackAddress)
Dim bind As New System.ServiceModel.BasicHttpBinding(ServiceModel.BasicHttpSecurityMode.Transport)
_svc = New CallbackSvc.XyzzyCallbackSoapClient(bind, epAddr)
С моего личного ноутбука (WinXP) я могу запустить код, и он без проблем подключается к новому серверу.
На главном сервере (который вызывает все службы обратного вызова) (Windows Server Enterprise Service Pack 1) код всегда приводит к вышеупомянутой ошибке SSL.
После поиска проблемы я попытался добавить следующую строку (конечно, не подходит для производства, но я хотел проверить):
System.Net.ServicePointManager.ServerCertificateValidationCallback = Function(se As Object, cert As System.Security.Cryptography.X509Certificates.X509Certificate, chain As System.Security.Cryptography.X509Certificates.X509Chain, sslerror As System.Net.Security.SslPolicyErrors) True
Результат был таким же. Ошибка SSL все еще произошла.
В других местах предполагается, что корневой сертификат не был правильно установлен на вызывающем компьютере, но как новый сервер, так и старые серверы обратного вызова используют сертификаты, выпущенные Go Daddy, поэтому я не думаю, что это так.