2015-12-17 2 views
0

Я получаю исключение при попытке подключиться к серверу SOAP 1.1. Я получил WSDL из другой организации и использовал .net, чтобы привести это в свой проект в качестве справочника службы.Неверная ошибка удаленного сертификата До ServerCertificateValidationCallback называется

Необходимо, чтобы мы использовали приложение MTOM и HTTP gzip compression. Он также требует безопасности веб-служб (WS-Security) версии 1.0 (с использованием стандарта OASIS) для обеспечения сквозной безопасности с использованием инфраструктуры проверки подлинности X.509.

Я работаю в C# с рамкой 4.5.2 .Net.

Вот соответствующие разделы моего app.config с потенциально чувствительной информации отредактирован:

<basicHttpBinding> 
    <binding name="customHttpBinding" allowCookies="true" messageEncoding="Mtom"> 
     <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="Certificate" /> 
     <message clientCredentialType="Certificate" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 

[snip] 

<client> 
    <endpoint address="YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" 
    binding="basicHttpBinding" bindingConfiguration="customHttpBinding" 
    contract="SERVICENAME.BulkRequestTransmitterPortType" 
    name="BulkRequestTransmitterPort"> 
    <identity> 
     <certificateReference storeLocation="CurrentUser" x509FindType="FindBySerialNumber" 
     findValue="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" /> 
    </identity> 
    </endpoint> 
</client> 

хз это серийный номер моего ключа (подтверждено, что в магазине моего компьютера) и Y является конечная точка

Вот раздел, в котором я создаю и вызвать службу (хз тот же сертификат):

var transmitter = new BulkRequestTransmitterPortTypeClient(); 

    transmitter.ClientCredentials?.ClientCertificate.SetCertificate(
     StoreLocation.CurrentUser, 
     StoreName.My, 
     X509FindType.FindBySerialNumber, 
     "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); 

    var response = transmitter.BulkRequestTransmitter(
     securityHeader, 
     security, 
     ref businessHeader, 
     transmitterManifestReqDtl, 
     transmitterType); 

дует на этой последней строке со следующей ошибкой:

ex {"Could not establish trust relationship for the SSL/TLS secure channel with authority 'YYYYYYYYYYYY'."} System.Exception {System.ServiceModel.Security.SecurityNegotiationException} 
    +InnerException {"The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel."} System.Exception {System.Net.WebException} 
     +InnerException {"The remote certificate is invalid according to the validation procedure."} System.Exception {System.Security.Authentication.AuthenticationException} 

Всякий раз, когда я делаю поиск я нашел два предложения, первый должен был убедиться, что сертификат сервера в моем хранилище доверенных и авторитет третьей стороны доверяли. Я проверил, что оба находятся в моем локальном компьютере и доверяют. Второе и наиболее распространенное предложение было переопределить ServicePointManager.ServerCertificateValidationCallback с возвращением истинным, как это:

ServicePointManager.ServerCertificateValidationCallback = delegate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
    return true; 
}; 

Как решается, как я должен был попробовать это (я не люблю использовать плохие методы даже в средах разработки) Я полагал, что использование в отладке будет стоить того. К сожалению, точка останова никогда не попадает. Я получаю ошибку до ServerCertificateValidationCallback срабатывает.

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

ответ

0

Это связано с тем, что сервер не использует сертификаты. Если вы сообщите .net, чтобы ожидать от сервера, он не с этим сообщением об ошибке, прежде чем перейти к ServerCertificateValidationCallback.

0

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

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

ServicePointManager.ServerCertificateValidationCallback = delegate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
    return true; 
}; 

и установить точку останова на вызов делегата. При запуске используйте свой отладчик для проверки параметра chain. Существует свойство ChainElements, которое содержит коллекцию объектов X509ChainElement. Каждый объект связан с определенным сертификатом в цепочке и статусе каждого сертификата в цепочке и статусе сертификата (через ChainElementStatus). Обратите внимание, что статусы элементов цепи являются кумулятивными, это означает, что ошибки распространяются вниз от самого верхнего сертификата. Другими словами, член ChainElementStatus будет содержать ошибки, связанные с конкретным ChainElement плюс комбинированные ошибки с верхних уровней.

Как только проблема будет идентифицирована и разрешена, удалите этот делегат.

Другой вариант состоит в передаче удаленного сервера файл сертификата (только открытый сертификат) на CertUtil:

certutil -verify -urlfetch path\remoteserver.cer 

Выход может быть немного сложным, но это обеспечит дополнительную информацию, которую вы не получите с Отладка X509Chain. Наиболее распространенная проблема (после ненадежного корня) - RevocationOffline, и certutil покажет данные проверки отзыва, включая доступность и достоверность URL-адресов.

+0

Я обязательно попробую использовать certutil, и я ценю ваше предложение. Тем не менее, я хочу указать, что я прямо сказал, что я получаю эту ошибку *** до того, как *** ServerCertificateValidationCallback отключится, как проверено, поставив точку останова в в return true. –

+0

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

Смежные вопросы