我正在尝试编写一个脚本来在 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
#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)
我不确定我所做的是否完全错误,但我找不到任何资源来帮助我继续。
一些执行在 powershell 中创建 PEM 文件的类似操作的脚本或一些有关如何继续操作的提示可能有助于帮助我解决此问题。
正如所评论的,您放入两个 PEM 文件正文中的数据是错误的。
对于证书,很简单,只需使用$cert.RawData
(转换为带有换行符的 base64,就像您已经拥有的那样)。
对于私钥,根据文档RSA
摘要返回者GetRSAPrivateKey($cert)
(not .Key
)因此它的实现就像RSACng
有方法ExportPkcs8PrivateKey() https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.asymmetricalgorithm.exportpkcs8privatekey?view=net-5.0#System_Security_Cryptography_AsymmetricAlgorithm_ExportPkcs8PrivateKey这应该是放入 PEM 类型文件中的正确数据BEGIN/END PRIVATE KEY
并且ExportRSAPrivateKey() https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.rsa.exportrsaprivatekey?view=net-5.0#System_Security_Cryptography_RSA_ExportRSAPrivateKey这应该是对于 PEM 文件类型正确的旧格式BEGIN/END RSA PRIVATE KEY
-- 但仅限于 Core 3.0+ 和 Core 5,我没有,因此无法测试。
如果您有解决方法openssl
命令行是Export-PfxCertificate
到一个文件,其中openssl pkcs12 [-nodes]
然后可以转换为 PEM 格式 OpenSSL(因此socat
) 喜欢。但如果你有openssl
通过命令行,您可以轻松地使用它直接生成私钥和(自签名/虚拟)证书,而无需使用 powershell。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)