gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:46:05 27 4
gpt4 key购买 nike

手头的任务是将证书从中央服务器推送到接收服务器。我能够利用 x509certificate2 方法来完成证书安装。即使存储标志指示 add() 方法安装私钥,它也不会将其安装在远程机器上。在下面的代码中,请相信 $CertObj 是使用存储标志 ExportableMachineKeySetPersistKeySet< 创建的 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 我可以看到,当证书正在为私钥安装注册 key 时,它是在服务器上执行此操作的,而服务器正在远程服务器上执行安装。我需要 .Net 在远程机器上安装证书私钥。我已经阅读了 x509certificate2 docs但它根本没有涉及远程安装,也没有关于这些方法的作用的深入解释。

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

最佳答案

您不能通过网络移动/复制具有关联私钥的证书。使用您的代码,您只是复制证书的公共(public)部分。私钥保留在源服务器上,不会移动/复制到任何地方。

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

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

  1. 使用以下命令导出证书和相关私钥:Export(X509ContentType, SecureString)或者这个:Export(X509ContentType, String)重载。
  2. 将 PFX 文件复制到目标服务器并使用 these 之一重载以将带有私钥的证书导入 X509Certificate2 对象,并使用 X509Store 对象将其安装到商店。

但是,请注意,如果私钥在 key 生成或安装期间未标记为可导出,则您的任务将无法完成,因为私钥受 CSP/KSP 保护,您将无法从提供商处导出 key .

关于c# - 使用 .NET 和 Powershell 远程推送 PFX 证书和私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26717342/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com