如何将另一个证书加载到我的本地证书存储区?

时间:2011-12-30 18:00:28

标签: c# wcf wcf-security wcf-client

我有一个由其他服务供应商分发的证书(.pem文件)。我从供应商处下载了证书并将其保存到我的本地驱动器。在我的WCF客户端中,我正在尝试从本地驱动器加载此证书,并在与服务通信时给出错误“X.509证书中不存在私钥”。有人告诉我,我需要将此证书加载到本地证书存储区以解决此错误。有人可以提供一些指示吗?谢谢!

我有以下功能从文件参数中指定的路径加载证书。

public static X509Certificate LoadCertificate(string file)
    {
        try
        {
            return X509Certificate.CreateFromCertFile(file);
        }
        catch (System.Security.Cryptography.CryptographicException)
        {
            string filestr = File.ReadAllText(file);

            StringBuilder sb = new StringBuilder(filestr.Remove(0, filestr.IndexOf("-----BEGIN CERTIFICATE-----")));

            sb.Replace("-----BEGIN CERTIFICATE-----", "");
            sb.Replace("-----END CERTIFICATE-----", "");
            //Decode 
            try
            {        //see if the file is a valid Base64 encoded cert
                byte[] certBytes = Convert.FromBase64String(sb.ToString());

                return new X509Certificate(certBytes);
            }
            catch (System.FormatException)
            {
                throw;
            }
        }
    }

在我的WCF客户端中,它正在加载从LoadCertificate()函数创建的证书。

    public X509Certificate Certificate { get; set; }

    ClientCredentials loginCredentials = new ClientCredentials();
    loginCredentials.UserName.UserName = this.UserId;
    loginCredentials.UserName.Password = this.Password;
    loginCredentials.ClientCertificate.Certificate = new X509Certificate2(this.Certificate);

1 个答案:

答案 0 :(得分:1)

除了提供用户名和密码之外,您的代码还表示您正在尝试使用证书向服务器验证客户端。这很奇怪,但我猜可能。您将需要与该证书关联的私钥用于此目的,因为客户端将需要它们来加密通信,以便服务器可以使用证书来解密并验证客户端是否合法。 .pem文件可以包含公钥和私钥,但是发送给你的那个可能不包含?

我的猜测是,您真的只希望客户端连接到使用此证书进行身份验证并加密通信的服务器。如果是这样,所有客户端需要做的就是在本地导入证书,以便在客户端首次连接到服务器时,它可以与本地版本进行比较。

为此,Microsoft在文件浏览器中双击.pem文件启动证书导入向导。但是,如果这对你不起作用,这就是困难的方法:

  • 开始 - 运行 - mmc
  • 文件 - 添加/删除管理单元
  • 选择“证书” - 单击“添加” - 选择“计算机帐户 - 本地计算机”
  • 单击确定关闭管理单元窗口

  • 现在浏览证书(本地计算机) - 个人 - 证书

  • 右键单击 - 所有任务 - 导入