6

ここにあるようなコードを使用して、IIS で使用する自己署名証明書を作成しています: http://blogs.technet.com/b/vishalagarwal/archive/2009/08/22/generating-a-certificate-自己署名を使用して-powershell-and-certenroll-interfaces.aspx

動的に作成されたサイトに証明書を割り当てたいときに簡単に見つけられるようにわかりやすい名前を付けたいことを除いて、正常に動作します。

上記を変更してフレンドリ名を設定する方法を知っている人は誰でも(私は明らかに役に立たないように思われることを試しました)。

ユーザーに情報の入力を求めない PowerShell 経由で証明書を作成するより良い方法はありますか?

私が使用しているスクリプトのフォローアップ-上記のURLに基​​づいていますが、コマンドレットに変わりました:

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

3 に答える 3

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 を管理者権限で起動する必要があります。

于 2014-05-30T21:40:43.480 に答える
3

コードで直接設定できCertificateFriendlyNameます。どこでそれを行うかを知る必要があります。

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

$keyには FriendlyName がありますが、それがどこにも表示されないので、役に立たないと思います。

于 2012-10-22T20:42:52.597 に答える
0

Scott Hanselman は、SDK ツールの makecert.exe を使用して自己署名証明書を作成する方法について、すばらしいブログ投稿を作成しました。そのツールは、あなたが参照している投稿のコードよりも使いやすいようです。makecert.exe では、-n オプションを使用してサブジェクト名を指定できます。そのサブジェクト名を使用して、signtool.exe などの他のツールで証明書を参照しました。ただし、サブジェクト名は一意である必要はないことがわかったので、一意に見える拇印の値を使用する傾向があります。Signtool は、証明書を識別するために (/sha1 パラメーターを介して) 拇印も受け入れます。

于 2012-09-17T16:57:40.540 に答える