也许标题有点令人困惑,但我试着解释我的问题。
我的软件通过WCF向我的服务器发送一些信息。使用TransportWithMessageCredential保护传输,并使用ClientCredentialType的证书。证书是一个.pfx文件,它作为资源嵌入到项目中。
直到现在我直接使用嵌入式证书加载X509Certificate2:
X509Certificate2 certificate = new X509Certificate2(Resources.ClientCertificate);
一切正常。但现在客户有一个问题,即证书无法加载。我发现,当我从上面调用构造函数时,.NET会在"%APPDATA%\ Microsoft \ Crypto \ Keys"下创建一个私钥文件。 客户使用终端服务器,用户没有用户配置文件。
现在我的主要问题是:
有没有办法在不创建私钥文件的情况下加载证书?我知道我可以使用X509KeyStorageFlags将位置更改为机器密钥集。但这不是一种选择,因为用户无权访问此位置。
到目前为止我做了什么:
我使用
将私钥导出为XMLFile.WriteAllText(keyFile, certificate.PrivateKey.ToXmlString(true));
在客户端我创建了一个没有私钥的X509Certificate2并从XML导入了私钥
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(File.ReadAllText(keyFile));
certificate.PrivateKey = provider;
一切正常但当我尝试联系WCF服务器时出现错误"密钥不存在。"
有人知道我的问题的解决方案吗?