Как создать самоподписанный сертификат в PowerShell

Быстрые ссылки
Создание самоподписанного сертификата
Проверка информации о сертификате
Сертификат для подписи кода
Сертификат для защиты документов
Краткое резюме
Самоподписанные сертификаты — удобный инструмент для тестирования и выполнения менее критичных задач. Они не имеют цепочки доверия от публичного центра сертификации и подписываются тем же субъектом, который их создал. Если вы доверяете создателю сертификата (например, собственной тестовой машине или внутреннему серверу), вы можете использовать такой сертификат как временное решение.
Если нужно быстро создать самоподписанный сертификат, один из способов — PowerShell. Ниже показано, как это сделать, как проверить результат и какие типы сертификатов чаще всего нужны.
Создание самоподписанного сертификата
В PowerShell для создания самоподписанного сертификата используется команда New-SelfSignedCertificate. Эта команда включена в модуль PKI.
Существует несколько типов сертификатов, часто используемых при создании самоподписанных сертификатов:
- SSLServerAuthentication — обычно по умолчанию для защиты HTTPS (сертификат сервера).
- CodeSigning — для подписи скриптов и исполняемых файлов.
- DocumentEncryptionCert — для шифрования файлов и обмена данными между системами.
- Custom — позволяет задать собственные параметры.
Ниже пример создания обычного сертификата SSLServerAuthentication для сайта. В примере сертификат сохраняется в хранилище Cert:LocalMachineMy.
$Params = @{
"DnsName" = @("mywebsite.com","www.mywebsite.com")
"CertStoreLocation" = "Cert:LocalMachineMy"
"NotAfter" = (Get-Date).AddMonths(6)
"KeyAlgorithm" = "RSA"
"KeyLength" = "2048"
}
PS C:> New-SelfSignedCertificate @Params
PSParentPath: Microsoft.PowerShell.SecurityCertificate::LocalMachineMy
Thumbprint Subject EnhancedKeyUsageList
---------- ------- --------------------
4EFF6B1A0F61B4BG692C77F09889BD151EE8BB58 CN=mywebsite.com {Client Authentication, Server Authentication}Если команда выполнена успешно, вы увидите информацию о вновь созданном сертификате. Обратите внимание: в поле Subject отображается только первый элемент из DnsName; остальные адреса попадают в Subject Alternative Name (SAN) и видны в DnsNameList при проверке.
Важно: запуск New-SelfSignedCertificate требует прав администратора при записи в хранилище LocalMachine. При запуске без прав вы получите ошибку вида:
New-SelfSignedCertificate: CertEnroll::CX509Enrollment::_CreateRequest: Access denied. 0x80090010 (-2146893808 NTE_PERM)
Проверка информации о сертификате
Чтобы убедиться, что сертификат создан правильно, используйте Get-ChildItem с провайдером Cert:. Эта команда работает аналогично перебору файлов в папке.
PS C:> Get-ChildItem -Path "Cert:LocalMachineMy" | Where-Object Thumbprint -EQ 4EFF6B1A0F61B4BF692C77F09889AD151EE8BB58 | Select-Object *
PSPath : Microsoft.PowerShell.SecurityCertificate::LocalMachineMy4EFF6B1A0F61B4BF692C77F09889AD151EE8BB58
PSParentPath : Microsoft.PowerShell.SecurityCertificate::LocalMachineMy
PSChildName : 4EFF6B1A0F61B4BF692C77F09889AD151EE8BB58
PSDrive : Cert
PSProvider : Microsoft.PowerShell.SecurityCertificate
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 : {mywebsite.com, www.mywebsite.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 : 6/22/2020 11:50:15 AM
NotBefore : 12/22/2019 10:40:20 AM
PublicKey : System.Security.Cryptography.X509Certificates.PublicKey
RawData : {48, 130, 3, 55...}
SerialNumber : 608C4D5E6B8D41B44ADDC6BD725FE264
SignatureAlgorithm : System.Security.Cryptography.Oid
SubjectName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
Thumbprint : 4EFF6B1A0F61B4BF692C77F09889AD151EE8BB58
Version : 3
Handle : 2628421609632
Issuer : CN=mywebsite.com
Subject : CN=mywebsite.comКлючевые поля для проверки:
- DnsNameList — SAN (все DNS-имена).
- NotBefore / NotAfter — период действия (в примере — 6 месяцев).
- HasPrivateKey — должен быть True, если вам нужен приватный ключ на машине.
- EnhancedKeyUsageList — указывает назначение сертификата (Server Authentication, Code Signing и т.д.).
Сертификат для подписи кода
Если у вас политика выполнения PowerShell установлена в AllSigned, нужно подписывать скрипты. Создать сертификат для подписи кода просто:
PS C:> New-SelfSignedCertificate -Type 'CodeSigningCert' -DnsName 'MyHost'
PSParentPath: Microsoft.PowerShell.SecurityCertificate::LocalMachineMY
Thumbprint Subject EnhancedKeyUsageList
---------- ------- --------------------
14D535EG834370293BA103159EB00876A79959D8 CN=MyHost Code SigningПосле создания следует экспортировать приватный ключ в PFX (с паролем) для переноса на другие машины или на CI/CD агент. Пример экспорта:
$cert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object Thumbprint -EQ '14D535EG834370293BA103159EB00876A79959D8'
$pwd = ConvertTo-SecureString -String 'StrongPasswordHere' -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath C:\temp\codesign.pfx -Password $pwdКритерии приёмки:
- Скрипт успешно подписывается и запускается при ExecutionPolicy AllSigned.
- Приватный ключ хранится в защищённом PFX с надёжным паролем.
Сертификат для защиты документов
PowerShell вместе с Data Protection API (DPAPI) или с помощью CMS позволяет шифровать файлы. Для сценариев, где нужно переносить зашифрованный файл между машинами, удобен DocumentEncryptionCert.
$Params = @{
"DnsName" = "MyHost"
"CertStoreLocation" = "Cert:CurrentUserMy"
"KeyUsage" = "KeyEncipherment","DataEncipherment","KeyAgreement"
"Type" = "DocumentEncryptionCert"
}
PS C:> New-SelfSignedCertificate @Params
Thumbprint Subject EnhancedKeyUsageList
---------- ------- --------------------
14D535EG934370293BA203159EB00876A79959D8 CN=MyHost Document EncryptionС помощью такого сертификата вы можете использовать команды Protect-CMSMessage и UnProtect-CMSMessage для шифрования/расшифровки сообщений:
Protect-CmsMessage -To 'Cert:\CurrentUser\My\' -Content 'секрет'
Unprotect-CmsMessage -Path '.\message.cms' Преимущество DocumentEncryptionCert перед DPAPI: данные можно расшифровать на других системах при наличии соответствующего приватного ключа.
Когда самоподписанный сертификат не подходит
- Публичные веб-сайты: браузеры сообщат об ошибке доверия — нужен сертификат от доверенного CA.
- Публичные API: клиенты/партнёры могут отклонить соединение без доверенной цепочки.
- Соответствие стандартам и аудит: многие стандарты требуют сертификатов от признанных центров сертификации.
Мини-методология для безопасного использования
- Определите цель сертификата (HTTPS, подпись кода, обмен данными).
- Выберите хранилище: LocalMachine для сервисов, CurrentUser для пользователя.
- Установите минимальный срок действия (для теста — 1–6 месяцев).
- Ограничьте KeyUsage/EnhancedKeyUsage под задачу.
- Защитите приватный ключ (экспорт в PFX с паролем, HSM или защищённое хранилище).
- Документируйте Thumbprint и местоположение хранения, удалите лишние тестовые сертификаты.
Чек-листы по ролям
Администратор инфраструктуры:
- Создать сертификат в LocalMachine с нужными SAN.
- Проверить HasPrivateKey и срок действия.
- Настроить автоматическую ротацию или напоминания.
Разработчик:
- Использовать самоподписанный сертификат для локальной разработки.
- Экспортировать сертификат без приватного ключа для проверки TLS.
Инженер безопасности:
- Убедиться, что самоподписанный сертификат не используется в продакшене.
- Проверить хранение и доступ к приватным ключам.
Примеры, когда это может провалиться
- Перенос сертификата на другую машину без экспорта приватного ключа — расшифровка станет невозможной.
- Использование слабых ключей (RSA 1024) — риск компрометации.
- Хранение паролей PFX в открытом виде в репозитории — утечка.
Безопасная настройка и жёсткие рекомендации
- Используйте RSA 2048 или выше (или ECC) для новых сертификатов.
- Минимизируйте срок действия для тестовых сертификатов.
- При необходимости переноса — экспортируйте в PFX и шифруйте пароль.
- Рассмотрите использование внутреннего корпоративного CA для внутренних сервисов вместо широкого распространения самоподписанных сертификатов.
Decision flowchart
flowchart TD
A[Нужен сертификат?] --> B{Для чего}
B -->|Публичный веб| C[Получить у доверенного CA]
B -->|Тест/локальная dev| D[Самоподписанный сертификат]
B -->|Подпись кода| E[CodeSigningCert + экспорт PFX]
B -->|Шифрование файлов| F[DocumentEncryptionCert]
D --> G[Ограничить срок и хранение ключа]Глоссарий (1 строка каждому термину)
- SAN (Subject Alternative Name) — список дополнительных имен (DNS/IP) для сертификата.
- Thumbprint — уникальный отпечаток сертификата (хеш).
- PFX — формат файла, содержащего сертификат и приватный ключ (обычно защищён паролем).
- DPAPI — встроенный в Windows API для защиты данных, привязанный к пользователю/машине.
Краткое резюме
PowerShell предоставляет быстрый и гибкий способ создавать самоподписанные сертификаты для тестирования, подписи кода и шифрования документов. Соблюдайте практики безопасности: используйте современные алгоритмы, защищённое хранение приватных ключей и не применяйте самоподписанные сертификаты там, где требуется доверенная цепочка сертификации.
Важно: самоподписанные сертификаты — инструмент для разработки и тестов, а не замена сертификатов, выданных доверенным центром сертификации.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента