如何使用powershell New-SelfSignedCertificate设置权限密钥标识符

问题描述 投票:0回答:2
    New-SelfSignedCertificate -Subject "CN=me.com, OU=ounit, O=company, L=state, C=country" -FriendlyName "me.com" 
     -HashAlgorithm SHA256 -KeyLength 4096 -KeyUsage DigitalSignature,KeyEncipherment 
       -NotAfter (Get-Date).AddDays(1024)  -CertStoreLocation cert:\LocalMachine\My 
        -TextExtension @("2.5.29.19={text}CA=false") -KeyExportPolicy Exportable

我正在使用上面的命令并尝试在证书上设置此属性:

我尝试了以下方法并出现错误:

-TextExtension @("2.5.29.19={text}CA=false","2.5.29.35={2.5.29.14}")

我知道使用自签名证书,授权密钥标识符 KeyID 将被分配给 自签名证书中的主题密钥标识符,但正确的方法是什么 这。微软的文档没有明确说明: https://learn.microsoft.com/en-us/powershell/module/pki/new-selfsignedcertificate?view=windowsserver2022-ps

而且我还没有通过搜索找到任何具体的作业。

powershell ssl-certificate public-key-encryption pki self-signed
2个回答
0
投票

使用 -TextExtension 解决此问题似乎已作为读者的练习。但是,如果您附加 -TestRoot 选项,它将有效地“取消隐藏”生成的代码签名证书中的

Authority Key Identifier
扩展。 正如文档所述,-TestRoot 使用内置 CA 证书,主题为
CertReq Test Root
作为代码签名证书的颁发者。例如,以下 PowerShell 命令将创建一个代码签名证书,其中包含否则会丢失的扩展名:

$cert = New-SelfSignedCertificate -DNSName "Dev Test Code Signing AKI" -CertStoreLocation Cert:\LocalMachine\My -Type CodeSigningCert -FriendlyName Dev_Code_Signer_AKI -TestRoot

以下是生成的证书的属性,其中包括

Authority Key Identifier
扩展名:

该证书在技术上不是自签名的,因此其状态在右下角描述为“正常”。根据需要在

Intermediate Certificate Authorities/Certificates
位置创建的内置颁发者证书是自签名的,并会在左上角发出警告。这是它的属性面板:

如左上角所示,如果您导出此证书,然后将其导入到

Trusted Root Certification Authorities/Certificates
位置,您的代码签名应用程序将在运行时在本地 Windows 系统上变得可验证。但您还可以通过将测试导入到其他系统(例如 Windows、Linux 和 OpenJDK 环境)上的根 CA 存储来扩展测试范围。


0
投票

另一个答案似乎对 AIA 有利,但您可能很快就需要 CDP 来支持 CRL。简短的答案是找到该 CA 颁发的证书并从中提取字段值。此示例应演示为 AIA 扩展执行此操作的过程:

$cert = get-item cert:\CurrentUser\My\$thumbprint
$aia = $cert.Extensions | where-object { $_.oid.value -eq "1.3.6.1.5.5.7.1.1"}
$aiab64 = [system.convert]::ToBase64String($aia)
$aia = $cert.Extensions | where-object { $_.oid.value -eq "2.5.29.31"}
$cdpb64 = [system.convert]::ToBase64String($cdp)

New-SelfSignedCertificate -Subject "CN=me.com, OU=ounit, O=company, L=state, C=country" -FriendlyName "me.com" 
 -HashAlgorithm SHA256 -KeyLength 4096 -KeyUsage DigitalSignature,KeyEncipherment 
   -NotAfter (Get-Date).AddDays(1024)  -CertStoreLocation cert:\LocalMachine\My 
    -TextExtension @("2.5.29.19={text}CA=false","1.3.6.1.5.5.7.1.1=$aiab64","2.5.29.31=$cdpb64") -KeyExportPolicy Exportable

基本上,您添加 TextExtension 字段,并将 OID 设置为 URL 的 base64 表示形式(没有令牌)。当它们被列为 URL 令牌时,它似乎不接受它们,尽管这似乎有意义。我相信这与此 OID 的 ASN 编码复杂性有关(它与 OCSP 重叠)。

你可以尝试自己对字符串进行编码,但是比较复杂,不容易学。

$s=[System.Text.Encoding]::Default.GetBytes("http://aia.yourdomain.example.com/CertEnroll/MyCA.crt")
[byte[]]$t=(0x2B,0x06,0x01,0x05,0x05,0x07,0x30,0x02) # Specific to AIA
$t=(6,$t.length)+$t+(0x86,$s.length)+$s
$t=(48,$t.length)+$t
$t=(48,$t.length)+$t
$aiab64=[Convert]::ToBase64String($t)

第一个字节字符串可能需要是 [byte[]]$t=(0x2B,0x06,0x01,0x05,0x05,0x07,0x30,0x01) 但我还没有充分利用它来确定。从技术上讲,RFC 要求 LDAP URL 成为第一个列出的 URL(这意味着更加复杂,因为它必须对多个 URL 引用进行编码,而这是无法做到的)。 CDP 扩展应该是这样的:

$s=[System.Text.Encoding]::Default.GetBytes("http://crl.yourdomain.example.com/CertEnroll/MyCA.crl")
[byte[]]$t=(0x82,0x01,0x11,0xA0,0x82,0x01,0x0D)
$t=(15,$t.length)+$t+(0x86,$s.length)+$s
$t=(48,$t.length)+$t
$t=(48,$t.length)+$t
$cdpb64=[Convert]::ToBase64String($t)

您可以查看 BouncyCastle 等库的一些类文档 (http://rcardon.free.fr/websign/download/api-x509-ext/be/cardon/asn1/x509/extensions/CRLDistributionPoints.html )以获得更多提示。如果您想真正深入,可以安装 PsPKI 模块并探索 ASN 类。 https://www.pkisolutions.com/apidocs/pki/html/T_SysadminsLV_Asn1Parser_Asn1Builder.htm

© www.soinside.com 2019 - 2024. All rights reserved.