【问题标题】:Using PowerShell to Create Self-Signed Certificate使用 PowerShell 创建自签名证书
【发布时间】:2012-09-17 16:19:20
【问题描述】:

我正在使用与此处找到的代码类似的代码来创建用于 IIS 的自签名证书: http://blogs.technet.com/b/vishalagarwal/archive/2009/08/22/generating-a-certificate-self-signed-using-powershell-and-certenroll-interfaces.aspx

工作正常,但我想给它一个友好的名称以便在我想将证书分配给动态创建的站点时更容易找到它。

任何人都知道如何更改上述内容以设置友好名称(我已经尝试过看似明显无济于事的方法)。

有更好的方法来通过 PowerShell 创建证书而不提示用户输入信息吗?

跟进我正在使用的脚本 - 基于上面的 url,但变成了一个 cmdlet:

function Add-SelfSignedCertificate
{
    [CmdletBinding()]
    param
    (
            [Parameter(Mandatory=$True, ValueFromPipelineByPropertyName=$True)]
            [Alias('cn')]
            [string]$CommonName
    )

    $name = new-object -com "X509Enrollment.CX500DistinguishedName.1"
    $name.Encode("CN=$CommonName", 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, "")
}

【问题讨论】:

    标签: powershell ssl-certificate


    【解决方案1】:

    它可能对您的特定用途没有帮助,但在 Windows 8.1 和 Server 2012 中安装了一个新的 Powershell CmdLet,它非常快速且易于使用:

    New-SelfSignedCertificate [-CertStoreLocation <String> ] [-CloneCert <Certificate> ] [-DnsName <String> ] [-Confirm] [-WhatIf] [ <CommonParameters>]
    

    更多详情可以在这里找到:https://docs.microsoft.com/en-us/powershell/module/pkiclient/new-selfsignedcertificate?view=win10-ps

    在我的使用中,证书的友好名称一直设置为 CmdLet 中指定的第一个 DnsName。

    将证书放置在本地计算机的个人存储中的示例:

    New-SelfSignedCertificate -CertStoreLocation cert:\LocalMachine\My -DnsName www.example.com
    

    注意:Powershell 必须以管理员权限启动才能正常工作。

    【讨论】:

    • 不应该是cert:\LocalMachine\My吗?我检查了我的 Windows 10 和 2012 Server 机器...没有cert:\LocalComputer
    【解决方案2】:

    你可以直接在你的代码中设置CertificateFriendlyName,你只需要知道在哪里做:

    $enrollment.InitializeFromRequest($cert)
    $enrollment.CertificateFriendlyName = 'whatever'
    $certdata = $enrollment.CreateRequest(0)
    

    $key 有一个 FriendlyName,但我没有看到它出现在任何地方,所以我认为它对你没有帮助。

    【讨论】:

    • 如果有人想查看一个完整的示例,可以在aka.ms/AD2AAD 的脚本中使用 PowerShell 代码来执行此操作。
    【解决方案3】:

    Scott Hanselman 使用 SDK 工具 makecert.exe 编写了一个不错的 blog post on how to create a self-signed cert。该工具看起来比您引用的帖子中的代码更容易使用。使用 makecert.exe,您可以使用 -n 选项指定主题名称。我已经使用该主题名称来引用其他工具(如 signtool.exe)中的证书。虽然,我发现主题名称不必是唯一的,所以我倾向于使用看起来是唯一的指纹值。 Signtool 还将接受指纹(通过 /sha1 参数)来识别证书。

    【讨论】:

    • 这将包含在 InstallShield 脚本中,因此 makecert.exe 显示的弹出对话框有问题。
    • selfssl.exe 会起作用吗? robbagby.com/iis/…
    • makecert.exe 现已弃用。
    猜你喜欢
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多