通过Powershell为证书私钥分配权限(Win 2012 R2)

2024-04-13

在附加到域的 Windows Server 2012 R2 计算机上,我运行以下语句:

$target_machine_fqdn = [System.Net.Dns]::GetHostByName($env:computerName)

$certificate_request = Get-Certificate `
    -Template 'AcmeComputer' `
    -DnsName $target_machine_fqdn `
    -CertStoreLocation 'Cert:\LocalMachine\My'

我正在向域的 CA 请求主机证书。该语句返回且没有错误。系统会为计算机生成一个证书,并根据要求将其放置在“Cert:\LocalMachine\My”中。

问题:我不知道如何授予服务帐户对证书私钥的权限。

现在,大约有1,000指导文章 https://stackoverflow.com/questions/43461423/grant-security-to-a-private-key-in-windows-server-2012-via-powershell-w-out-exte人们如何通过检索来授予权限UniqueKeyContainerName代码如下所示:

$certificate.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName

这在这里行不通。虽然证书有私钥,但私钥数据成员为空:

enter image description here

在我刚刚回避的解决方案起作用的情况下,私钥位于文件系统上。但是,在这种情况下,私钥位于注册表中的以下位置:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\MY\Keys

使用证书 MMC-snapin 时,我可以看到证书。我可以管理私钥的权限。所以,我知道它就在那里。不幸的是,我需要自动执行权限分配,因此不能选择使用证书 MMC-snapin。我需要通过 Powershell 来完成此操作。


我最近亲自经历了对证书私钥的自动访问。我也发现很多地方告诉我修改硬盘上关键数据的 ACL,但这并不令人满意,因为当我使用 PowerShell 检查私钥的权限时,我添加的用户没有列出。大量的网络搜索、几篇文章以及相当多的尝试和错误使我得出了这一点。

我首先定义用户对象以及我想要授予他们的访问权限:

# Create NTAccount object to represent the account
$AccountName = 'Domain\UserName'
$User = New-Object System.Security.Principal.NTAccount($AccountName)
# Define AccessRule to be added to the private key, could use 'GenericRead' if all you need is read access
$AccessRule = New-Object System.Security.AccessControl.CryptoKeyAccessRule($User, 'FullControl', 'Allow')

然后,我以读/写方式打开本地计算机证书存储,并找到我正在查找的证书:

# Define the thumbprint of the certificate we are interested in
$Thumb = '63CFDDE9A748345CD77C106DAA09B805B33951BF'
# Open Certificate store as read/write
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My","LocalMachine")
$store.Open("ReadWrite")
# Look up the certificate's reference object in the store
$RWcert = $store.Certificates | where {$_.Thumbprint -eq $Thumb}

然后,我创建一个新的 CSP(加密服务提供商)参数集,基于现有证书,将新的访问规则添加到参数集中。

# Create new CSP parameter object based on existing certificate provider and key name
$csp = New-Object System.Security.Cryptography.CspParameters($RWcert.PrivateKey.CspKeyContainerInfo.ProviderType, $RWcert.PrivateKey.CspKeyContainerInfo.ProviderName, $RWcert.PrivateKey.CspKeyContainerInfo.KeyContainerName)

# Set flags and key security based on existing cert
$csp.Flags = "UseExistingKey","UseMachineKeyStore"
$csp.CryptoKeySecurity = $RWcert.PrivateKey.CspKeyContainerInfo.CryptoKeySecurity
$csp.KeyNumber = $RWcert.PrivateKey.CspKeyContainerInfo.KeyNumber

# Add access rule to CSP object
$csp.CryptoKeySecurity.AddAccessRule($AccessRule)

然后,我们使用这些参数实例化一个新的 CSP,它将根据我们定义的标志以及我们提供的密钥信息将新的访问规则应用于现有证书。

# Create new CryptoServiceProvider object which updates Key with CSP information created/modified above
$rsa2 = New-Object System.Security.Cryptography.RSACryptoServiceProvider($csp)

然后我们只要关闭证书存储就可以了。

# Close certificate store
$store.Close() 

Edit:环顾四周后,我意识到我有几个相同的证书。我认为这是因为使用非 RSA 密码来加密私钥。我使用了一些信息这个答案 https://stackoverflow.com/questions/17185429/how-to-grant-permission-to-private-key-from-powershell/22146915#22146915这解释了如何与第三方 CNG 加密提供商合作。我不喜欢必须下载程序集来执行该答案中的操作,但我使用了一些代码来获取密钥的路径(是的,驱动器上有一个密钥),并添加了 ACL到该文件,该文件确实用于将权利委托给私钥。所以这就是我所做的......

首先,我们验证证书是否具有基于 CNG 的密钥:

[Security.Cryptography.X509Certificates.X509CertificateExtensionMethods]::HasCngKey($Certificate)

如果返回True然后我们就可以继续前进了。我的也这样,我猜你的也会这样。然后我们通过读取 PrivateKey 数据(在$Certificate),并得到UniqueName查找它,然后在 Crypto 文件夹中搜索该文件。

$privateKey = [Security.Cryptography.X509Certificates.X509Certificate2ExtensionMethods]::GetCngPrivateKey($Certificate)
$keyContainerName = $privateKey.UniqueName
$keyMaterialFile = gci $env:ALLUSERSPROFILE\Microsoft\Crypto\*Keys\$keyContainerName

然后,我获取该文件的当前 ACL,创建一个新的 AccessRule 来为所需的用户提供对该文件的访问权限,将该规则添加到我刚刚获取的 ACL,并将更新的 ACL 应用回该文件。

$ACL = Get-Acl $keyMaterialFile
$AccountName = 'Domain\User'
$User = New-Object System.Security.Principal.NTAccount($AccountName)
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($User,'FullControl','None','None','Allow')
$ACL.AddAccessRule($AccessRule)
Set-Acl -Path $keyMaterialFile -AclObject $ACL

之后,我能够查看 certlm.msc 并验证用户是否有权使用私钥。

依赖更新:看起来 Microsoft 现在发布了 Security.Cryptography.dll,因此您不必从 GitHub 上编译它。如果安装了 AzureRM 模块,您可以在许多组件模块中找到该 DLL(我从 AzureRM.SiteRecovery 中获取它)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过Powershell为证书私钥分配权限(Win 2012 R2) 的相关文章

  • NTFS 连接点和符号链接有什么区别?

    在高水平上 两者之间唯一明显的区别NTFS 连接点 http msdn microsoft com en us library windows desktop aa365006 aspx and 符号链接 http msdn microso
  • Jekyll for GitHub Pages 在 Windows 上找不到 rouge

    我刚刚在 Windows 上安装了 Jekyll 我正在尝试使语法突出显示与 rouge 一起使用 我已经设定highlighter rouge在 config yml 上 在文件 posts 2015 08 13 my first pos
  • Windows 上的 Node.js 和 Express

    今晚 我决定尝试在我的 Windows 7 计算机上使用 Express 构建一个简单的 Node js 应用程序 安装过程还算顺利 但 Express 拒绝配合 以下是我已采取的步骤 使用以下位置提供的 MSI 安装 Node jshtt
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • FileInfo.BaseName 存在于 PowerShell 中,但不存在于直接 .NET 中

    为什么在 NET 中System IO FileInfo对象没有BaseName属性 但我可以通过 PowerShell 使用该属性 例如 FolderItems Get ChildItem Path C Where Object isno
  • 在 wampserver 2.2 上安装 php_imagick.dll PHP 扩展

    我使用的是 32 位操作系统的 Windows 7 我安装了 ImageMagick 6 8 7 Q16Link https www imagemagick org script download php windows我能够从命令行 转换
  • Powershell日期类型无法找到

    我正在尝试使用PowerShell连接virustotal API 代码来自virustotal网站 我得到 无法找到类型 System Security Cryptography ProtectedData 错误信息 代码如下 funct
  • Windows 和 python 3.2 的 Pylint 安装问题

    当我尝试使用 pip 在 Windows 上安装 pylint 时 我遇到了这个问题 我真的不知道它来自哪里 C Python33 Scripts gt pip exe install pylint Downloading unpackin
  • 为 Windows 98 编译 Qt

    我需要支持 Windows 98 Qt 文档声称这是可能的 但没有说明 Qt 4 6 的分布式二进制文件不能在 Win98 上运行 而且我采样的大多数 Qt 应用程序也不能在 Win98 上运行 对于几个确实在 98 上运行的应用程序 我询
  • 我的 Powershell GUI 界面在打开网格视图时不断调整大小

    我目前正在构建一个复制到剪贴板工具 其中显示存储在文件夹中的 txt 文件列表 并且我使用 out gridview 来允许用户更好地选择和过滤列表 我已附上图片以供参考 单击加载 out gridview 的按钮后如何停止调整大小 Too
  • Boost + Visual Studio 2010 + Windows 平台 SDK 7.1

    有人可以告诉我 bjam 的命令行开关或其他可以使用新的 Windows Platform SDK 7 1 工具链使用 VS2010 进行 boost 编译的东西吗 您可以在普通的视觉工作室项目中设置该选项 默认值是 v100 是平台 7
  • 使用 BitmapEncoder 生成时如何使 GIF 循环重复

    我能够使用 BitmapEncoder C WinRT 创建动画 gif 但是 我一直无法弄清楚如何让GIF循环回来并从头开始 没有尝试太多 因为我不确定要尝试什么 搜索了更多要在 GIF 上设置的属性 但找不到任何相关内容 好吧 终于能弄
  • 如何在管道函数中使用 Write-Progress?

    我正在尝试编写一个函数PowerShell接受管道输入 我想使用显示进度条Write Progress 管道中每个项目的增量 例如 function Write PipelineProgress Cmdletbinding Param Pa
  • 在 Powershell 4 中压缩和解压缩文件

    我使用的是 Windows Server 2012 R2 64 位 我有 powershell 版本 4 可用 我正在尝试压缩和解压缩文件 当我尝试 Write Zip 命令时 它会抛出以下错误 Write Zip 术语 Write Zip
  • 为什么AES java解密返回额外的字符?

    请原谅我英语不好 我使用 mcrypt 我从这里得到它用于 php 和 java 的 MCrypt https snipt net raw ee573b6957b7416f28aa560ead71c3a2 nice 在我的android应用
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • 如何使用 PowerShell 扩展 ZIP 存档(UTF-8 文件名)

    我的 zip 存档有一个文件 P re No l txt 该 zip 可以通过 Windows 文件资源管理器 7 Zip 或我尝试过的任何其他工具很好地扩展 但我不知道如何从 PowerShell 中做到这一点 显然我已经尝试过展开 存档
  • 有没有办法在 MS Windows(Powershell 或 CMD)的 ripgrep 中转义引号?

    我想找一个字符串 Hello Hello 以双引号开头 在文本文件中使用ripgrep 通常 在 Bash 或 ZSH 中 这可以通过用反斜杠转义或用单引号括起来来实现 rg Hello rg Hello 然而 在 MS Windows P
  • 如何从 -WhatIf 处理中排除块?

    我正在编写一个 Powershell cmdlet 它需要执行命令并将其 stderr 输出存储到临时文件中以供以后处理 此输出列出了 cmdlet 稍后可能使用的 COM 端口 mostly side effect free inform
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐

  • 使用嵌套字典Python的自定义类

    当使用相同的键在嵌套字典中添加值时遇到问题 并且该值始终显示相同的值 事实是 我想更新值事件 键是相同的 该算法是人工鱼群算法的基础 example gt gt fish template 0 weight 3 1 visual 2 ste
  • Boost read_json 和 C++11

    我正在尝试使用 Boost 的 property tree 解析器和 C 11 代码解析 JSON 我的系统是带有 gcc 4 7 2 和 Boost 1 49 的 Debian Wheezy 我尝试了以下代码基于使用 boost 序列化和
  • 数组映射返回未定义的数组,何时应返回对象数组

    为什么 a b c map x gt letter x 返回一个未定义的数组 and a b c map x gt letter x 0 正确返回对象数组 Because 您可以使用大括号作为块语句 https developer mozi
  • 在数据框中创建一个新列:组中的索引(组之间不唯一)

    我有一个包含两列的数据框 第一列包含每个人所属的组 第二列包含个人的 ID 见下文 df lt data frame group c G1 G1 G1 G1 G2 G2 G2 G2 indiv c indiv1 indiv1 indiv2
  • android 如何监听自定义变量?

    我看过这个线程 如何实现监听器 https stackoverflow com questions 5941960 android how to implement listener关于实现侦听器 它实际上非常简单 但我不知道它到底是如何完
  • 检索并使用 Microsoft 或 Mozilla 的 Root-CA 列表并在 Java 中使用它?

    OpenJDK for Windows 中包含的根 CA 证书列表非常令人印象深刻 但有很多根 CA 证书受到 Firefox 等常见浏览器的信任 但不受 Java 信任 Both 微软 https support microsoft co
  • ASP.NET MVC3 和服务器端验证

    假设用户禁用了 javascript 因此客户端验证在 MVC3 中不起作用 实现服务器端验证的最佳方法是什么 以便当用户尝试以不适当的方式处理数据时仍然显示验证消息 Thanks EDIT 显然发生这种情况是因为我使用 EF 生成的模型
  • jquery fancybox 触发点击仅工作一次

    我从绑定到表行的单击事件调用 jquery fancybox 链接 该操作第一次工作正常 但是 如果我关闭 fancybox 并再次单击任何行 绑定到该行的匿名函数仍然会触发 但 fancybox 不会启动 这是我正在使用的 JavaScr
  • 在 CruiseControl.NET 构建中使用“devenv”和“msbuild”有什么区别?

    CruiseControl NET 中使用 标记和 标记的主要区别是什么 我知道它们调用不同的可执行文件 但有时我会得到不同的结果 就编译时的通过 失败而言 我想知道为什么两个构建命令之间存在差异 基本上 devenv Visual Stu
  • hashbang 行上的 Eclipse javascript 语法错误

    当我将一些现有的 Node js 代码导入 Eclipse 工作区时 它会抱怨 令牌 无效字符 出现语法错误 请删除此令牌 on the usr bin env node哈希邦线 我怎样才能告诉 Eclipse 忽略这个错误 对于 Node
  • Android - 如何更新通知号码

    您好 我想在单个视图中显示所有通知 并且想要更新状态栏中的通知数量 它更新所有信息 但显示数量始终为 1 请告诉我如何解决它 Override public void onReceive Context context Intent int
  • VHDL 中的 #define 等价物是什么

    VHDL 中的 define ifdef 和 ifndef 相当于什么 我想使用泛型作为 define 并根据它们更改设计 举一个简单的例子 定义一个字符串泛型并用它来确定时钟是单时钟还是差分时钟 generic something boo
  • 如何将 NSData 转换为 NSString? [复制]

    这个问题在这里已经有答案了 可能的重复 将 UTF 8 编码的 NSData 转换为 NSString https stackoverflow com questions 2467844 convert utf 8 encoded nsda
  • 如何在其适配器的 onBindViewHolder 内更新 recyclerView?

    我在 recyclerView 中制作了一张卡片列表 当卡持有一段时间后 其在数据库中的相应条目将被删除 因此之后 必须删除该卡 这可以通过调用设置新的更新适配器来完成 但我无法在 onBindViewHolder 中使用 setAdapt
  • 在 Firefox 中,在选项卡重定向之前获取 URL 的方法是什么?

    我为 Firefox 开发了一个附加组件 它有一个重定向链接 https www google com vn url sa t rct j q esrc s source web cd 1 cad rja uact 8 ved 0CB0QF
  • pytest 无法导入模块,而 python 可以

    我正在用 Python 开发一个包 我使用虚拟环境 我在 virtualenv 的 pth 路径中设置了模块根目录的路径 这样我就可以在开发代码时导入包的模块并进行测试 问题 1 这是一个好方法吗 这工作正常 这是一个例子 这是我想要的行为
  • 使用证书和自定义 ssl 套接字工厂到 ldap 的 SSL 连接

    这是我的场景 我想使用 jndi 连接到 ldap 我使用自定义 SSLSOcketfactory 来读取信任库和密钥库 上下文创建成功 但是当我尝试使用相同的凭据进行身份验证时 它会抛出一个错误 告知不支持该身份验证方法 这是我的自定义
  • 在 JavaScript 或 jQuery 中动态更改 CSS 规则

    我正在寻找一种方法来更改文档中导入的样式表的 CSS 规则 所以我有一个外部样式表和一些class and div里面的属性 我想使用 JavaScript 或 jQuery 更改其中一项规则 这是一个例子 red color red 所以
  • 用java将图像写入pdf文件

    我正在编写一个代码 将 Microsoft power point ppt 幻灯片转换为图像 并将生成的图像写入 pdf 文件 以下代码生成图像并将其写入 pdf 文件 但我面临的问题是 当我将图像写入 pdf 文件时 它的大小超出了 pd
  • 通过Powershell为证书私钥分配权限(Win 2012 R2)

    在附加到域的 Windows Server 2012 R2 计算机上 我运行以下语句 target machine fqdn System Net Dns GetHostByName env computerName certificate