Как исправить " сертификат сервера не настроен должным образом с HTTP.SYS " на Windows 7?



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



В данном примере используется консольное приложение, использующее .Net 4.6.1.
Основное приложение-это приложение WPF (я не использую IIS). Этот код работает без проблем на Windows 10, но когда я пытаюсь запустить его на Windows 7, он дает мне следующую ошибку:




Система.Модель обслуживания.CommunicationException: произошла ошибка при выполнении HTTP-запроса к https://nfce-homologacao.svrs.rs.gov.br/ws/NfeStatusServico/NfeStatusServico2.asmx . это может быть связано с тем, что сертификат сервера не настроен должным образом с HTTP.SYS в случае HTTPS. Это также может быть вызвано несоответствием привязки безопасности между клиентом и сервером. --- >System.Net.WebException: базовое соединение было закрыто: непредвиденная ошибка произошло на посылке. --- >System.IO.IOException: не удалось прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом. --- >System.Net.Sockets.SocketException: существующее соединение было принудительно закрыто удаленным хостом.




Это код вызова клиента:



XmlNode node = null;

var parametro = new TConsStatServ();
parametro.cUF = NFeAPI.XMLSchemas.NfeStatusServico2.Envio.TCodUfIBGE.Item53;
parametro.tpAmb = NFeAPI.XMLSchemas.NfeStatusServico2.Envio.TAmb.Item2;
parametro.versao = "3.10";
parametro.xServ = TConsStatServXServ.STATUS;

var certificate = GetCertificateByName("Certificate Name", false);

string nFeNamespaceName = "http://www.portalfiscal.inf.br/nfe";
string parametroXML = XmlUtil.Serialize(parametro, nFeNamespaceName);

XmlDocument doc = new XmlDocument();
XmlReader reader = XmlReader.Create(new StringReader(parametroXML));
reader.MoveToContent();

node = doc.ReadNode(reader);

nfeCabecMsg soapHeader = new nfeCabecMsg();
soapHeader.cUF = parametro.cUF.ToString().Replace("Item", "");
soapHeader.versaoDados = "3.10";

var soapClient = new NfeStatusServico2SoapClient("NfeStatusServico2Soap");
soapClient.ClientCredentials.ClientCertificate.Certificate = certificate;

XmlNode result = soapClient.nfeStatusServicoNF2(ref soapHeader, node);


Вот мое приложение.конфигурация:



<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="NfeStatusServico2Soap">
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
<binding name="NfeStatusServico2Soap1" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://nfce-homologacao.svrs.rs.gov.br/ws/NfeStatusServico/NfeStatusServico2.asmx"
binding="basicHttpBinding" bindingConfiguration="NfeStatusServico2Soap"
contract="NfeStatusServico2.NfeStatusServico2Soap" name="NfeStatusServico2Soap" />
</client>
</system.serviceModel>


GetCertificateByName-это вспомогательный метод, который я создал, чтобы вернуть x509certificate2, необходимый службе.



У меня есть уже пробовал отключить Брандмауэр Windows 7, и я пошел в программы и функции - > включить или выключить функции Windows и включил узел .net 3 framework для вызовов wcf.



Я также пытался использовать WebReference с приложением .NET 2.0, и это дало ту же ошибку. Я обновил код для использования wcf в .net 4.6.1 в надежде, что он будет работать.



Я попытался использовать fiddler для отслеживания проблемы, и он возвращает код 200, но не очень помогает с этим.



Прошло уже 5 дней, а я не могу. сумейте обойти эту проблему. Из-за этого я собираюсь отказаться от поддержки Windows 7 в своем приложении.
1191   2  

2 ответов:

В моем случае активация центра обновления Windows и установка всехважных обновлений исправили проблему.

После некоторых исследований по HTTP.SYS я нашел веб-сайт Microsoft, говорящий, что HTTP.У SYS были некоторые "известные проблемы", и я подумал, что это могло быть исправлено в некотором обновлении. На мое счастье, так оно и было.

В моем случае проблема заключалась в том, что мой проект все еще использовал .Net Framework 4.0, который не поддерживает TLS 1.1 или 1.2, а служба, к которой я подключался, отключила поддержку TLS 1.0 с 1 января 2018 года. После того, как я обновил проект до .Net Framework 4.5 и принудил TLS 1.2, все работало нормально.

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

Comments

    Ничего не найдено.