Большинству администраторов Windows, знакомых с темой PKI, известна утилита MakeCert.exe, с помощью которой можно создать самоподписанный сертификат. Эта утилита включена в состав Microsoft .NET Framework SDK и Microsoft Windows SDK. В современных версиях Windows 11/10/8.1 и Windows Server 2022/2019/2016/2012R2 вы можете создать самоподписанный сертификат с помощью встроенных командлетов PowerShell без использования дополнительных утилит.
Содержание:
- New-SelfSignedCertificate: создать самоподписанный SSL сертификат в PowerShell
- Как сгенерировать SAN (SubjectAltName) сертификат с помощью PowerShell?
- Экспорт самоподписаного сертификата в Windows
- Сгенерировать сертификат для подписи кода типа Code Signing
- Создать самоподписанный SSL сертификат SHA-256 для IIS
New-SelfSignedCertificate: создать самоподписанный SSL сертификат в PowerShell
Для создания самоподписанного сертификата в PowerShell нужно использовать командлет New-SelfSignedCertificate, входящий в состав модуля PKI (Public Key Infrastructure).
Чтобы вывести список всех доступных командлетов в модуле PKI, выполните команду:
Get-Command -Module PKI
Самоподписанные SSL сертификаты рекомендуется использовать в тестовых целях или для обеспечения сертификатами внутренних интранет служб (IIS, Exchange, Web Application Proxy, LDAPS, ADRMS, DirectAccess и т.п.), в тех случая когда по какой-то причине приобретение сертификата у внешнего провайдера или разворачивание инфраструктуры PKI/CA невозможны.
Совет. Не забывайте, что вы можете использования полноценные бесплатные SSL сертификаты от Let’s Encrypt. Например, вы можете SSL сертификат Let’s Encrypt и привязать его к сайту IIS.
Для создания сертификата нужно указать значения -DnsName (DNS имя сервера, имя может быть произвольным и отличаться от имени localhost) и -CertStoreLocation (раздел локального хранилища сертификатов, в который будет помещен сгенерированный сертификат).
Чтобы создать новый SSL сертификат для DNS имени test.contoso.com (указывается FQDN имя) и поместить его в список персональных сертификатов компьютера, выполните команду:
New-SelfSignedCertificate -DnsName test.contoso.com -CertStoreLocation cert:\LocalMachine\My
Команда вернет отпечаток нового сертификата (Thumbprint), Subject и EnhancedKeyUsageList. По умолчанию такой сертификат можно использовать для аутентификации клиента Client Authentication (1.3.6.1.5.5.7.3.2) или сервера Server Authentication (1.3.6.1.5.5.7.3.1).
Если вы запустите эту команду в PowerShell без прав администратор, появится ошибка:
New-SelfSignedCertificate : CertEnroll::CX509Enrollment::_CreateRequest: Access denied. 0x80090010 (-2146893808 NTE_PERM)
Если вы указали нестандартный криптографический провайдер CSPs (например, с помощью параметров
-KeyAlgorithm "ECDSA_secP256r1" -Provider 'Microsoft Smart Card Key Storage Provider'
), убедитесь, что он установлен на компьютере (по умолчанию используется CSP Microsoft Enhanced Cryptographic Provider). Иначе появится ошибка:
New-SelfSignedCertificate: CertEnroll::CX509Enrollment::_CreateRequest: Provider type not defined. 0x80090017 (-2146893801 NTE_PROV_TYPE_NOT_DEF).
По-умолчанию генерируется самоподписанный сертификат со следующим параметрами:
- Криптографический алгоритм: RSA;
- Размер ключа: 2048 бит;
- Допустимые варианты использования ключа: Client Authentication и Server Authentication;
- Сертификат может использоваться для: Digital Signature, Key Encipherment ;
- Срок действия сертификата: 1 год.
- Криптопровадер: Microsoft Software Key Storage Provider
Данная команда создаст новый сертификат и импортирует его в персональное хранилище компьютера. Откройте оснастку certlm.msc и проверьте, что в разделе Personal хранилища сертификатов компьютера появился новый сертификат.
С помощью командлета Get-ChildItem можно вывести все параметры созданного сертификата по его отпечатку (Thumbprint):
Get-ChildItem -Path "Cert:\LocalMachine\My" | Where-Object Thumbprint -eq 76360EAA92D958ECF2717261F75D426E6DB5B4D1 | Select-Object *
PSPath : Microsoft.PowerShell.Security\Certificate::LocalMachine\My\76360EAA92D958ECF2717261F75D426E6 DB5B4D1 PSParentPath : Microsoft.PowerShell.Security\Certificate::LocalMachine\My PSChildName : 76360EAA92D958ECF2717261F75D426E6DB5B4D1 PSDrive : Cert PSProvider : Microsoft.PowerShell.Security\Certificate PSIsContainer : False EnhancedKeyUsageList : {Client Authentication (1.3.6.1.5.5.7.3.2), Server Authentication (1.3.6.1.5.5.7.3.1)} DnsNameList : {test.contoso.com} SendAsTrustedIssuer : False EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty PolicyId : Archived : False Extensions : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid} FriendlyName : HasPrivateKey : True PrivateKey : System.Security.Cryptography.RSACng IssuerName : System.Security.Cryptography.X509Certificates.X500DistinguishedName NotAfter : 12/2/2023 3:41:18 PM NotBefore : 12/2/2022 3:21:18 PM PublicKey : System.Security.Cryptography.X509Certificates.PublicKey RawData : {48, 130, 3, 45…} SerialNumber : 24682351DA9C59874573BA2B5BB39874 SignatureAlgorithm : System.Security.Cryptography.Oid SubjectName : System.Security.Cryptography.X509Certificates.X500DistinguishedName Thumbprint : 76360EAA92D958ECF2717261F75D426E6DB5B4D1 Version : 3 Handle : 2007435579936 Issuer : CN=test.contoso.com Subject : CN=test.contoso.com
Примечание. Срок действия такого самоподписанного сертификата истекает через 1 год с момента его создания. Можно задать другой срок действия сертификата с помощью атрибута —NotAfter.Чтобы выпустить сертификат на 3 года, выполните следующие команды:
$todaydate = Get-Date
$add3year = $todaydate.AddYears(3)
New-SelfSignedCertificate -dnsname test.contoso.com -notafter $add3year -CertStoreLocation cert:\LocalMachine\My
Можно создать цепочку сертификатов. Сначала создается корневой сертификат (CA), а на основании него генерируется SSL сертификат сервера:
$rootCert = New-SelfSignedCertificate -Subject "CN=TestRootCA,O=TestRootCA,OU=TestRootCA" -KeyExportPolicy Exportable -KeyUsage CertSign,CRLSign,DigitalSignature -KeyLength 2048 -KeyUsageProperty All -KeyAlgorithm 'RSA' -HashAlgorithm 'SHA256' -Provider "Microsoft Enhanced RSA and AES Cryptographic Provider"
New-SelfSignedCertificate -CertStoreLocation cert:\LocalMachine\My -DnsName "test2.contoso.com" -Signer $rootCert -KeyUsage KeyEncipherment,DigitalSignature
Чтобы изменить длину ключа сертификата и алгоритм шифрования, нужно использовать параметры
–KeyAlgorithm
,
–KeyLength
и
–HashAlgorithm
. Например:
New-SelfSignedCertificate -KeyAlgorithm RSA -KeyLength 2048 -HashAlgorithm "SHA256"
Если на компьютере доступен модуль TPM 2.0, можно использовать его для защиты ключа:
New-SelfSignedCertificate -Type Custom -Provider "Microsoft Platform Crypto Provider" ...
Провайдер Microsoft Platform Crypto Provider использует Trusted Platform Module чип устройства для создания ассиметричного ключа.
$Params = @{
"DnsName" = "mylocalhostname"
"CertStoreLocation" = "Cert:\\CurrentUser\\My"
"KeyUsage" = "KeyEncipherment","DataEncipherment","KeyAgreement"
"Type" = "DocumentEncryptionCert"
}
New-SelfSignedCertificate @Params
Как сгенерировать SAN (SubjectAltName) сертификат с помощью PowerShell?
Командлет New-SelfSignedCertificate позволяет создать сертификат с несколькими различными именами Subject Alternative Names (SAN).
Примечание. Утилита Makecert.exe, в отличии от командлета New-SelfSignedCertificate, не умеет создавать сертификаты с 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
Также можно сгенерировать wildcard сертификат для всего пространства имен домена, для этого в качестве имени сервера указывается *.contoso.com.
New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -dnsname *.contoso.com
Вы можете привязать сертификат не только к DNS имени, но и к IP адресу. Для этого вместе параметр -DnsName нужно использовать -TextExtension. Например:
New-SelfSignedCertificate -TextExtension @("2.5.29.17={text}IPAddress=10.10.2.3&DNS=TESTServer1&DNS=TESTServer1.local")
Как вы видите, в поле Subject Alternative Name теперь содержится IP адрес.
Экспорт самоподписаного сертификата в Windows
Для экспорта полученного сертификата c закрытым ключом в pfx файл, защищенный паролем, нужно получить его отпечаток (Thumbprint). Сначала нужно указать пароль защиты сертификата и преобразовать его в формат SecureString. Значение 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
Проверьте, что в указанном каталоге появился CER (PFX) файл сертификата. Если щелкнуть по нему правой клавишей и выбрать пункт меню Install Certificate, можно с помощью мастера импорта сертификатов добавить сертификат в корневые доверенные сертификаты компьютера.
Выберите Store location -> Local Machine, Place all certificates in the following store -> Trusted Root Certification Authorities.
Можно создать сертификат и сразу импортировать его в доверенные корневые сертификаты компьютера командами:
$cert=New-SelfSignedCertificate …..
$certFile = Export-Certificate -Cert $cert -FilePath C:\certname.cer
Import-Certificate -CertStoreLocation Cert:\LocalMachine\AuthRoot -FilePath $certFile.FullName
Полученный открытый ключ или сам файл сертификата можно распространить на все компьютеры и сервера в домене с помощью GPO (пример установки сертификата на компьютеры с помощью групповых политик).
Сгенерировать сертификат для подписи кода типа Code Signing
В PoweShell 3.0 командлет New-SelfSifgnedCertificate позволял генерировать только SSL сертификаты, которые нельзя было использоваться для подписывания кода драйверов и приложений (в отличии сертификатов, генерируемых утилитой MakeCert).
В версии PowerShell 5 командлет New-SelfSifgnedCertificate теперь можно использовать чтобы выпустить сертификат типа Code Signing.
Вы можете обновить версию PowerShell согласно инструкции.
Для создания самоподписанного сертфиката для подписывания кода приложений, выполните команду:
$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 скриптов, драйверов или приложений.
Создать самоподписанный SSL сертификат SHA-256 для IIS
Обратите внимание, что при создании самоподписанный сертификат для IIS через консоль Internet Information Manager (пункт меню Create Self-Signed Certificate), создается сертификат с использованием алгоритма шифрования SHA-1. Такие сертификаты многими браузерами считаются недоверенными, поэтому они могут выдавать предупреждение о небезопасном подключении. Командлет New-SelfSignedCertificate позволяет создать более популярный тип сертификата с помощью алгоритма шифрования SHA-256.
Вы можете привязать самоподписанный сертификат SHA-256, созданный в PowerShell, к сайту IIS. Если вы с помощью PowerShell создали SSL сертификат и поместили его в хранилище сертификатов компьютера, он будет автоматически доступен для сайтов IIS.
Запустите консоль IIS Manager, выберите ваш сайт, затем в настройке Site Binding, выберите созданный вами сертификат и сохраните изменения.
Также можно привязать SSL сертификат к сайту IIS по его отпечатку:
New-IISSiteBinding -Name "Default Web Site" -BindingInformation "*:443:" -CertificateThumbPrint $yourCert.Thumbprint -CertStoreLocation "Cert:\LocalMachine\My" -Protocol https
Выпустить самоподписанный SSL сертификат может каждый, для этого достаточно сделать 2 простых шага:
- Установить OpenSSL на Windows;
- Выполнить парочку команд в командной строке.
Самоподписанный SSL сертификат прежде всего нужен тем, кто ведет тестовые работы и впоследствии не хочет работать с переписью урлов в базе данных. Ведь если вы начнете делать ваш проект на без сертификата, то есть на HTTP протоколе, а потом решите перейти на HTTPS, что однозначно будет верным решением, то вы столкнетесь с проблемой Mixed Content на сайте.
Это означает, что часть урлов будет по-прежнему в http формате, а другая часть в https. Чтобы этого избежать и создают самоподписанный SSL сертификат, если нет возможности выпустить пока что полноценный.
Устанавливаем OpenSSL Light
Эта утилита позволит нам быстро создать самоподписанный ssl сертификат для всех наших дальнейших работ.
Вам нужно сделать несколько простых шагов:
1. Скачать OpenSSL Light по ссылочке тут (https://slproweb.com/products/Win32OpenSSL.html), в соответствии с разрядностью вашей системы (у большинство уже 64 бита, но бывают и исключения);
2. Выполнить несложную установку программы без самодеятельности, просто нажимая «Далее», «Принять» и так далее;
3. Далее вам необходимо придумать и создать папку куда будет создан самоподписанный SSL сертификат утилитой OpenSSL, например, в моем случае это будет не системный диск C, а вспомогательный – D:\My Сerts;
4. Запустить от имени администратора командную строку (CMD) и выполнить команду cd /d D:\My Certs – она отправит нас в созданную ранее нами папку для выпуска самоподписанного SSL сертификата;
5. Финальный шаг! Осталось выполнить еще одну команду:
6. После отправки команды на генерацию самоподписанного SSL сертификата система предложит вам заполнить несколько полей, сделать это можно в произвольном формате.
Ну вот и все! Далее нам остается перейти в созданную нами папку, в моем случае это D:\My Сerts и проверить их наличие. В папке должен корректно создаться 2 файла:
- certificate.crt
- privateKeykey
Вот таким нехитрым способом буквально за 10 минут с первой попытки мы создали самоподписанный SSL сертификат на Windows 10. В дальнейшем, такая генерация займет у вас не более 2-х минут, что не может не радовать!
Заключение
Данный способ считается продвинутым, но и само использование самоподписанного сертификата уже говорит о повышенном уровне подготовки и компетенциях. Если вы столкнулись с трудностями и у вас не получается создать самоподписанный SSL сертификат самостоятельно, то правильным решением будет прибегнуть к помощи панелей администрирования сервером, отличным и бесплатным вариантом является FastPanel – ее можно поставить на сервер одной командой и прямо внутри интерфейса создать самоподписанный ssl сертификат без всех этих кодов и прочего.
Я же пишу эту статью, так как столкнулся с проблемой генерации самоподписанного сертификата ssl внутри новой и набирающей популярность AAPanel. Панель отличная, в чем то даже удобнее вышеупомянутой FastPanel, но вот с самоподписанными SSL есть нюансы и сложности – нужно генерировать самостоятельно или уже ставить полноценный Let’s Encrypt, если есть такая возможность.
Как сгенерировать самоподписанный сертификат
Мы уже рассказывали как сгенерировать SSL-сертификат от Let’s Encrypt в операционных системах Windows и Linux. Это полноценные сертификаты, предназначенные для использования в рабочем окружении. Но для тестирования может потребоваться создание большого их количества, а процесс верификации нескольких сертификатов Let’s Encrypt может быть неудобным. Для массовой генерации больше подходят самоподписанные сертификаты.
В TrueConf Server можно генерировать самоподписанные сертификаты прямо в панели управления сервером. Но если по каким-то причинам этот способ вам не подходит или нужно создать самоподписанный сертификат для других продуктов TrueConf (например, TrueConf Group), то это можно сделать с помощью криптографической библиотеки OpenSSL.
Установка OpenSSL и создание сертификата на Windows
- Перейдите на страницу загрузки OpenSSL, скачайте необходимый инсталлятор версии Light в зависимости от разрядности ОС и запустите его.
- После установки программы, необходимо добавить путь к ней как системную переменную. Для этого перейдите в Панель управления → Система → Дополнительные параметры системы → Переменные среды.
В разделе Системные переменные выберите переменную Path и нажмите Изменить. В открывшемся окне нажмите Создать и введите путь к папке bin установленного приложения (
C:\Program Files\OpenSSL-Win64\bin
по умолчанию). Нажмите ОК.Для применения настроек может понадобиться перезагрузка компьютера.
- Создайте папку, куда вы бы хотели сохранить созданные сертификаты (например,
C:\cert
). - Откройте командную строку (cmd) от имени администратора и перейдите в ранее созданную папку (
cd /d C:\cert
). - Выполните следующую команду:
openssl req —x509 —sha256 —nodes —days 365 —newkey rsa:2048 —keyout privateKey.key —out certificate.crt
где:
-x509
— уточнение, что нам нужен именно самоподписанный сертификат;
-newkey
— автоматическое создание ключа сертификата;
-days
— срок действия сертификата в днях;
-keyout
— путь (если указан) и имя файла ключа;
-out
— путь (если указан) и имя файла сертификата. - Последовательно введите: код страны, её название, город, название компании, название отдела, FQDN сервера или ваше имя и адрес электронной почты.
- В папке
C:\cеrt
сгенерируются 2 файла:- certificate.crt — сам сертификат;
- privateKey.key — файл ключа.
Установка OpenSSL и создание сертификата на Linux
Для примера мы рассмотрим генерацию самоподписанного сертификата на сервере с развёрнутой ОС Debian 10.
Для выполнения перечисленных далее команд в ОС должна присутствовать программа sudo и пользователь, под которым они запускаются, должен быть в соответствующей группе. В Debian по умолчанию sudo может отсутствовать, проверьте её наличие командой sudo -V
и установите при необходимости с помощью команды apt install sudo
(выполняется под учётной записью root). А для добавления пользователя с логином user в группу sudo выполните sudo usermod -a -G sudo user
.
Некоторые Linux дистрибутивы поставляются с уже установленным пакетом openssl. Чтобы проверить, установлен ли этот пакет у вас, в терминале выполните в терминале команду openssl version
. Если в ответ появится текст вида OpenSSL 1.1.0l 10 Sep 2019
, то перейдите к шагу 3.
- Обновите установленные в системе пакеты с помощью консольной команды:
sudo apt update && sudo apt —y upgrade
- Установите OpenSSL, введя команду:
- Создайте каталог, куда вы бы хотели сохранить созданные сертификаты с помощью команды mkdir (например,
mkdir /home/$USER/cert
).$USER
– переменная окружения ОС семейства Linux, при использовании в командах она автоматически заменяется на логин текущего пользователя в системе. - Перейдите в ранее созданный каталог с помощью команды cd (например,
cd /home/$USER/cert
). - Выполните шаги 5-6 раздела создания сертификата для Windows.
- В каталоге
/home/$USER/cert
сгенерируются 2 файла:- certificate.crt — сам сертификат;
- privateKey.key — файл ключа.
Попробуйте безопасную ВКС-платформу Труконф!
ВКС-решение TrueConf Server работает внутри вашей закрытой сети без подключения к интернету
и позволяет собирать до 1500 человек в одной конференции!
Крупнейшее ВКС-сообщество в России
Живой диалог с разработчиками, помощь с настройкой ВКС-систем, полезные материалы, ранние доступы и бета-версии — всё в специальном чате @trueconf_talks.
Подписаться
Актуальные новости из мира ВКС
Подписывайтесь на канал нашего информационного партнёра «Видео+Конференция», чтобы быть в курсе последних новостей в сфере видеоконференцсвязи и AV-оборудования.
В этой статье мы расскажем, как создать самоподписанный SSL сертификат в Windows с помощью PowerShell, а также рассмотрим различные способы его использования.
Многие администраторы Windows, знакомые с инфраструктурой PKI, знают утилиту MakeCert.exe, с помощью которой можно выпускать самоподписанные сертификаты. Эта утилита входит в состав Microsoft .NET Framework SDK и Microsoft Windows SDK. В современных версиях Windows (11/10/8.1) и Windows Server (2022/2019/2016/2012R2) вы можете использовать встроенные командлеты PowerShell для создания самоподписанных сертификатов, не прибегая к сторонним утилитам.
Приобрести оригинальные ключи активации Windows всегда можно у нас в каталоге от 1099 ₽
Как создать самоподписанный SSL сертификат в PowerShell
Для создания самоподписанного сертификата в PowerShell используется командлет New-SelfSignedCertificate, который входит в модуль PKI (Public Key Infrastructure).
Чтобы получить список всех доступных командлетов модуля PKI, выполните команду:
Get-Command -Module PKI
Самоподписанные SSL сертификаты обычно используются для тестирования или для обеспечения безопасности внутренних интранет-служб (IIS, Exchange, Web Application Proxy, LDAPS, ADRMS, DirectAccess и т.п.), когда покупка сертификата у внешнего провайдера или разворачивание собственной PKI инфраструктуры не представляется возможным.
Совет: Вы также можете использовать бесплатные SSL сертификаты от Let’s Encrypt, которые подходят для использования на IIS и других веб-серверах.
Для создания сертификата необходимо указать параметры -DnsName (DNS имя сервера, которое может быть произвольным и отличаться от localhost) и -CertStoreLocation (раздел локального хранилища сертификатов, в который будет помещён созданный сертификат).
Для создания нового SSL сертификата с DNS именем test.contoso.com (полное доменное имя) и добавления его в личное хранилище сертификатов компьютера, выполните следующую команду:
New-SelfSignedCertificate -DnsName test.contoso.com -CertStoreLocation cert:\LocalMachine\My
Команда вернёт отпечаток сертификата (Thumbprint), Subject и EnhancedKeyUsageList. По умолчанию такой сертификат можно использовать для аутентификации клиента (Client Authentication (1.3.6.1.5.5.7.3.2)) или сервера (Server Authentication (1.3.6.1.5.5.7.3.1)).
Если команда выполняется без административных прав, может возникнуть ошибка:
New-SelfSignedCertificate : CertEnroll::CX509Enrollment::_CreateRequest: Access denied. 0x80090010 (-2146893808 NTE_PERM)
При использовании нестандартного криптографического провайдера CSP (например, параметров -KeyAlgorithm «ECDSA_secP256r1» -Provider ‘Microsoft Smart Card Key Storage Provider’), убедитесь, что он установлен на вашем компьютере. В противном случае появится ошибка:
New-SelfSignedCertificate: CertEnroll::CX509Enrollment::_CreateRequest: Provider type not defined. 0x80090017 (-2146893801 NTE_PROV_TYPE_NOT_DEF)
Самоподписанный сертификат создаётся по умолчанию со следующими параметрами:
— Криптографический алгоритм: RSA;
— Размер ключа: 2048 бит;
— Использование ключа: Client Authentication и Server Authentication;
— Сертификат может использоваться для: Digital Signature, Key Encipherment;
— Срок действия сертификата: 1 год;
— Криптопровайдер: Microsoft Software Key Storage Provider.
Эта команда создаёт новый сертификат и импортирует его в личное хранилище компьютера. Чтобы убедиться в его успешном добавлении, откройте оснастку certlm.msc и проверьте наличие сертификата в разделе Personal (Личный).
Чтобы вывести все параметры созданного сертификата по его отпечатку (Thumbprint), используйте командлет Get-ChildItem:
Get-ChildItem -Path "Cert:\LocalMachine\My" | Where-Object Thumbprint -eq 76360EAA92D958ECF2717261F75D426E6DB5B4D1 | Select-Object *
Примечание: Срок действия самоподписанного сертификата составляет 1 год с момента его создания. Чтобы задать другой срок действия, используйте параметр -NotAfter. Например, для создания сертификата с трехлетним сроком действия выполните следующие команды:
$todaydate = Get-Date
$add3year = $todaydate.AddYears(3)
New-SelfSignedCertificate -DnsName test.contoso.com -NotAfter $add3year -CertStoreLocation cert:\LocalMachine\My
Создание цепочки сертификатов
Вы можете создать цепочку сертификатов, сначала выпустив корневой сертификат (CA), а затем на его основе сгенерировать SSL сертификат сервера:
$rootCert = New-SelfSignedCertificate -Subject "CN=TestRootCA,O=TestRootCA,OU=TestRootCA" -KeyExportPolicy Exportable -KeyUsage CertSign,CRLSign,DigitalSignature -KeyLength 2048 -KeyUsageProperty All -KeyAlgorithm 'RSA' -HashAlgorithm 'SHA256' -Provider "Microsoft Enhanced RSA and AES Cryptographic Provider"
New-SelfSignedCertificate -CertStoreLocation cert:\LocalMachine\My -DnsName "test2.contoso.com" -Signer $rootCert -KeyUsage KeyEncipherment,DigitalSignature
Для изменения длины ключа и алгоритма шифрования, используйте параметры -KeyAlgorithm, -KeyLength и -HashAlgorithm:
New-SelfSignedCertificate -KeyAlgorithm RSA -KeyLength 2048 -HashAlgorithm "SHA256"
Если на компьютере установлен модуль TPM 2.0, его можно использовать для защиты ключа:
New-SelfSignedCertificate -Type Custom -Provider "Microsoft Platform Crypto Provider"
Создание SAN (SubjectAltName) сертификата с помощью PowerShell
С помощью командлета New-SelfSignedCertificate можно создать сертификат с несколькими именами Subject Alternative Names (SAN).
Если сертификат содержит несколько имен, первое имя из параметра DnsName используется в качестве CN (Common Name). Например, для создания сертификата с несколькими именами используйте следующую команду:
New-SelfSignedCertificate -DnsName adfs1.contoso.com,web_gw.contoso.com,enterprise_reg.contoso.com -CertStoreLocation cert:\LocalMachine\My
Также можно создать wildcard сертификат для всего домена, указав имя сервера как *.contoso.com:
New-SelfSignedCertificate -CertStoreLocation cert:\LocalMachine\My -DnsName *.contoso.com
Вы можете привязать сертификат не только к DNS имени, но и к IP адресу. Для этого используйте параметр -TextExtension вместо -DnsName:
New-SelfSignedCertificate -TextExtension @("2.5.29.17={text}IPAddress=10.10.2.3&DNS=TESTServer1&DNS=TESTServer1.local")
Как вы видите, в поле Subject Alternative Name теперь содержится IP адрес.
Экспорт самоподписанного сертификата в Windows
Для экспорта сертификата с закрытым ключом в pfx файл, защищенный паролем, нужно получить его отпечаток (Thumbprint). Сначала задайте пароль и преобразуйте его в формат SecureString. Значение 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
Проверьте, что в указанном каталоге появился CER (PFX) файл сертификата. Если щелкнуть по нему правой клавишей и выбрать пункт меню Install Certificate, можно с помощью мастера импорта сертификатов добавить сертификат в корневые доверенные сертификаты компьютера.
Выберите Store location -> Local Machine, Place all certificates in the following store -> Trusted Root Certification Authorities.
Создание сертификата для подписи кода (Code Signing)
Начиная с PowerShell 5, командлет New-SelfSignedCertificate можно использовать для создания сертификатов типа 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 скриптов, драйверов или приложений.
Создание самоподписанного SSL сертификата SHA-256 для IIS
При создании самоподписанного сертификата для IIS через консоль Internet Information Manager (пункт меню Create Self-Signed Certificate) создаётся сертификат с использованием алгоритма SHA-1, который многими браузерами считается небезопасным. Чтобы создать сертификат с использованием алгоритма SHA-256, используйте командлет New-SelfSignedCertificate.
Вы можете привязать самоподписанный сертификат SHA-256, созданный в PowerShell, к веб-сайту в IIS. Сертификат, помещённый в хранилище сертификатов компьютера, автоматически становится доступен для сайтов в IIS.
Откройте консоль IIS Manager, выберите сайт и в настройках Site Binding укажите созданный вами сертификат, затем сохраните изменения.
Для привязки SSL сертификата к сайту по его отпечатку используйте команду:
New-IISSiteBinding -Name "Default Web Site" -BindingInformation "*:443:" -CertificateThumbPrint $yourCert.Thumbprint -CertStoreLocation "Cert:\LocalMachine\My" -Protocol https
We need to a create self-signed certificate for local development so that the local development server behaves similar to a live production server. Additionally the certificate must not generate warnings in the browser (Chromium based browsers only) that the certificate is self-signed and can’t be trusted.
Developing locally with plain http is just fine. But sometimes we need to mimic development with production so that TLS encryption via https is available also on our development machines. We also don’t want to see ugly security warnings from browsers. The following article shows how to create self-signed certificates on Windows that doesn’t generate browser warnings on Chrome and other Chromium based browsers.
The article is a bit long but please grab a coffee and follow along. The result is worth the effort as you only need to generate the certificate once in a very long time. I set the expiry date 10 years in the future for the domains I create for local development.
Goal: Create an imaginary domain pdb.oak.san with a self-signed certificate that works on major browsers (except Firefox) without generating a warning. Works great on Chromium based browsers like Chrome, Canary, Microsoft Edge and Opera, IE.
Step 1: Setup hostname
- Open Notepad in Administrator mode: Click Windows Start icon in task bar and start typing Notepad, right click the Notepad icon and click Run as administrator
- Inside Notepad, open the file:
C:\Windows\System32\drivers\etc\hosts
- We want to create an imaginary domain:
pdb.oak.san
, add the following line to the hosts file:
- Save the file and close
Step 2: Create a client-side self-signed certificate
- Open PowerShell in Administrator mode: Click Windows Start icon in task bar and start typing PowerShell, right click the PowerShell icon and click Run as administrator
- Type the following to generate a self-signed certificate for domain
pdb.oak.san
with friendly namepdb.oak.san
that expires after 10 years:
New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "pdb.oak.san" -FriendlyName "pdb.oak.san" -NotAfter (Get-Date).AddYears(10)
- You should get the following output
Step 3: Copy the certificate created in Step 2 to Trusted Root Certification Authorities, then export it
- Open Management Console for Certificates: Click Windows Start icon and start typing certificates, click Manage computer certificates
- On the left panel, click Personal -> Certificates, you should see the client-side certificate for pdb.oak.san created above in Step 2
- On the left panel, open the tree for (but don’t left click the folder) Certification Authorities -> Certificates
- With the right mouse button, drag and drop the certificate to the location opened in the previous step
- Now export the certificate: right-click the certificate, All Tasks -> Export…
- Welcome screen appears, click Next
- Select Yes, export the private key, click Next
- Keep the default values for .PFX, click Next
- Type a password for the private key, click Next
- Browse for a location and give the certificate a name (cert.pfx), click Next
- Finally click Finish
- You will get a notice that the export was successful
Step 4: Create the server-side certificate and key
- Pre-requisite: you need to have OpenSSL https://www.openssl.org/ installed. Since you are a developer and on Windows, it’s highly likely you already have https://git-scm.com/ installed, so you should also have OpenSSL installed. Otherwise we recommend installing Git for Windows with Git Bash support – this will automatically also install OpenSSL.
- Open Command Prompt and change directory to the location where you exported the certificate with .PFX extension cert.pfx in Step 3 above.
- Type the following commands in the Command Prompt one by one. When prompted for password, type the password you used in Step 3 above when exporting the .PFX certificate.
$ openssl pkcs12 -in cert.pfx -nocerts -out key.pem -nodes $ openssl pkcs12 -in cert.pfx -nokeys -out cert.pem $ openssl rsa -in key.pem -out server.key
- You should now have the following files in the folder, we will be using the cert.pem and server.key files. You can delete the other files if you want to.
cert.pem --> KEEP server.key --> KEEP cert.pfx key.pem
Step 5: Test
- You can use Apache or Nginx to test the https connection for the pdb.oak.san domain. We will create a simple Go server as it can be created really fast with a few lines of code. Create a file called main.go and type the code below. Make sure cert.pem and server.key is in the same folder as the main.go file.
package main import ( "fmt" "net/http" ) func handleHome(w http.ResponseWriter, r *http.Request) { _, _ = fmt.Fprintln(w, "Home page to test the TLS cert and secure https connection") } func main() { http.HandleFunc("/", handleHome) s:=http.Server{} _ = s.ListenAndServeTLS("cert.pem", "server.key") }
- Build and run the Go server:
go build main.go
, then run the resulting executable programmain.exe
- Now if we visit https://pdb.oak.san/ in a browser, we can see the home page with the following content: “Home page to test the TLS cert and secure https connection”
- We can also check the certificate by clicking on the lock icon in the browser address bar:
For Nginx Users
To test on Nginx instead of writing Go code, you can use the configuration below.
- Make sure to copy your cert.pem and server.key to the locations for ssl_certificate and ssl_certificate_key.
- Folder paths like
C:\Users\sanji\pdn\pdb.oak.san\www
should of course match the locations in your own computer.
server { listen 443 ssl; server_name pdb.oak.san; root C:\Users\sanji\pdn\pdb.oak.san\www; access_log C:\Users\sanji\pdn\pdb.oak.san\logs\access.log; error_log C:\Users\sanji\pdn\pdb.oak.san\logs\error.log; index index.html; ssl_certificate C:\Users\sanji\pdn\pdb.oak.san\ssl\cert.pem; ssl_certificate_key C:\Users\sanji\pdn\pdb.oak.san\ssl\server.key; }
The video below shows the steps I took to setup SSL on an imaginary domain on my local machine. The video is 20 minutes; maybe I could have been done the video in 10 minutes or less. But here I am showing the actual problems I am running into and the steps I am taking to solve them.
Setting up domains, servers and certificates in real-life is not without problems. This is not a scripted video. It shows the problems I face and how I resolve them.
This a scenario where you have created personal certificates and digitally signed them on your own and now you want them available and trusted on another machine.