0

私のコードはすべて.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;
    }

ここでの質問は、最後から 2 番目のステートメントです。

channelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 

私の Windows 7 マシンでは、これを含める必要はなく、サービスと適切に通信できます。ただし、Windows XP マシンでは、含めないと例外が発生します。

System.ServiceModel.Security.SecurityNegotiationException: ターゲット「net.tcp://my-server:20800/my-service」の「net.tcp://my-server:20800/my-service.svc」との SOAP セキュリティ ネゴシエーションサービス」が失敗しました。詳細については、内部例外を参照してください。---> System.IdentityModel.Tokens.SecurityTokenValidationException: X.509 証明書 CN=MyServicesCert チェーンの構築に失敗しました。使用された証明書には、検証できない信頼チェーンがあります。証明書を置き換えるか、certificateValidationMode を変更してください。証明書チェーンが処理されましたが、信頼プロバイダーによって信頼されていないルート証明書で終了しました。

Windows 7 と XP では .net の動作が異なるように見えますが、それはどうしてですか?

4

0 に答える 0