C# 使用.NET和Powershell远程推送PFX证书和私钥
手头的任务是将证书从中央服务器推送到收件人服务器。我能够利用x509certificate2方法完成证书安装。即使存储标志指示add()方法安装私钥,它也不会在远程计算机上安装私钥。在下面的代码中,请相信C# 使用.NET和Powershell远程推送PFX证书和私钥,c#,.net,powershell,x509certificate2,C#,.net,Powershell,X509certificate2,手头的任务是将证书从中央服务器推送到收件人服务器。我能够利用x509certificate2方法完成证书安装。即使存储标志指示add()方法安装私钥,它也不会在远程计算机上安装私钥。在下面的代码中,请相信$CertObj是一个x509certificate2对象,该对象是使用存储标志可导出的、机器密钥集和持久密钥集创建的 Function Import-CertificateObject { Param ( [parameter(mandatory=$true)]
$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
属性是存储附加属性,与私钥存在的事实有一点关系,并且不是确定是否为该证书安装私钥的可靠方法
跨计算机复制带有私钥的证书的唯一正确方法是:
X509Certificate2
对象,然后使用X509Store
对象将其安装到存储中但是,请注意,如果在密钥生成或安装期间未将私钥标记为可导出,您的任务将不可能完成,因为私钥受CSP/KSP保护,您将无法从提供程序导出密钥。这里的解决方案是利用
调用命令-ScriptBlock{}
在本地机器上执行代码