Большинство администраторов Windows, знакомых с PKI, знают о том. MakeCert.exe, который позволяет создавать самоподписанные сертификаты. Этот инструмент входит в состав Microsoft .NET Framework SDK и Microsoft Windows SDK. Создать самоподписанный сертификат можно с помощью встроенной команды PowerShell New-SelfSignedCertificate без использования дополнительных инструментов.

New-SelfSignedCertificate: Создание самоподписного сертификата с помощью PowerShell

Чтобы создать самоподписанный сертификат с помощью PowerShell, вы можете использовать встроенную функцию New-SelfSignedCertificate команда, которая является частью PowerShell PKI (Инфраструктура открытых ключей):

Чтобы перечислить все доступные команды в модуле PKI, выполните команду:

Get-Command -Module PKI

модуль powershell pki - управление сертификатами в windows

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

Совет. Не забывайте, что вы можете легко получить бесплатный SSL-сертификат от Let’s Encrypt. Вот пример того, как выпустить SSL-сертификат Let’s Encrypt и привязать его к сайту IIS на Windows Server.

Чтобы создать сертификат, необходимо указать значения параметров -DnsName (имя сервера, имя может быть произвольным и даже отличаться от текущего имени хоста) и -CertStoreLocation (локальное хранилище сертификатов, в которое будет помещен сгенерированный сертификат).

Чтобы создать новый SSL-сертификат (с типом SSLServerAuthentication по умолчанию) для DNS-имени test.contoso.com (используйте FQDN-имя) и поместить его в личные сертификаты на компьютере, выполните следующую команду:

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

Команда powershell New-SelfSignedCertificate в windows

Команда вернет Thumbprint, Subject и EnhancedKeyUsageList нового сертификата. По умолчанию такой сертификат может использоваться для аутентификации клиента (1.3.6.1.5.5.7.3.2) или аутентификации сервера (1.3.6.1.5.5.7.3.1).

Если запустить эту команду в приглашении PowerShell без прав локального администратора, возникнет ошибка:

New-SelfSignedCertificate : CertEnroll::CX509Enrollment::_CreateRequest: Access denied. 0x80090010 (-2146893808 NTE_PERM)

Если вы указали нестандартный криптографический провайдер (CSP) (например, с помощью параметра -KeyAlgorithm "ECDSA_secP256r1" -Provider "Microsoft Smart Card Key Storage Provider"параметры), убедитесь, что он установлен на вашем компьютере (по умолчанию используется Microsoft Enhanced Cryptographic Provider). В противном случае появится ошибка:

New-SelfSignedCertificate: CertEnroll::CX509Enrollment::_CreateRequest: Provider type not defined. 0x80090017 (-2146893801 NTE_PROV_TYPE_NOT_DEF).

По умолчанию самоподписанный сертификат создается со следующими параметрами:

  • Криптографический алгоритм: RSA;
  • Длина ключа: 2048 бит;
  • Допустимое использование ключа: Аутентификация клиента и Аутентификация сервера;
  • Сертификат может быть использован для: Цифровая подпись, Шифрование ключей;
  • Срок действия сертификата: 1 год;
  • Криптопровайдер: Microsoft Software Key Storage Provider.

Эта команда создает новый сертификат и импортирует его в личное хранилище сертификатов компьютера. Откройте программу certlm.msc оснастку MMC и убедитесь, что новый сертификат появился в окне Личный раздел хранилища сертификатов компьютера.

certlm.msc хранилище личных сертификатов

С помощью команды Get-ChildItem можно отобразить все параметры созданного сертификата по его отпечатку пальца:

Get-ChildItem -Path "Cert:\LocalMachine\My" | Where-Object Thumbprint -eq 2175A76B10F843676951965F52A718F635FFA043 | Select-Object *

список свойств самоподписанного сертификата с помощью powershell

PSPath                   : Microsoft.PowerShell.Security\Certificate::LocalMachine\My\2175A76B10F843676951965F52A718F635FFA043
PSParentPath             : Microsoft.PowerShell.Security\Certificate::LocalMachine\My
PSChildName              : 2175A76B10F843676951965F52A718F635FFA043
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             :
IssuerName               : System.Security.Cryptography.X509Certificates.X500DistinguishedName
NotAfter                 : 12/4/2023 5:35:15 PM
NotBefore                : 12/4/2022 5:15:15 PM
HasPrivateKey            : True
PrivateKey               :
PublicKey                : System.Security.Cryptography.X509Certificates.PublicKey
RawData                  : {48, 130, 3, 45...}
SerialNumber             : 6797F5E3F870478D4D3798BEB291DBF3
SubjectName              : System.Security.Cryptography.X509Certificates.X500DistinguishedName
SignatureAlgorithm       : System.Security.Cryptography.Oid
Thumbprint               : 2175A76B10F843676951965F52A718F635FFA043
Version                  : 3
Handle                   : 2834444631568
Issuer                   : CN=test.contoso.com
Subject                  : CN=test.contoso.com
Примечание. Срок действия этого самоподписанного сертификата истекает через 1 год после его создания. Вы можете установить другой срок действия сертификата с помощью параметра -NotAfter опция. Например, вы можете выпустить сертификат SSL/TLS с трехлетним сроком действия с помощью следующих команд:$todaydt = Get-Date
$3years = $todaydt.AddYears(3)
New-SelfSignedCertificate -dnsname test.contoso.com -notafter $3years -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" …

