Як створити самоподпісанний сертифікат в Windows

Більшості адміністраторів Windows, знайомих з темою PKI, відома утиліта MakeCert.exe, за допомогою якої можна створити самоподпісанний сертифікат. Ця утиліта включена до складу Microsoft .NET Framework SDK і Microsoft Windows SDK. У Windows 8 і Windows Server 2012 з'явилася вбудована можливість створення самоподпісанного сертифіката засобами PowerShell 3.0 і вище без використання спеціальних утиліт.

зміст:

  • Використання командлета New-SelfSignedCertificate для створення СЕРТФІКАТА
  • Створюємо самоподпісанний СЕРТФІКАТА типу Code Signing для підписування коду

Використання командлета New-SelfSignedCertificate для створення СЕРТФІКАТА

Для створення самоподпісанного сертифіката в PowerShell пропонується використовувати командлет New-SelfSignedCertificate, що входить до складу модуля PoSh з ім'ям PKI (Public Key Infrastructure).

Щоб вивести список всіх доступних командлетів в модулі PKI, виконайте команду:

Get-Command -Module PKI

Самоподпісанного сертифікати рекомендується використовувати в тестових цілях або для забезпечення сертифікатами внутрішніх інтранет служб (IIS, Exchange, Web Application Proxy, LDAPS, ADRMS, DirectAccess і т.п.), в тих випадку коли з якоїсь причини придбання сертифіката у зовнішнього провайдера або розгортання інфраструктури PKI / CA неможливі.

Порада. Не забувайте також про можливість використання повноцінних безкоштовних SSL сертифікатів від Let's Encrypt. Приклад, як випустити SSL сертифікат Let's Encrypt і прив'язати його до сайту IIS.

Для створення сертифіката потрібно вказати значення -DnsName (DNS ім'я сервера, ім'я може бути довільним і відрізнятися від імені localhost) і -CertStoreLocation (Розділ локального сховища сертифікатів, в який буде поміщений згенерований сертифікат). Командлет можна використовувати для створення самоподпісанного сертифіката в Windows 10 (в нашому прикладі), Windows 8 / 8.1 і Windows Server 2016/2012/2012 R2.

Щоб створити сертифікат для DNS імені test.contoso.com і помістити його в список персональних сертифікатів комп'ютера, виконаємо команду:

New-SelfSignedCertificate -DnsName test.contoso.com -CertStoreLocation cert: \ LocalMachine \ My

Directory: Microsoft.PowerShell.Security \ Certificate :: LocalMachine \ My
Thumbprint Subject
----------                               -------
2779C0490D558B31AAA0CEF2F6EB1A5C2CA83B30 CN = test.contoso.com

За замовчуванням генерується самоподпісанний сертифікат з наступним настройками:

  • Криптографічний алгоритм: RSA;
  • Розмір ключа: 2048 біт;
  • Допустимі варіантів використання ключа:  Client Authentication і Server Authentication;
  • Сертифікат може використовуватися для: Digital Signature, Key Encipherment ;
  • Термін дії сертифіката: 1 рік.

Дана команда створить новий сертифікат і імпортує його в персональне сховище комп'ютера. відкривши оснащення certlm.msc, перевіримо, що в розділі Personal сховища сертифікатів комп'ютера з'явився новий сертифікат.

Як ви бачите, у властивостях сертифіката зазначено, що даний сертифікат може використовуватися для аутентифікації клієнтів (Client Authentication), проте він дійсний і для аутентифікації сервера (Server Authentication).

Примітка. Термін дії такого самоподпісанного сертифіката обмежується 1 роком з моменту його створення. Щоб випустити сертифікат на 3 роки, виконайте наступні команди:

$ Todaydate = Get-Date
$ Add3year = $ todaydate.AddYears (3)
New-SelfSignedCertificate -dnsname test.contoso.com -notafter $ add3year -CertStoreLocation cert: \ LocalMachine \ My

Щоб експортувати отриманий сертифікат c закритим ключем в pfx файл, захищений паролем, нам знадобиться його відбиток (Thumbprint), який потрібно скопіювати з результатів виконання команди New-SelfSignedCertificate:

$ CertPassword = ConvertTo-SecureString -String "YourPassword" -Force -AsPlainText

Export-PfxCertificate -Cert cert: \ LocalMachine \ My \ 2779C0490D558B31AAA0CEF2F6EB1A5C2CA83B30 -FilePath C: \ test.pfx -Password $ CertPassword

Можна експортувати відкритий ключ сертифіката:

Export-Certificate -Cert Cert: \ LocalMachine \ My \ 2779C0490D558B31AAA0CEF2F6EB1A5C2CA83B30 -FilePath C: \ testcert.cer

Отриманий відкритий ключ або сам файл сертифіката можна встановити на веб-сервер або клієнтів домену за допомогою GPO (приклад установки сертифіката на ПК за допомогою групових політик).

Однією з корисних можливостей командлет New-SelfSignedCertificate є можливість створити сертифікат з декількома різними іменами Subject Alternative Names (SAN).

Примітка. Якщо створюється сертифікат з кількома іменами, перше ім'я в параметрі DnsName буде використовуватися в якості CN (Common Name) сертифіката.

Наприклад, створимо сертифікат, у якого вказані наступні імена:

  • Subject Name (CN): adfs1.contoso.com
  • Subject Alternative Name (DNS): web_gw.contoso.com
  • Subject Alternative Name (DNS): enterprise_reg.contoso.com

Команда створення сертифіката буде такою:

New-SelfSignedCertificate -DnsName adfs1.contoso.com, web_gw.contoso.com, enterprise_reg.contoso.com -CertStoreLocation cert: \ LocalMachine \ My

Також можна виписати сертифікат для всього простору імен в домені, для цього в якості імені сервера вказується * .contoso.com.

New-SelfSignedCertificate -certstorelocation cert: \ localmachine \ my -dnsname * .contoso.com

Створюємо самоподпісанний СЕРТФІКАТА типу Code Signing для підписування коду

У PoweShell 3.0 командлет New-SelfSifgnedCertificate генерував тільки SSL сертифікати, які не можна було використовуватися для підписування коду драйверів і додатків (на відміну сертифікатів, що генеруються утилітою MakeCert).

У PowerShell 5 нова версія командлет New-SelfSifgnedCertificate тепер може використовуватися для випуску сертифікатів типу Code Signing.

Для створення самоподпісанного СЕРТФІКАТА для підписування коду додатків, виконайте команду:

$ Cert = New-SelfSignedCertificate -Subject "Cert for Code Signing" -Type CodeSigningCert -CertStoreLocation cert: \ LocalMachine \ My

Спробуємо підписати PowerShell скрипт за допомогою даного сертифікату:

Set-AuthenticodeSignature -FilePath C: \ PS \ test_script.ps1 -Certificate $ cert

Якщо при виконанні команди з'явиться попередження UnknownError, значить цей сертифікат недовірених, тому що знаходиться в персональному сховище сертифікатів користувача.

Потрібно перемістити його в кореневі сертифікати (не забувайте періодично перевіряти сховище сертифікатів Windows на наявність недовірених СЕРТФІКАТА і оновлювати списки кореневих сертифікатів):

Move-Item -Path $ cert.PSPath -Destination "Cert: \ CurrentUser \ Root"

Після цього ви можете підписати свій PowerShell скрипт за допомогою даного самоподпісанного сертифіката.