通过PowerShell创建PEM文件

bug*_*sam 5 powershell rsa certificate

我正在尝试编写一个脚本来在 powershell 中创建 PEM 证书文件。我不确定我所做的是否完全错误,但是当我尝试在 socat OPENSSL 中使用 PEM 文件时,它返回了错误:

$ socat OPENSSL-LISTEN:1337,cert=cert.pem,verify=0 -

socat[1209] E SSL_CTX_use_certificate_file(): error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag
Run Code Online (Sandbox Code Playgroud)
#create certificate
$cert = New-SelfSignedCertificate `
    -Subject "MYHOSTNAME" `
    -TextExtension @("2.5.29.17={text}DNS=MYHOSTNAME&IPAddress=192.168.1.100") `
    -KeySpec Signature `
    -HashAlgorithm SHA256 `
    -KeyExportPolicy Exportable

#publicKey
$PublicKey = $cert.GetPublicKey();
$PublicKeyB64 = [Convert]::ToBase64String($PublicKey,"InsertLineBreaks");

#privateKey
$RSACng  = [System.Security.Cryptography.X509Certificates.RSACertificateExtensions]::GetRSAPrivateKey($cert);
$PrivateKey = $RSACng.Key;
$PrivateKeyByte = $PrivateKey.Export("PRIVATEBLOB");
$PrivateKeyB64 = [Convert]::ToBase64String($PrivateKeyByte,"InsertLineBreaks");

#createFile
$out = New-Object string[] -ArgumentList 6;
$out[0] = "-----BEGIN PRIVATE KEY-----";
$out[1] = $PrivateKeyB64;
$out[2] = "-----END PRIVATE KEY-----"

$out[3] = "-----BEGIN CERTIFICATE-----"
$out[4] = $publicKeyB64;
$out[5] = "-----END CERTIFICATE-----"

[IO.File]::WriteAllLines("C:\Users\Public\cert.pem",$out)
Run Code Online (Sandbox Code Playgroud)

我不确定我所做的是否完全错误,但我找不到任何资源来帮助我继续。

一些执行在 powershell 中创建 PEM 文件的类似操作的脚本或一些有关如何继续的提示可能对帮助我解决此问题很有价值。

dav*_*085 2

正如所评论的,您放入两个 PEM 文件正文中的数据是错误的。

对于证书,很简单,只需使用$cert.RawData(转换为带有换行符的 base64,就像您已经拥有的那样)。

对于私钥,根据文档RSA返回的摘要GetRSAPrivateKey($cert)( not .Key ) 及其实现,例如RSACng具有方法ExportPkcs8PrivateKey(),这些方法应该是放入 PEM 类型文件中的正确数据BEGIN/END PRIVATE KEY,并且ExportRSAPrivateKey()也应该是对于 PEM 正确的旧格式文件类型BEGIN/END RSA PRIVATE KEY——但仅限于 Core 3.0+ 和 5,我没有,因此无法测试。

openssl如果您有命令行,解决方法是转换Export-PfxCertificate为文件,openssl pkcs12 [-nodes]然后将其转换为 OpenSSL(以及 OpenSSL)喜欢的 PEM 格式socat。但是,如果您有openssl命令行,您可以轻松地使用它直接生成私钥和(自签名/虚拟)证书,而无需使用 powershell。