2012-09-17 182 views
5

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

工作正常,除了我想给它一个友好的名称当我想将证书分配给一个动态创建的站点时,使它更容易定位。

任何人都知道如何改变上面的设置友好名称(我试过什么似乎很明显无济于事)。

有更好的方式通过PowerShell创建一个不会提示用户输入信息的证书吗?

在我使用的脚本跟进 - 基于上面的网址,但变成了小命令:

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, "") 
} 

回答

0

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

+0

这将包含在InstallShield脚本中,因此makecert.exe显示的弹出对话框有问题。 – roderickprince

+0

将selfssl.exe工作? http://www.robbagby.com/iis/self-signed-certificates-on-iis-7-the-easy-way-and-the-most-effective-way/ –

3

您可以直接设置在CertificateFriendlyName你的代码,你只需要知道在哪里可以做到这一点:

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

$key拥有的FriendlyName,但我不认为这显示了任何地方,所以我不知道认为它可以帮助你。

+0

如果有人希望看到一个完整的工作例如,脚本中有PowerShell代码可以在http://aka.ms/AD2AAD中执行此操作。 –

11

它可能不会帮助你的具体使用,但安装在Windows 8.1和Server 2012中新的PowerShell命令,这是非常快速和容易使用:

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

更多细节可以在这里找到: http://technet.microsoft.com/en-us/library/hh848633.aspx

在我的用法中,cert的友好名称始终设置为在CmdLet中指定的第一个DnsName。

例子会将证书本地计算机的个人存储区:

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

注:PowerShell有与此管理权限的工作开始。

+0

它应该不是'cert:\ LocalMachine \ My'?我检查了我的Windows 10和2012 Server服务器...没有'cert:\ LocalComputer'。 – Lucas