Гид по технологиям

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

• 5 min read • Security • Обновлено 24 Nov 2025
Самоподписанный сертификат в PowerShell
Самоподписанный сертификат в PowerShell

Схема создания и проверки самоподписанного сертификата в 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: клиенты/партнёры могут отклонить соединение без доверенной цепочки.
  • Соответствие стандартам и аудит: многие стандарты требуют сертификатов от признанных центров сертификации.

Мини-методология для безопасного использования

  1. Определите цель сертификата (HTTPS, подпись кода, обмен данными).
  2. Выберите хранилище: LocalMachine для сервисов, CurrentUser для пользователя.
  3. Установите минимальный срок действия (для теста — 1–6 месяцев).
  4. Ограничьте KeyUsage/EnhancedKeyUsage под задачу.
  5. Защитите приватный ключ (экспорт в PFX с паролем, HSM или защищённое хранилище).
  6. Документируйте 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 предоставляет быстрый и гибкий способ создавать самоподписанные сертификаты для тестирования, подписи кода и шифрования документов. Соблюдайте практики безопасности: используйте современные алгоритмы, защищённое хранение приватных ключей и не применяйте самоподписанные сертификаты там, где требуется доверенная цепочка сертификации.

Важно: самоподписанные сертификаты — инструмент для разработки и тестов, а не замена сертификатов, выданных доверенным центром сертификации.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро