Как создать самозаверяющий сертификат в Windows
Большинство администраторов Windows, знакомых с PKI, знают о
MakeCert.exeинструмент, позволяющий создавать самозаверяющие сертификаты. Этот инструмент является частью Microsoft .NET Framework SDK и Microsoft Windows SDK. В современных версиях Windows (Windows 11/10/8.1 и Windows Server 2022/2019/2016/2012R2) вы можете создать самозаверяющий сертификат с помощью встроенного командлета PowerShell.
New-SelfSignedCertificateбез использования дополнительных инструментов.
New-SelfSignedCertificate: создание самозаверяющего сертификата с помощью PowerShell
Чтобы создать самозаверяющий сертификат с помощью PowerShell, вы можете использовать встроенный командлет New-SelfSignedCertificate , который является частью модуля PowerShell PKI (инфраструктура открытых ключей):
Чтобы просмотреть все доступные командлеты в модуле PKI, выполните команду:
Get-Command -Module PKI
Рекомендуется использовать самозаверяющие сертификаты для задач тестирования/разработки или для предоставления сертификатов для внутренних служб интрасети (IIS, Exchange, прокси веб-приложения, LDAPS, ADRMS, DirectAccess и т. д.), если вы не можете развернуть инфраструктуру PKI/CA или приобрести доверенный сертификат от внешнего поставщика.
Совет. Не забывайте, что вы можете легко получить бесплатный SSL-сертификат от Let’s Encrypt. Вот пример того, как выдать SSL-сертификат Let’s Encrypt и привязать его к сайту IIS на Windows Server.
Для создания сертификата необходимо указать значения -DnsName (имя сервера, имя может быть произвольным и даже отличаться от текущего имени хоста) и -CertStoreLocation (локальное хранилище сертификатов, в котором будет размещен сгенерированный сертификат).
Чтобы создать новый сертификат SSL (с типом SSLServerAuthentication по умолчанию) для DNS-имени test.contoso.com (используйте полное доменное имя) и поместить его в личные сертификаты на компьютере, выполните следующую команду:
New-SelfSignedCertificate -DnsName test.contoso.com -CertStoreLocation cert:\LocalMachine\MyКоманда вернет отпечаток, тему и 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.
Эта команда создает новый сертификат и импортирует его в личное хранилище сертификатов компьютера. Откройте оснастку certlm.msc MMC и убедитесь, что новый сертификат появился в разделе Личные хранилища сертификатов компьютера.
С помощью командлета Get-ChildItem можно вывести все параметры созданного сертификата по его отпечатку:
Get-ChildItem -Path "Cert:\LocalMachine\My" | Where-Object Thumbprint -eq 2175A76B10F843676951965F52A718F635FFA043 | Select-Object *
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 позволяет использовать чип доверенного платформенного модуля устройства (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)}Создайте сертификат с альтернативным именем субъекта (SAN) с помощью PowerShell.
Командлет New-SelfSignedCertificate позволяет создать сертификат с несколькими различными альтернативными именами субъектов (SAN).
Примечание.
Makecert.exeИнструмент, в отличие от командлета New-SelfSignedCertificate, не может создавать сертификаты SAN и Wildcard.
Если вы хотите создать сертификат с несколькими именами, первое имя параметра DnsName будет использоваться в качестве CN (общего имени) сертификата. Например, давайте создадим самозаверяющий сертификат SAN со следующими именами:
Имя субъекта (CN):
adfs1.contoso.comАльтернативное имя субъекта (DNS):
web_gw.contoso.comАльтернативное имя субъекта (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")Как видите, поле «Альтернативное имя субъекта» теперь содержит IP-адрес хоста и его DNS-имена.
Как экспортировать самозаверяющий сертификат в Windows?
Чтобы экспортировать сгенерированный сертификат с закрытым ключом в защищенный паролем PFX-файл, необходимо указать его отпечаток. Его можно скопировать из результатов команды New-SelfSignedCertificate. Вам также необходимо указать пароль безопасности сертификата и преобразовать его в формат SecureString:
$CertPassword = ConvertTo-SecureString -String “YourPassword” -Force -AsPlainText
Export-PfxCertificate -Cert cert:\LocalMachine\My\2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:\test.pfx -Password $CertPasswordВы можете экспортировать открытый ключ сертификата следующим образом (закрытый ключ не включается в экспорт):
Export-Certificate -Cert Cert:\LocalMachine\My\2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:\tstcert.cerУбедитесь, что файл сертификата *.CER (PFX) присутствует в указанном каталоге. Если щелкнуть его правой кнопкой мыши и выбрать пункт меню «Установить сертификат», вы сможете использовать Мастер импорта сертификатов, чтобы добавить сертификат к доверенным корневым сертификатам на вашем компьютере.
Выберите расположение хранилища сертификатов -> Локальный компьютер. Поместите все сертификаты в следующее хранилище -> Доверенные корневые центры сертификации.
Вы можете создать сертификат и сразу же импортировать его в хранилище доверенных корневых сертификатов компьютера с помощью команд:
$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 (Как развернуть сертификаты для пользователей с помощью 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, это означает, что сертификат не является доверенным, поскольку он находится в хранилище личных сертификатов пользователя.
Вам необходимо переместить его в хранилище доверенных корневых сертификатов (не забывайте периодически сканировать корневое хранилище сертификатов 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.
Вы можете привязать самозаверяющий сертификат SHA-256, созданный с помощью PowerShell, к сайту IIS на Windows Server. Если вы создали сертификат SSL с помощью PowerShell и поместили его в хранилище сертификатов компьютера, он автоматически станет доступен сайтам IIS.
Откройте консоль диспетчера IIS (
inetmgr.exe), выберите свой сайт, а затем выберите сертификат, созданный вами в параметрах Привязка сайта. Сохраните изменения.
Вы также можете привязать сертификат SSL по его отпечатку к сайту IIS:
New-IISSiteBinding -Name "Default Web Site" -BindingInformation "*:443:" -CertificateThumbPrint $yourCert.Thumbprint -CertStoreLocation "Cert:\LocalMachine\My" -Protocol https











