Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.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# 使用.NET和Powershell远程推送PFX证书和私钥_C#_.net_Powershell_X509certificate2 - Fatal编程技术网

C# 使用.NET和Powershell远程推送PFX证书和私钥

C# 使用.NET和Powershell远程推送PFX证书和私钥,c#,.net,powershell,x509certificate2,C#,.net,Powershell,X509certificate2,手头的任务是将证书从中央服务器推送到收件人服务器。我能够利用x509certificate2方法完成证书安装。即使存储标志指示add()方法安装私钥,它也不会在远程计算机上安装私钥。在下面的代码中,请相信$CertObj是一个x509certificate2对象,该对象是使用存储标志可导出的、机器密钥集和持久密钥集创建的 Function Import-CertificateObject { Param ( [parameter(mandatory=$true)]

手头的任务是将证书从中央服务器推送到收件人服务器。我能够利用x509certificate2方法完成证书安装。即使存储标志指示add()方法安装私钥,它也不会在远程计算机上安装私钥。在下面的代码中,请相信
$CertObj
是一个x509certificate2对象,该对象是使用存储标志
可导出的
机器密钥集
持久密钥集
创建的

Function Import-CertificateObject
{
    Param
    (
        [parameter(mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]
        $Computer
    )

    $CertStore = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store -ArgumentList "\\$($Computer)\$Location",$Store
    $CertStore.Open("ReadWrite")
    $CertStore.Add($CertObj)
    $CertStore.Close()

}
使用powershell隔离已安装的证书对象,我可以看到
HasPrivateKey
属性已设置为true。在服务器上本地检查已安装证书时,以及从安装证书的远程服务器检查已安装证书时,就是这种情况。接下来,如果您从安装了证书的服务器检查
PrivateKey
属性,则该属性为空。但是,当从安装它的服务器进行检查时,powershell会返回私钥的对象数据

使用ProcMon,我可以看到,当证书为私钥安装regkey时,它是在远程服务器上执行安装的服务器上安装的。我需要.Net在远程计算机上安装证书私钥。我已经读了一遍,但它根本没有涉及远程安装,也没有深入解释这些方法的作用


我希望这就像在
add()
方法之前更改环境变量一样简单,或者我完全从错误的角度来处理这个问题。那么,如何让它在远程服务器而不是推送证书的服务器上安装私钥呢?

您不能通过网络移动/复制带有相关私钥的证书。使用您的代码,您只是复制证书的公共部分。私钥保留在源服务器上,不会移动/复制到任何位置

HasPrivateKey
属性是存储附加属性,与私钥存在的事实有一点关系,并且不是确定是否为该证书安装私钥的可靠方法

跨计算机复制带有私钥的证书的唯一正确方法是:

  • 使用this:或this:重载导出证书和分配的私钥
  • 将PFX文件复制到目标服务器,并使用其中一个重载将带有私钥的证书导入
    X509Certificate2
    对象,然后使用
    X509Store
    对象将其安装到存储中

  • 但是,请注意,如果在密钥生成或安装期间未将私钥标记为可导出,您的任务将不可能完成,因为私钥受CSP/KSP保护,您将无法从提供程序导出密钥。

    这里的解决方案是利用
    调用命令-ScriptBlock{}
    在本地机器上执行代码