【问题标题】:New-SelfSignedCertificate on Win2012 r2 has less parametersWin2012 r2 上的 New-SelfSignedCertificate 参数较少
【发布时间】:2016-06-25 17:51:23
【问题描述】:

我正在尝试创建具有特定加密参数值的自签名证书。

在运行 PowerShell 5.0 的 Win Server 2012 r2 标准上,当我尝试使用时

New-SelfSignedCertificate

我收到一个错误:

New-SelfSignedCertificate:找不到与参数名称“主题”匹配的参数。

当我尝试使用 -Subject 参数时,除了我的笔记本电脑上允许的其他参数外,该参数不会出现在智能感知中。

但是在我的笔记本电脑(Win 10 和 PowerShell 5.0)上,我可以使用这些参数,并且我使用以下代码创建了一个自签名证书

#create a Certificate
# OID for document encryption
    $Oid = New-Object System.Security.Cryptography.Oid "1.3.6.1.4.1.311.80.1"
    $oidCollection = New-Object System.Security.Cryptography.OidCollection
    $oidCollection.Add($oid) > $Null
# Create enhanced key usage extension that allows document encryption
$Ext = New-Object System.Security.Cryptography.X509Certificates.X509EnhancedKeyUsageExtension $oidCollection, $true 

$myCert = New-SelfSignedCertificate -Subject 'CN=myservernameasubject' -CertStoreLocation "Cert:\LocalMachine\My" -KeySpec KeyExchange -KeyUsage KeyEncipherment, DataEncipherment -Extension $Ext

【问题讨论】:

    标签: powershell certificate self-signed powershell-5.0


    【解决方案1】:

    使用 -DnsName 代替 CN=

    来自 PowerShell 帮助:

    -DnsName <String> 指定一个或多个 DNS 名称以放入证书的主题备用名称扩展中,当证书是 复制的不是通过 CloneCert 参数指定的。 第一个 DNS name 也保存为 Subject Name 和 Issuer Name。

    遗憾的是,Windows Server 2012 R2 和 Windows 8.1 中的 New-SelfSignedCertificate 不支持 -KeySpec 和其他相关选项。否则,您正在查看生成所需证书的三个选项之一;在How to create a self-signed certificate using C#? 的答案中调整基于 COM 对象的代码以在 PowerShell 中使用,使用像 makecert.exe 这样的外部可执行文件,或者在其他地方生成证书/密钥对,然后将其导入到另一台机器上的证书存储中。

    更新:经过进一步研究,在 PowerShell 中调整基于 COM 的代码似乎是一个不错的选择。我发现了 Vishal Agarwal 的一篇博客文章,Generating a certificate (self-signed) using powershell and CertEnroll interfaces,其中提供了以下 PowerShell 代码:

    $name = new-object -com "X509Enrollment.CX500DistinguishedName.1"
    $name.Encode("CN=TestServer", 0)
    
    $key = new-object -com "X509Enrollment.CX509PrivateKey.1"
    $key.ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
    $key.KeySpec = 1
    $key.Length = 1024
    $key.SecurityDescriptor = "D:PAI(A;;0xd01f01ff;;;SY)(A;;0xd01f01ff;;;BA)(A;;0x80120089;;;NS)"
    $key.MachineContext = 1
    $key.Create()
    
    $serverauthoid = new-object -com "X509Enrollment.CObjectId.1"
    $serverauthoid.InitializeFromValue("1.3.6.1.5.5.7.3.1")
    $ekuoids = new-object -com "X509Enrollment.CObjectIds.1"
    $ekuoids.add($serverauthoid)
    $ekuext = new-object -com "X509Enrollment.CX509ExtensionEnhancedKeyUsage.1"
    $ekuext.InitializeEncode($ekuoids)
    
    $cert = new-object -com "X509Enrollment.CX509CertificateRequestCertificate.1"
    $cert.InitializeFromPrivateKey(2, $key, "")
    $cert.Subject = $name
    $cert.Issuer = $cert.Subject
    $cert.NotBefore = get-date
    $cert.NotAfter = $cert.NotBefore.AddDays(90)
    $cert.X509Extensions.Add($ekuext)
    $cert.Encode()
    
    $enrollment = new-object -com "X509Enrollment.CX509Enrollment.1"
    $enrollment.InitializeFromRequest($cert)
    $certdata = $enrollment.CreateRequest(0)
    $enrollment.InstallResponse(2, $certdata, 0, "")
    

    【讨论】:

    • 我很抱歉,因为我的问题听起来确实具有误导性。我的问题是我需要一种输入加密值的方法,以便证书具有私钥。我知道 DnsName 是替代方案,但它不包括加密参数。
    • 因此,如果您对 DnsName 而不是 Subject 使用相同的命令,它最终只会找到一个不同的参数来抱怨吗?
    • 是的!正如我在问题中提到的,intellisense 没有显示完整的参数列表,当我尝试键入任何丢失的参数时它会抱怨,我可以在笔记本电脑上的 powershell 环境中使用这些参数。
    • @SamersSalib 经过进一步研究后更新。我认为这可能会让你到达你需要去的地方。
    • 啊!必须去常见问题解答以了解如何接受答案。再次感谢您。
    【解决方案2】:

    以下对于自签名选项来说工作得很好......

    New-SelfSignedCertificate -DnsName "*.costoso100.com" -CertStoreLocation "cert:\LocalMachine\My"
    

    我能够在大约 15 分钟内导出和设置 LDAPS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-29
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 2022-12-20
      • 2018-01-19
      相关资源
      最近更新 更多