Я разрабатываю службу 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