Почему мой самозаверяющий сертификат не работает? - PullRequest
0 голосов
/ 18 ноября 2011

Как странно.Много месяцев назад я написал службу WCF, которую я тестировал на своей локальной машине через безопасное соединение Net.Tcp с использованием самозаверяющего сертификата;все работало нормально.Затем я развернул на облачном сервере, используя настоящий сертификат SSL, и все по-прежнему работает нормально.

Но теперь мне нужно снова отладить некоторый код в моем локальном ящике, и что-то изменилось, так что мое локальное соединение WCF больше не работает!(И нет, срок действия сертификата не истек!) Примерно через 2 минуты я получаю EndpointNotFoundException:

Could not connect to net.tcp://mypc:8000/. The connection attempt lasted for a 
time span of 00:02:06.5152363. TCP error code 10060: A connection attempt failed 
because the connected party did not properly respond after a period of time, or 
established connection failed because connected host has failed to respond 
192.168.241.1:8000

Вот код, который создает соединение на стороне клиента:

protected override IWebService CreateChannel() {
  var baseAddress = CommunicationManager.DebugMode ? SharedConstants.WEB_SERVER_TEST_URL : SharedConstants.WEB_SERVER_LIVE_URL;
  var factory = new DuplexChannelFactory<IWebService>(new InstanceContext(SiteServer.Instance));
  factory.Endpoint.Address = new EndpointAddress("net.tcp://{0}:{1}/".Fmt(baseAddress, SharedConstants.PORT_WEB_SERVICE));
  var binding = new NetTcpBinding(SecurityMode.Message);
  binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
  binding.SendTimeout = TimeSpan.FromMinutes(10);
  factory.Endpoint.Binding = binding;
  // to get past a strange error, do this:
  // (see http://geekswithblogs.net/RandyMichak/archive/2009/03/04/programattically-setting-the-maxitemsinobjectgraph-property-in-client.aspx)
  foreach (var op in factory.Endpoint.Contract.Operations) {
    var dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>();
    dataContractBehavior.NullOr(b => b.MaxItemsInObjectGraph = 2147483647);
  }

  var cred = SiteServer.GetCredentials();
  if (cred != null) {
    var u = factory.Credentials.UserName;
    u.UserName = cred.CustomerID.ToString();
    u.Password = cred.Password;
  }
  return factory.CreateChannel();
}

и вот конфиг серверной части:

<service name="MyProgram.WebService.WebService" behaviorConfiguration="mex">
  <endpoint address="net.tcp://localhost:8000" binding="netTcpBinding" contract="MyProgram.IWebService" bindingConfiguration="SecureBinding" name="MyEndPoint"></endpoint>
  <endpoint address="mex" binding="mexTcpBinding" name="MEX" contract="IMetadataExchange"/>
  <host>
    <baseAddresses>
      <add baseAddress="net.tcp://localhost:8000"/>
    </baseAddresses>
  </host>
</service>
...
<netTcpBinding>
  <binding name="SecureBinding" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647" portSharingEnabled="false" 
             maxBufferSize="2147483647" >
    <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
    <security mode="Message">
      <message clientCredentialType="UserName"/>
    </security>
  </binding>
</netTcpBinding>

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

Вы пытались принять все сертификаты в режиме отладки, например:

#if DEBUG

ServicePointManager.ServerCertificateValidationCallback = 
    new RemoteCertificateValidationCallback(delegate{ return true; });

#endif
1 голос
/ 18 ноября 2011

Doh!

Я обновил антивирус / брандмауэр со времени последней сессии отладки, и новый брандмауэр блокировал меня!Просто открыл порт, и все работает нормально.Как неловко ...: -o

...