Самоподписанный сертификат и CertificateValidationMode только в Windows XP

Весь мой код — .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, как это?


person hardywang    schedule 06.08.2013    source источник
comment
Вы уверены, что самозаверяющий сертификат находится в доверенных сертификатах на машине с Win XP?   -  person gtrig    schedule 07.08.2013
comment
Что происходит, когда вы устанавливаете его на PeerTrust?   -  person Jay    schedule 07.08.2013
comment
Попробуйте [это предложение] [1]: установите revocationMode=NoCheck. [1]: stackoverflow.com/questions/4256520/   -  person Yaron Naveh    schedule 07.08.2013
comment
@Jay PeerTrust тоже работает.   -  person hardywang    schedule 07.08.2013
comment
@gtrig открытый ключ находится в trusted people, как использует мой код.   -  person hardywang    schedule 07.08.2013