ウェブサイト検索

PowerShellを使用して自己署名証明書を作成する方法


自己署名証明書は、テストやその他の重要でない作業を行う簡単な方法です。自己署名証明書には、それをサポートする信頼された証明書のチェーンがなく、作成したユーザーによって署名されています。証明書に署名したエンティティを信頼する場合は、正しく検証された証明書と同様に使用できます。

自己署名証明書を作成する必要がある場合、PowerShellを使用する方法の一つです。この記事では、PowerShellで自己署名証明書を作成する方法を学びます。

自己署名証明書の作成

PowerShellで自己署名証明書を作成するには、New-SelfSignedCertificateコマンドレットを使用できます。このコマンドレットは、

PKI

モジュール。

証明書を作成する際には多くの選択肢があります。一般的な自己署名証明書のタイプは

SSLServerAuthentication

(cmdletのデフォルト) と

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 パラメーターを介して渡された最初の項目のみを表示します。これは、2番目の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

この種類の証明書を使用すると、Protect-CMSMessageやUnProtect-CMSMessageのようなPowerShellコマンドを使用して作成した証明書でコンテンツを暗号化および復号化することができます。

このようにコンテンツを暗号化/復号化することは、暗号化されたデータを他の場所で渡す必要がある場合に便利になります。そうすれば、他のシステムでこの証明書を使用してデータを復号化することができます。しかし、Windowsに組み込まれている標準のデータ保護API(DPAPI)に依存していると、他のシステムまたは他のユーザーのためにデータを復号化することはできません。

要約

PowerShellを使用すると、自己署名証明書の作成が非常に簡単になります。これらの証明書には多くの用途がありますが、重要な注意点は、テストでのみ使用すべきということです。自己署名証明書を検証するための有効な証明書の信頼チェーンは存在しません。

自己署名証明書の作成がどれほど迅速かつ簡単であるかを見ると、今日からこれを始めて、必要な接続やデータを適切に暗号化することができます!

関連記事: