我正在使用类似于此处的代码来创建在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, "")
}
答案 0 :(得分:13)
它可能对您的特定用途没有帮助,但在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才能实现此目的。
答案 1 :(得分:3)
您可以直接在代码中设置CertificateFriendlyName
,只需知道在哪里执行操作:
$enrollment.InitializeFromRequest($cert)
$enrollment.CertificateFriendlyName = 'whatever'
$certdata = $enrollment.CreateRequest(0)
$key
有一个友好名称,但我没有看到它出现在任何地方,所以我认为它不会对你有所帮助。
答案 2 :(得分:0)
Scott Hanselman使用SDK工具makecert.exe写了一篇不错的blog post on how to create a self-signed cert。该工具看起来比您引用的帖子中的代码更容易使用。使用makecert.exe,您可以使用-n选项指定主题名称。我已经使用该主题名称来引用signtool.exe等其他工具中的证书。虽然,我发现主题名称不一定是唯一的,所以我倾向于使用看似独特的Thumbprint值。 Signtool还将接受指纹(通过/ sha1参数)来识别证书。