Как создать самозаверяющий сертификат с помощью PowerShell
Самоподписанные сертификаты — это простой способ выполнить тестирование и другие менее важные задачи. Самозаверяющие сертификаты не имеют резервной копии доверенной цепочки сертификатов и подписываются создавшим их пользователем. Если вы доверяете объекту, подписавшему сертификат, вы можете использовать его так же, как и должным образом проверенный сертификат.
Если вам нужно создать самозаверяющий сертификат, вы можете сделать это с помощью PowerShell. В этой статье вы узнаете, как создать самоподписанный сертификат в PowerShell.
Создание самоподписанного сертификата
Чтобы создать самоподписанный сертификат с помощью PowerShell, вы можете использовать командлет New-SelfSignedCertificate
. Этот командлет включен в модуль PKI
.
Существует множество вариантов создания сертификатов. Распространенными типами самозаверяющих сертификатов являются SSLServerAuthentication
(по умолчанию для командлета) и CodeSigning
. Кроме того, вы можете создать DocumentEncryptionCert
, который очень полезен для шифрования файлов, и, наконец, сертификат Custom
, который позволяет указать множество пользовательских параметров.
Давайте продолжим и создадим обычный сертификат SSLServerAuthentication
. Это тот, который обычно используется для защиты веб-сайтов с шифрованием SSL. Вы можете увидеть пример этого ниже. В этом примере сертификат хранится в Cert:LocalMachineMy Certificate Store
.
$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}
Если все прошло хорошо, теперь у вас должен быть только что созданный сертификат! Вы заметите, что выходные данные возвращают тему, но тема отображает только первый элемент, переданный ему через параметр DnsName
. Это связано с тем, что второй URL-адрес становится частью альтернативного списка тем.
*Обратите внимание, что если вы попытаетесь запустить это не как администратор, вы получите сообщение об ошибке, подобное приведенному ниже:
New-SelfSignedCertificate: CertEnroll::CX509Enrollment::_CreateRequest: Отказано в доступе. 0x80090010 (-2146893808 NTE_PERM)
Как видно из Отказано в доступе
, у вас еще нет разрешения на его запуск.*
Поиск информации о нашем сертификате
Давайте удостоверимся, что сертификат был создан так, как мы ожидали. Чтобы найти информацию о конкретном сертификате с помощью PowerShell, вы можете использовать командлет Get-ChildItem
точно так же, как вы можете перечислить файлы в каталоге.
PS C:> Get-ChildItem -Path "Cert:LocalMachineMy" | Where-Object Thumbprint -EQ 4EFF6B1A0F61B4BF692C77F09889AD151EE8BB58 | Select-Object *
PSPath : Microsoft.PowerShell.SecurityCertificate::LocalMachineMy4EFF6B1A0F61B4BF692C77F09889AD151EE8BB58
58
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
теперь отображаются оба сайта. Кроме того, дата NotAfter
правильно заполнена и составляет 6 месяцев с даты создания.
Сертификат подписи кода
Если вы работаете в PowerShell, вы знаете о политиках выполнения. Если у вас есть политика выполнения, установленная на AllSigned
, вам нужно будет подписывать каждый скрипт, работающий в вашей системе. Создать сертификат для этого довольно просто!
PS C:> New-SelfSignedCertificate -Type 'CodeSigningCert' -DnsName 'MyHost'
PSParentPath: Microsoft.PowerShell.SecurityCertificate::LocalMachineMY
Thumbprint Subject EnhancedKeyUsageList
---------- ------- --------------------
14D535EG834370293BA103159EB00876A79959D8 CN=MyHost Code Signing
Сертификат защиты документа
Возможно, вы раньше с этим не сталкивались, но PowerShell с API защиты данных может шифровать файлы в вашей системе с помощью сертификата защиты документов. С помощью командлета New-SelfSignedCertificate
мы можем легко создать сертификат для шифрования ваших документов.
$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
С этим типом сертификата теперь вы можете использовать сертификат, созданный для шифрования и расшифровки контента с помощью команд PowerShell, таких как Protect-CMSMessage
и UnProtect-CMSMessage
.
Шифрование/дешифрование контента, подобное этому, становится полезным, если вам нужно передать зашифрованные данные, поскольку затем вы можете использовать этот сертификат в другой системе для расшифровки данных. Если вы полагаетесь на стандартный API защиты данных (DPAPI), встроенный в Windows, вы не сможете расшифровать данные в других системах или для других пользователей.
Краткое содержание
PowerShell делает создание самоподписанных сертификатов невероятно простым. Эти сертификаты имеют множество применений, но важно помнить, что их следует использовать только при тестировании. У вас не будет действующей цепочки доверия сертификатов для проверки ваших самозаверяющих сертификатов.
Видя, как быстро и легко создавать самозаверяющие сертификаты, вы можете начать делать это сегодня и должным образом шифровать любые соединения или данные, которые вам нужны!