Удаленный сертификат недействителен в соответствии с процедурой проверки - PullRequest
8 голосов
/ 11 августа 2010

Я разрабатываю службу WCF (NetTcpBinding), и она прекрасно работает без безопасности.Мы купили сертификат у DigiCert, установили его на сервер и настроили с помощью DigicertUtil.exe.Также установлен на тестовых клиентских машинах.

Включение защиты Я могу без проблем подключиться к нему с моего ПК разработчика.

Конфигурация сервера:

   binding.Security.Mode = SecurityMode.Transport;
   binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
   binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign;
   ServerHost.Credentials.ServiceCertificate.SetCertificate(
              StoreLocation.LocalMachine,
              StoreName.My,
              X509FindType.FindBySubjectName,
              Properties.Settings.Default.CertificateName);

Конфигурация клиента:

 <binding name="EndPointTCP" closeTimeout="00:01:00" openTimeout="00:01:00"
              receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
              hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="1610612736"
              maxReceivedMessageSize="1610612736">
              <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
                maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
              <reliableSession ordered="false" inactivityTimeout="00:10:00" enabled="false" />
              <security mode="Transport">
                <transport clientCredentialType="Certificate"  protectionLevel="EncryptAndSign"/>
              </security>
            </binding>

    <behaviors>
          <endpointBehaviors>
            <behavior name="behavior_ServerService">
              <clientCredentials>
                <clientCertificate findValue="*.domain.com"
                          storeLocation="LocalMachine"
                          storeName="My"
                          x509FindType="FindBySubjectName" />
              </clientCredentials>
            </behavior>
          </endpointBehaviors>
        </behaviors>

<client>
  <endpoint address="net.tcp://clients.domain.com:10001/Server/ServerService"
    binding="netTcpBinding" bindingConfiguration="EndPointTCP" contract="ServerServiceReference.IServerWS"
    name="EndPointTCP" behaviorConfiguration="behavior_ServerService">
    <identity>
      <dns value="*.domain.com" />
    </identity>
  </endpoint>
</client>  

(я изменил домен и имя службы, чтобы сохранить конфиденциальность клиента.)

При попытке с других компьютеров я получаю следующую ошибку на клиентах:

Соединение с сокетом было прервано.Это может быть вызвано ошибкой обработки вашего сообщения или превышением тайм-аута приема удаленным хостом, или проблемой основного сетевого ресурса.Тайм-аут локального сокета был '00: 00: 59.9840000 '.

Существующее соединение было принудительно закрыто удаленным хостом

Журнал трассировки на сервере гласит:

Удаленный сертификат недействителен в соответствии сПроцедура проверки.

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

Сообщение об ошибке остается тем же, даже если я установил

ServerHost.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;

на сервере и

ServiceClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;

на клиенте.

Может кто-нибудь сказать мне, как это сделать правильно?Конечно, я не хочу использовать обходные пути, такие как обратный вызов валидации, возвращающий всегда true или вышеупомянутый неподтвержденный режим.

Любая помощь будет оценена.Только эта «маленькая» проблема должна быть решена, чтобы иметь возможность выпустить ... :(

Заранее большое спасибо!

Hudgi

1 Ответ

10 голосов
/ 11 августа 2010

Похоже, что вы пытаетесь использовать тот же сертификат, что и сертификат сервера, и сертификат клиента, и что ваши клиенты не имеют того же имени хоста, которому был выдан сертификат. Даже если вы установите X509CertificateValidationMode.None, имена хостов должны совпадать. Если ваша машина разработки будет такой же, как сервер, она наверняка будет успешной.

Вы намеренно пытаетесь заставить клиентов проходить проверку подлинности на сервере по протоколу SSL или просто пытаетесь установить доверие своих клиентов к центру сертификации?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...