Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WCF与客户端证书的通信_C#_.net_Wcf_Security_Ssl - Fatal编程技术网

C#WCF与客户端证书的通信

C#WCF与客户端证书的通信,c#,.net,wcf,security,ssl,C#,.net,Wcf,Security,Ssl,我正在开发非常简单的桌面(WinForms)应用程序,它通过HTTPS协议上的WCF服务与服务器通信。 使用此应用程序的每个客户端都可以上载客户端证书(每个客户端都是唯一的),用于通信 我正努力实现的目标: 1.用户将“上载”证书到我的桌面应用程序,应用程序获取证书并以编程方式将证书保存到windows cert store,以下是我的代码: [SecurityCritical] public CertificateInfoDto GetCertificateInfoAndImportToSto

我正在开发非常简单的桌面(WinForms)应用程序,它通过HTTPS协议上的WCF服务与服务器通信。 使用此应用程序的每个客户端都可以上载客户端证书(每个客户端都是唯一的),用于通信

我正努力实现的目标: 1.用户将“上载”证书到我的桌面应用程序,应用程序获取证书并以编程方式将证书保存到windows cert store,以下是我的代码:

[SecurityCritical]
public CertificateInfoDto GetCertificateInfoAndImportToStore(string fullPath, SecureString password)
    {
        if (string.IsNullOrEmpty(fullPath))
        {
            throw new ArgumentNullException("fullPath");
        }

        if (!File.Exists(fullPath))
        {
            throw new ArgumentException(string.Concat("No file present on ", fullPath));
        }

        try
        {
            byte[] rawBytes = this.GetCertificateContent(fullPath);
            var certificate = new X509Certificate2(rawBytes, password, X509KeyStorageFlags.Exportable);
            this.EnsureImport(certificate);
         }
   // some error handling etc, and end of method.


[SecurityCritical]
private void EnsureImport(X509Certificate2 certificate)
{
   X509Store store = null;
   try
   {
      store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
      store.Open(OpenFlags.ReadWrite);
      store.Add(certificate);
   }
在我的应用程序设置文件中,我只存储证书序列号。 2.现在,当我将证书上载到windows应用商店时,我想将其用于wcf通信,因此我的代码如下所示:

var client = new SomeWcfServiceProxy();
client.ClientCredentials.ClientCertificate.SetCertificate(
            StoreLocation.CurrentUser,
            StoreName.My,
            X509FindType.FindBySerialNumber,
            certificateSerialNumber);
最后,这是我的问题,当我尝试调用代理上的某个方法时,我会得到一个异常: System.ServiceModel.Security.SecurityNegotiationException:无法为具有权限“url(我已更改此)”的SSL/TLS建立安全通道。-->System.Net.WebException:请求被中止:无法创建SSL/TLS安全通道

但让我困惑的是,当我像这样创建代理客户端时:

var client = new SomeWcfServiceProxy();
var clientCertificate = new X509Certificate2(@"C:\U\BB\certificate.pfx", "password");
client.ClientCredentials.ClientCertificate.Certificate = clientCertificate;
一切都很有魅力! 所以我的问题是:我不想将客户端证书密码存储在任何地方,我想通过windows证书存储上传它,然后仅从windows证书存储使用它。这可能吗?或者我必须将证书密码存储在某个地方(我不知道在哪里,因为我认为它不是很安全,而且这些证书是非常机密的)。
谢谢你的帮助:)

毕竟,我需要这个:

var certificate = new X509Certificate2(rawBytes, password, X509KeyStorageFlags.UserKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

现在,证书已正确导入,可用于通信而不会出现任何问题

可能您的用户没有证书私钥的权限。在mmc控制台中检查运行进程的用户是否具有私钥的读取权限。Grzegorz看起来你救了我的命。看起来这正是我的问题!:)我会测试它,并写下它是否有效!:)