[Криптопровайдер платформы Microsoft позволяет использовать чип Trusted Platform Module устройства (TPM 2.0) для защиты ключа.

New-SelfSignedCertificate -Type Custom -Provider "Microsoft Platform Crypto Provider" ...

Для защиты документов и электронной почты можно сгенерировать сертификат шифрования документов. Для этого используйте DocumentEncryptionCert тип при создании сертификата:

$Params = @{
"DnsName" = "myhostname"
"CertStoreLocation" = "Cert:\\CurrentUser\\My"
"KeyUsage" = "KeyEncipherment","DataEncipherment","KeyAgreement"
"Type" = "DocumentEncryptionCert"
}
$doccert=New-SelfSignedCertificate @Params

Проверьте значение EnhancedKeyUsageList сертификата:

$doccert|select EnhancedKeyUsageList

{Document Encryption (1.3.6.1.4.1.311.80.1)}

получить сертификат enhancedkeyusagelist: document encryption cert

Создание сертификата с альтернативным именем субъекта (SAN) с помощью PowerShell

Команда New-SelfSignedCertificate позволяет создать сертификат с несколькими различными Альтернативные имена субъектов (САНs).

Примечание. Сайт Makecert.exeинструмент, в отличие от команды New-SelfSignedCertificate, не может создавать сертификаты SAN и Wildcard.[/alert]Если вы хотите создать сертификат с несколькими именами, первое имя параметра DnsName будет использоваться в качестве CN (Common Name) сертификата. Например, создадим самоподписанный сертификат SAN со следующими именами:

  • Имя субъекта (CN): adfs1.contoso.com
  • Альтернативное имя субъекта (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

Вы можете сгенерировать самоподписанный сертификат не только для имени хоста DNS, но и для IP-адреса. Для этого необходимо использовать -TextExtension вместо параметра -DnsName. Например:

New-SelfSignedCertificate -TextExtension @("2.5.29.17={text}IPAddress=10.1.2.3&DNS=TESTServer1&DNS=TESTServer1.local")

Как видите, поле Subject Alternative Name теперь содержит IP-адрес хоста и его DNS-имена.

создание самоподписанного сертификата для IP-адреса в windows

Как экспортировать самоподписанный сертификат в Windows?

Чтобы экспортировать сгенерированный сертификат с закрытым ключом в защищенный паролем PFX-файл, необходимо указать его Thumbprint. Его можно скопировать из результатов команды New-SelfSignedCertificate. Также необходимо указать пароль безопасности сертификата и преобразовать его в формат SecureString:

$CertPassword = ConvertTo-SecureString -String “YourPassword” -Force –AsPlainText
Export-PfxCertificate -Cert cert:\LocalMachine\My\2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:\test.pfx -Password $CertPassword

Export-PfxCertificate

Вы можете экспортировать открытый ключ сертификата следующим образом (закрытый ключ не включается в экспорт):

Export-Certificate -Cert Cert:\LocalMachine\My\2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:\tstcert.cer

Убедитесь, что файл сертификата *.CER (PFX) появился в указанном каталоге. Если щелкнуть его правой кнопкой мыши и выбрать опцию «Установить сертификат«, вы можете воспользоваться пунктом меню Мастер импорта сертификатов чтобы добавить сертификат в список доверенных корневых сертификатов на вашем компьютере.

установка сертификата с помощью файлового проводника на windows 10

Выберите местоположение хранилища сертификатов -> Локальная машина, Поместите все сертификаты в следующее хранилище -> Доверенные корневые центры сертификации.

установка сертификата в доверенные корневые центры сертификации

[alert]Вы можете создать сертификат и сразу же импортировать его в хранилище доверенных корневых сертификатов компьютера с помощью команд:

$SelfSignCert=New-SelfSignedCertificate …..
$certFile = Export-Certificate -Cert $SelfSignCert -FilePath C:\ps\export-certname.cer
Import-Certificate -CertStoreLocation Cert:\LocalMachine\AuthRoot -FilePath $certFile.FullName

Вы можете развернуть этот открытый ключ или сам файл сертификата на всех пользовательских компьютерах и серверах в домене Active Directory с помощью GPO (How to deploy certificates to users with GPO?).

Генерация самоподписного сертификата для подписи кода в Windows

В PowerShell 3.0 команда New-SelfSifgnedCertificate генерирует только SSL-сертификаты, которые нельзя использовать для подписи кода драйвера, приложения или сценария (в отличие от сертификатов, генерируемых утилитой MakeCert).

Команду New-SelfSifgnedCertificate можно использовать для выпуска Подписание кода сертификаты в PowerShell версии 5.0 и новее.

Вы можете обновить версию PowerShell в соответствии с руководством.

Чтобы создать самоподписанный сертификат для подписи кода приложения, выполните команду:

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

Теперь вы можете подписать файл сценария PowerShell с помощью самоподписанного сертификата:

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

Если вы получаете сообщение UnknownError предупреждение при выполнении команды, означающее, что сертификат не является доверенным, поскольку находится в личном хранилище сертификатов пользователя.

подписание сценария powershell с использованием самоподписанных сертификатов - неизвестная ошибка

Вам нужно переместить его в хранилище доверенных корневых сертификатов (не забывайте периодически проверять хранилище корневых сертификатов Windows на наличие недоверенных и подозрительных сертификатов и обновлять списки доверенных корневых сертификатов).

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

Теперь вы можете использовать этот самоподписанный сертификат для подписи своих сценариев PowerShell, драйверов или приложений.

Создание самоподписного SSL-сертификата SHA-256 в IIS на Windows Server

Обратите внимание, что при создании самоподписного сертификата для IIS через консоль Internet Information Manager (используя Создать самоподписанный сертификат пункт меню действия), создается SSL-сертификат с использованием алгоритма шифрования SHA-1. Такие сертификаты считаются недоверенными во многих браузерах и не могут использоваться для создания безопасного соединения (или вы можете увидеть другие предупреждения и ошибки SSL). Команда New-SelfSignedCertificate позволяет создать более популярный тип сертификата с использованием алгоритма шифрования SHA-256.

iis создание самоподписанного ssl-сертификата на windows server

Вы можете привязать самоподписанный сертификат SHA-256, созданный с помощью PowerShell, к сайту IIS на Windows Server. Если вы создадите SSL-сертификат с помощью PowerShell и поместите его в хранилище сертификатов компьютера, он будет автоматически доступен для сайтов IIS.

привязка самоподписанного сертификата sha256 к сайту iis на windows server

Откройте консоль IIS Manager (inetmgr.exe), выберите свой сайт, а затем выберите сертификат, созданный в разделе Привязка сайта опции. Сохраните изменения.

Вы также можете привязать сертификат SSL по его отпечатку к сайту IIS:

New-IISSiteBinding -Name "Default Web Site" -BindingInformation "*:443:" -CertificateThumbPrint $yourCert.Thumbprint -CertStoreLocation "Cert:\LocalMachine\My" -Protocol https