【问题标题】:Powershell Unable to load Private key using New-SelfSignedCertificatePowershell 无法使用 New-SelfSignedCertificate 加载私钥
【发布时间】:2021-02-25 03:12:29
【问题描述】:
  1. 我一直在尝试创建一个 rootCA 和中间 CA,在 Windows 10 上使用 powershell 对证书进行签名
  2. 当我尝试检查 QA1KeyCARoot.key 时,我收到一个错误,无法加载私钥。

问题:

  1. 这是使用 powershell 从 pfx 文件中提取密钥的正确方法吗? pfx 应包含 rootCA 的证书和私钥

    $CertRootCAFilePFX = Export-PfxCertificate -Cert cert:\LocalMachine\My$RootCAthumbprint -FilePath C:\Users\KeyCARoot.pfx -Password $CertRootCAPassword

  2. 如何从命令中获取 pem 中的链?

谢谢

根 CA
$RootCA = New-SelfSignedCertificate -Subject 'CN=KeyCARootCN,O=Test Organisation, OU=Test RootCA,C=AU'  -KeyLength 2048 -KeyAlgorithm 'RSA' -HashAlgorithm 'SHA256' -KeyExportPolicy Exportable -KeyUsage KeyEncipherment,DataEncipherment,CertSign,DigitalSignature,CRLSign -Provider 'Microsoft Enhanced RSA and AES Cryptographic Provider' -NotAfter (Get-Date).AddYears(40) -KeyUsageProperty All -TextExtension @(“2.5.29.19 ={critical} {text}ca=1&pathlength=5”) -CertStoreLocation Cert:\LocalMachine\My
$RootCA
$RootCAthumbprint = $RootCA.Thumbprint


$CertRootCAPassword = ConvertTo-SecureString -String “Test123” -Force –AsPlainText
$CertRootCAFilePFX = Export-PfxCertificate -Cert cert:\LocalMachine\My\$RootCAthumbprint -FilePath C:\Users\KeyCARoot.pfx -Password $CertRootCAPassword

$CertRootCAFileCER = Export-Certificate -Cert $RootCA -FilePath C:\Users\KeyCARoot.cer

$CertRootCAFileCER
$CertRootCAPath = 'C:\Users\KeyCARoot.cer'
Import-Certificate -FilePath C:\Users\KeyCARoot.cer -CertStoreLocation Cert:\LocalMachine\Root
中级 CA
$InterCA = New-SelfSignedCertificate -Subject 'CN=KeyInterCARootCN,O=Test Organisation, OU=Test InterCA,C=AU' -Signer $RootCA -KeyLength 2048 -HashAlgorithm 'SHA256' -KeyExportPolicy Exportable -KeyUsage KeyEncipherment,DataEncipherment,CertSign,DigitalSignature,CRLSign -Provider 'Microsoft Enhanced RSA and AES Cryptographic Provider' -NotAfter (Get-Date).AddYears(35) -KeyUsageProperty Sign -TextExtension @(“2.5.29.19 = {critical} {text}ca=1&pathlength=0”) -CertStoreLocation Cert:\LocalMachine\My
$InterCAthumbprint = $InterCA.Thumbprint


$CertInterCAPassword = ConvertTo-SecureString -String “Test123” -Force –AsPlainText
$CertInterCAFilePFX = Export-PfxCertificate -Cert cert:\LocalMachine\My\$InterCAthumbprint -FilePath C:\Users\KeyInterCARoot.pfx -Password $CertInterCAPassword

$CertInterCAFileCER = Export-Certificate -Cert $InterCA -FilePath C:\Users\KeyInterCARoot.cer

$CertInterCAFileCER
Import-Certificate -FilePath C:\Users\KeyInterCARoot.cer -CertStoreLocation Cert:\LocalMachine\CA

然后

openssl pkcs12 -in KeyCARoot.pfx -nocerts -nodes  -passin pass:Test123 | sed -ne "/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p" > KeyCARoot.key
openssl pkcs12 -in KeyInterCARoot.pfx -nocerts -nodes -passin pass:Test123 | sed -ne "/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p" > KeyInterCARoot.key

