使用PowerShell创建自签名证书

使用PowerShell创建自签名证书,powershell,ssl-certificate,Powershell,Ssl Certificate,我正在使用与此处类似的代码创建一个自签名证书,以在IIS中使用: 工作正常,但我想给它一个友好的名称,以便在我想将证书分配给动态创建的站点时更容易找到它 任何人都知道如何更改上面的设置友好的名称(我已经尝试了似乎明显无效的方法) 是否有更好的方法通过PowerShell创建证书,而不提示用户输入信息 我正在使用的脚本的后续操作-基于上面的url,但已转换为cmdlet: function Add-SelfSignedCertificate { [CmdletBinding()]

我正在使用与此处类似的代码创建一个自签名证书,以在IIS中使用:

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

任何人都知道如何更改上面的设置友好的名称(我已经尝试了似乎明显无效的方法)

是否有更好的方法通过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, "")
}

Scott Hanselman使用SDK工具makecert.exe编写了一个不错的应用程序。该工具看起来比您引用的文章中的代码更易于使用。使用makecert.exe,您可以使用-n选项指定主题名称。我在其他工具(如signtool.exe)中使用了该主题名称来引用证书。尽管如此,我发现主题名称不必是唯一的,所以我倾向于使用看起来唯一的指纹值。Signtool还将接受指纹(通过/sha1参数)来识别证书。

您可以直接在代码中设置
CertificateFriendlyName
,您只需知道在何处操作:

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

$key
有一个FriendlyName,但我看不到它出现在任何地方,因此我认为它对您没有帮助。

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

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

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

这将包含在InstallShield脚本中,因此makecert.exe显示的弹出对话框有问题。selfssl.exe是否正常工作
makecert.exe
现在已被弃用。如果有人希望看到一个完全工作的示例,则在的脚本中有PowerShell代码可以执行此操作。它是否应该是
cert:\LocalMachine\My
?我检查了我的windows 10和2012服务器机器。。。没有人拥有
证书:\LocalComputer
New-SelfSignedCertificate -CertStoreLocation cert:\LocalMachine\My -DnsName www.example.com