Більшості адміністраторів 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 скрипт за допомогою даного самоподпісанного сертифіката.