gpt4 book ai didi

wcf - 带有证书的程序化WCF消息安全性

转载 作者:行者123 更新时间:2023-12-04 06:47:18 25 4
gpt4 key购买 nike

我已经使用WSHttpBindings编写了一个自托管的WCF服务,并且正在尝试使用自己生成的证书来实现消息级安全性。不幸的是,我收到了一个隐藏的异常(通过Service Trace Viewer),指出“无法识别提供给程序包的凭据”。

几个注意事项:

  • 这必须用代码完成,而不是
    在配置
  • (服务器/客户端)证书是证书
    在本地机器商店中
    与我的可访问私钥
    用户在调试时。
  • 我已经用这个搜索了 hell ,
    找到了很好的设置资源
    基于WCF消息的安全性here

  • 我不确定我缺少什么。除了创建端点标识之外,大多数这些内容似乎都是直截了当的。无论我使用DnsEndpointIdentities,基于证书的身份还是根本不使用任何身份,都会失败,并显示相同的消息。

    谁能指出我正确的方向?

    服务器端:
    var binding = new WSHttpBinding
    {
    Security =
    {
    Mode = SecurityMode.Message,
    Message =
    {
    ClientCredentialType = MessageCredentialType.Certificate,
    AlgorithmSuite = SecurityAlgorithmSuite.Basic256Sha256Rsa15
    }
    }
    };

    _host = new ServiceHost(this)
    {
    Credentials =
    {
    ServiceCertificate =
    {
    Certificate = ServiceCert
    },
    ClientCertificate =
    {
    Certificate = ClientCert,
    Authentication =
    {
    TrustedStoreLocation = StoreLocation.LocalMachine,
    RevocationMode = X509RevocationMode.NoCheck,
    CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust
    }
    }
    }
    };
    var address = new Uri(string.Format(@"http://serviceaddress"));
    var ep = _host.AddServiceEndpoint(typeof (IService), binding, address);
    ep.Address = new EndpointAddress(address, EndpointIdentity.CreateX509CertificateIdentity(ServiceCert));
    _host.Open();

    客户端:
    var binding = new WSHttpBinding
    {
    Security =
    {
    Mode = SecurityMode.Message,
    Message =
    {
    ClientCredentialType = MessageCredentialType.Certificate,
    AlgorithmSuite = SecurityAlgorithmSuite.Basic256Sha256Rsa15
    }
    }
    };
    var address = new Uri(@"http://serviceaddress");
    var endpoint = new EndpointAddress(address, EndpointIdentity.CreateX509CertificateIdentity(ServerCert));
    var channelFactory = new ChannelFactory<IService>(binding, endpoint)
    {
    Credentials =
    {
    ServiceCertificate =
    {
    DefaultCertificate = ServerCert,
    Authentication =
    {
    RevocationMode = X509RevocationMode.NoCheck,
    TrustedStoreLocation = StoreLocation.LocalMachine,
    CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust
    }
    },
    ClientCertificate =
    {
    Certificate = ClientCert
    }
    }
    };
    var channel = channelFactory.CreateChannel();

    最佳答案

    this msdn article提供了极大的帮助。我认为问题的根源在于将以下消息安全性参数设置为false:

    httpBinding.Security.Message.NegotiateServiceCredential = false;
    httpBinding.Security.Message.EstablishSecurityContext = false;

    因此,现在服务器端的整体代码看起来更像:
    var httpBinding = new WSHttpBinding(SecurityMode.Message);
    httpBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    httpBinding.Security.Message.NegotiateServiceCredential = false;
    httpBinding.Security.Message.EstablishSecurityContext = false;
    var httpUri = new Uri("http://serviceaddress");
    _host = new ServiceHost(this, httpUri);
    _host.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.TrustedPeople, X509FindType.FindByThumbprint, serverThumbprint);
    _host.Credentials.ClientCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
    _host.Credentials.ClientCertificate.Authentication.TrustedStoreLocation = StoreLocation.LocalMachine;
    _host.AddServiceEndpoint(typeof(IMetaService), httpBinding, httpUri);
    _host.Open();

    和客户端:
    var httpBinding = new WSHttpBinding(SecurityMode.Message);
    httpBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    httpBinding.Security.Message.NegotiateServiceCredential = false;
    httpBinding.Security.Message.EstablishSecurityContext = false;
    var httpUri = new Uri("http://serviceaddress");
    var httpEndpoint = new EndpointAddress(httpUri, EndpointIdentity.CreateDnsIdentity("name of server cert"));
    var newFactory = new ChannelFactory<IMetaService>(httpBinding, httpEndpoint);
    newFactory.Credentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.TrustedPeople, X509FindType.FindByThumbprint, "client certificate thumbprint");
    newFactory.Credentials.ServiceCertificate.SetDefaultCertificate(StoreLocation.LocalMachine, StoreName.TrustedPeople, X509FindType.FindByThumbprint, "server certificate thumbprint");
    var channel = newFactory.CreateChannel();

    关于wcf - 带有证书的程序化WCF消息安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6039282/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com