C# 使用私钥安装证书

C# 使用私钥安装证书,c#,C#,我正在将此批处理命令的一部分转换为托管代码: "%~dp0\makecert" -r -pe -n "CN=CompanyName" -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 "%~dp0\server.cer" 这不仅创建证书,还安装证书 安装证书时,它看起来如下所示: 现在我正在尝试在使用托管代码时安装私有证书 这就是我到目前为止所做的:

我正在将此批处理命令的一部分转换为托管代码:

"%~dp0\makecert" -r -pe -n "CN=CompanyName" -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 "%~dp0\server.cer"
这不仅创建证书,还安装证书

安装证书时,它看起来如下所示:

现在我正在尝试在使用托管代码时安装私有证书

这就是我到目前为止所做的:

/// <summary>
///     Install the root authority certificate
/// </summary>
/// <param name="fileName"></param>
private static void InstallRootAuthority(string fileName)
{
    var cert = new X509Certificate2(X509Certificate.CreateFromCertFile(fileName));
    var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    store.Open(OpenFlags.ReadWrite);
    store.Add(cert);
    store.Close();
}
//
///安装根授权证书
/// 
/// 
私有静态void InstallRootAuthority(字符串文件名)
{
var cert=new X509Certificate2(X509Certificate.CreateFromCertFile(文件名));
var store=new X509Store(StoreName.My,StoreLocation.LocalMachine);
打开(OpenFlags.ReadWrite);
存储。添加(证书);
store.Close();
}

如何添加私钥?

因此,要实现这一点,您需要使用.pfx文件(我认为该文件不仅包含证书,还包含私钥)

这就是我所做的

  • 使用MakeCert.exe生成证书,如下所示:
  • “%~dp0\makecert”-r-pe-n“CN=CompanyName”-ss my-sr localmachine -sky exchange-sp“Microsoft RSA SChannel加密提供程序”-sy 12“%~dp0\server.cer”-sv server.pvk

    请注意最后的-sv Server.pvk(这是私钥)

  • pvk2pfx.exe-pvk Server.pvk-spc Server.cer-pfx Server.pfx
  • 这提示我输入密码,我选择了无。试图包含密码会导致发生不好的事情

  • 现在,在代码中,按如下方式进行调整:

    私有静态void InstallRootAuthority(字符串文件名) { var cert=new X509Certificate2(文件名,string.Empty,x509keystrageflags.MachineKeySet | x509keystrageflags.PersistKeySet); var store=new X509Store(StoreName.My,StoreLocation.LocalMachine); 打开(OpenFlags.ReadWrite); 存储。添加(证书); store.Close(); }


  • 请原谅格式化,但在回答时stackoverflow格式被破坏

    我很确定你的代码是有效的。您是否100%确定
    文件名处的证书包含私钥?通常,当证书文件包含私钥时,它受密码保护,我看不到您使用密码还有另一件事我不太明白:您的方法名为
    InstallRootAuthority
    ,但您正在将其安装到
    StoreName.My
    。通常,根证书属于
    StoreName.root,否则不会自动验证客户端证书和服务器证书。你是故意这么做的吗?