openssl x509 -inform der -in KeyCARoot.cer -out KeyCARoot.pem
openssl x509 -inform der -in KeyInterCARoot.cer -out KeyInterCARoot.pem

运行以下:

openssl rsa -modulus -noout -in KeyCARoot.key
openssl : unable to load Private Key
At line:1 char:1
openssl rsa -modulus -noout -in KeyCARoot.key
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo          : NotSpecified: (unable to load Private Key:String) [], RemoteException
FullyQualifiedErrorId : NativeCommandError
8924:error:0909006C:PEM routines:get_name:no start line:crypto\pem\pem_lib.c:745:Expecting: ANY PRIVATE KEY

我已删除 .key 文件中的 Bag 属性 包属性

    Microsoft Local Key set: <No Values>
    localKeyID: 01 00 00 00 
    friendlyName: te-3737d2a6-b5dc-4d63-b680-68a42d8080a0
    Microsoft CSP Name: Microsoft Enhanced RSA and AES Cryptographic Provider
Key Attributes
    X509v3 Key Usage: 10 
-----BEGIN PRIVATE KEY-----
....
...
-----BEGIN PRIVATE KEY-----

【问题讨论】:

  • QA1KeyCARoot.key 文件应该来自哪里?
  • 对不起,这是我的帖子中的错字。它实际上是 KeyCARoot.key。会修复我的帖子。我假设 $CertRootCAFilePFX = Export-PfxCertificate -Cert cert:\LocalMachine\My$RootCAthumbprint -FilePath C:\Users\KeyCARoot.pfx -Password $CertRootCAPassword ..... 创建包含证书和私钥的 pfx。然后我可以使用 openssl pkcs12 命令导出私钥。不幸的是,它让我无法加载私钥错误
  • 导出 .key 文件时,请尝试指定 OpenSSL -keyex 选项。如果这没有帮助,请说明您正在使用的 OpenSSL 和 PowerShell 版本,以及您的操作系统平台。
  • 感谢您的回复。 1)我试过 openssl pkcs12 -in -nocerts -nodes -passin pass:Test321 -keyex | sed -ne "/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p" > - 它不起作用 2) 版本:Windows 10 (VM) 5.1.19041.610 OpenSSL 1.1.1h 2020 年 9 月 22 日3)我注意到 sed 之后,我检查了 Notepad++,编码是 UCS-2 LE BOM,这看起来不太正确?

标签: powershell openssl


【解决方案1】:

使用 my prior answer found here 创建您的根证书和中间 CA 证书,并按照上述操作导出 PKCS#12 (.pfx) 文件:

$RootCAthumbprint = $RootCA.Thumbprint
$CertRootCAPassword = ConvertTo-SecureString -String 'Test123' -Force -AsPlainText
$CertRootCAFilePFX = Export-PfxCertificate -Cert "Cert:\LocalMachine\My\$RootCAthumbprint" -FilePath .\KeyCARoot.pfx -Password $CertRootCAPassword
$CertRootCAFileCER = Export-Certificate -Cert $RootCA -FilePath .\KeyCARoot.cer
$CertRootCAFileCER
$CertRootCAPath = '.\KeyCARoot.cer'
Import-Certificate -FilePath .\KeyCARoot.cer -CertStoreLocation Cert:\LocalMachine\Root

...然后使用 OpenSSL 提取未加密的 RSA 私钥,如下所示:

& "C:\Program Files\OpenSSL\1.1.1h\bin\openssl.exe" pkcs12 -nocerts -nodes -in .\KeyCARoot.pfx -out .\KeyCARoot.key -passin pass:Test123

提取未加密的 RSA 私钥后,您可以调用 OpenSSL rsa 获取模数:

& "C:\Program Files\OpenSSL\1.1.1h\bin\openssl.exe" rsa -modulus -noout -in .\KeyCARoot.key

...没有错误,并且包含包属性!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2017-12-26
    相关资源
    最近更新 更多