Весь мой код — .Net 4.0.
У меня есть служба wcf, использующая аутентификацию по сертификату + имени пользователя/паролю. В своей службе я использовал самозаверяющий сертификат, поэтому открытый ключ, загруженный клиенту, должен перейти в хранилище Trusted People
. Я знаю об этом.
Я использую фабрику каналов, чтобы открыть соединение. Мой код выглядит так:
public static ChannelFactory<T> CreateMyServiceClientChannel<T>(string serviceUrl, string serviceUsername, string servicePassword)
{
NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.Message;
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign;
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
X509Store store = new X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 clientCertificate = store.Certificates.OfType<X509Certificate2>().FirstOrDefault(cert => cert.Subject == "CN=MyServicesCert");
store.Close();
// Instantiate the EndPointAddress using the Service URL, endpoint identity
Uri baseAddress = new Uri(serviceUrl);
EndpointIdentity epi = EndpointIdentity.CreateX509CertificateIdentity(clientCertificate);
EndpointAddress endpoint = new EndpointAddress(baseAddress, epi);
// Create the Channel Factory instance using binding and end point variables.
ChannelFactory<T> channelFactory = new ChannelFactory<T>(binding, endpoint);
// set credentials
channelFactory.Credentials.UserName.UserName = serviceUsername;
channelFactory.Credentials.UserName.Password = servicePassword;
channelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
// Return the channel factory
return channelFactory;
}
Вопрос здесь заключается во втором предпоследнем утверждении:
channelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
На моем компьютере с Windows 7 мне не нужно его включать, и я могу правильно общаться со службой. Однако на машине с Windows XP, если я ее не включу, я получаю исключение
System.ServiceModel.Security.SecurityNegotiationException: согласование безопасности SOAP с «net.tcp://my-server:20800/my-service.svc» для цели «net.tcp://my-server:20800/my-service». svc не удалось. См. Внутреннее исключение для более подробной информации. ---> System.IdentityModel.Tokens.SecurityTokenValidationException: Не удалось построить цепочку сертификатов X.509 CN=MyServicesCert. Используемый сертификат имеет цепочку доверия, которую невозможно проверить. Замените сертификат или измените certificateValidationMode. Цепочка сертификатов обработана, но завершена корневым сертификатом, которому не доверяет поставщик доверия.
Итак, похоже, что .net ведет себя по-разному между Windows 7 и XP, как это?
PeerTrust
? - person Jay   schedule 07.08.2013trusted people
, как использует мой код. - person hardywang   schedule 07.08.2013