2012-09-17 31 views
5

Tôi đang sử dụng mã tương tự như tìm thấy ở đây để tạo ra một chứng chỉ tự ký để sử dụng trong IIS: http://blogs.technet.com/b/vishalagarwal/archive/2009/08/22/generating-a-certificate-self-signed-using-powershell-and-certenroll-interfaces.aspxSử dụng PowerShell để tạo Self-Signed Certificate

trình tốt, ngoại trừ tôi muốn cung cấp cho nó một cái tên thân thiện để xác định vị trí dễ dàng hơn khi tôi muốn chỉ định chứng chỉ cho trang web được tạo động.

Bất cứ ai cũng biết cách thay đổi phần trên để đặt tên thân thiện (tôi đã thử những gì dường như rõ ràng là không có sẵn).

Có cách nào tốt hơn để tạo chứng chỉ qua PowerShell không nhắc người dùng cung cấp thông tin?

Số trên kịch bản tôi đang sử dụng - dựa trên url trên nhưng biến thành một 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, "") 
} 

Trả lời

0

Scott Hanselman viết lên một đẹp blog post on how to create a self-signed cert sử dụng makecert.exe công cụ SDK. Công cụ đó trông có vẻ dễ sử dụng hơn so với mã trong bài đăng mà bạn tham khảo. Với makecert.exe, bạn có thể sử dụng tùy chọn -n để chỉ định tên chủ đề. Tôi đã sử dụng tên chủ đề đó để tham khảo chứng chỉ trong các công cụ khác như signtool.exe. Mặc dù, tôi đã tìm thấy rằng tên chủ đề không phải là duy nhất vì vậy tôi có xu hướng sử dụng giá trị Thumbprint mà dường như là duy nhất. Signtool cũng sẽ chấp nhận một dấu vân tay (thông qua tham số/sha1) để xác định chứng chỉ.

+0

Điều này sẽ được bao gồm trong một kịch bản InstallShield do đó các hộp thoại popup makecert.exe hiển thị là có vấn đề. – roderickprince

+0

Công việc selfssl.exe có hoạt động không? http://www.robbagby.com/iis/self-signed-certificates-on-iis-7-the-easy-way-and-the-most-effective-way/ –

3

Bạn có thể đặt trực tiếp trong CertificateFriendlyName bạn mã, bạn chỉ cần biết nơi để làm điều đó:

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

$key có FriendlyName nhưng tôi không thấy hiển thị bất cứ nơi nào vì vậy tôi không nghĩ rằng nó giúp bạn.

+0

Nếu ai đó muốn thấy một công việc hoàn toàn ví dụ có mã PowerShell để làm điều này trong kịch bản tại http://aka.ms/AD2AAD. –

11

Nó có thể không giúp cho việc sử dụng cụ thể của bạn, nhưng có một PowerShell cmdlet mới được cài đặt trong Windows 8.1 và Server 2012 đó là khá nhanh chóng và dễ sử dụng:

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

Thông tin chi tiết có thể được tìm thấy ở đây: http://technet.microsoft.com/en-us/library/hh848633.aspx

Trong cách sử dụng của tôi, tên thân thiện của cert luôn được đặt làm DnsName đầu tiên được chỉ định trong CmdLet.

Ví dụ mà đặt chứng chỉ trong cửa hàng cá nhân Local Computer của bạn:

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

Lưu ý: Powershell phải được bắt đầu với quyền quản trị để làm việc này.

+0

không nên là 'cert: \ LocalMachine \ My'? Tôi đã kiểm tra trên cửa sổ của tôi 10 và 2012 Máy chủ ... Không có 'cert: \ LocalComputer'. – Lucas

Các vấn đề liên quan