PowerShellでWindowsの自己署名証明書を作成する方法|New-SelfSignedCertificate活用ガイド
PKI(公開鍵基盤)に詳しいWindows管理者の多くは、自己署名証明書を作成できるMakeCert.exeツールをご存じでしょう。このツールはMicrosoft .NET Framework SDKおよびMicrosoft Windows SDKに含まれています。しかし、最新のWindows(Windows 10/8.1、Windows Server 2019/2016/2012 R2)では、追加ツールを使わず、PowerShellの組み込みコマンドレットNew-SelfSignedCertificateだけで自己署名証明書を作成できます。
New-SelfSignedCertificateコマンドレットで自己署名証明書を作成する
PowerShellで自己署名証明書を作成するには、PKIモジュールに含まれるNew-SelfSignedCertificateコマンドレットを使用します。PKIモジュールで利用可能なすべてのコマンドレットを一覧表示するには、次のコマンドを実行します。
Get-Command -Module PKI
自己署名証明書は、テスト目的や、PKI/CAインフラを構築できない場合、外部プロバイダーから信頼された証明書を購入できない場合の内部イントラネットサービス(IIS、Exchange、Web Application Proxy、LDAPS、ADRMS、DirectAccessなど)向けの証明書として利用するのが推奨されます。
ヒント:Let's Encryptから無料のSSL証明書を簡単に取得できることも覚えておきましょう。Windows Server上のIISサイトにLet's EncryptのSSL証明書を発行してバインドすることも可能です。
証明書を作成するには、-DnsName(サーバー名。localhostと異なる任意の名前も指定可能)と-CertStoreLocation(生成した証明書を格納するローカル証明書ストア)の値を指定します。このコマンドレットは、Windows 10、Windows 8.1、Windows Server 2019/2016/2012 R2/2012で利用できます。
DNS名test.contoso.com(FQDNを指定)用の新しいSSL証明書(デフォルトのSSLServerAuthenticationタイプ)を作成し、コンピューターの個人証明書ストアに配置するには、次のコマンドを実行します。
New-SelfSignedCertificate -DnsName test.contoso.com -CertStoreLocation cert:\LocalMachine\My
Directory: Microsoft.PowerShell.Security\Certificate::LocalMachine\My Thumbprint Subject ---------- ------- 2175A76B10F843676951965F52A718F635FFA043 CN=test.contoso.com
ローカル管理者権限のない(昇格されていない)PowerShellセッションでこのコマンドを実行すると、次のエラーが表示されます。
New-SelfSignedCertificate : CertEnroll::CX509Enrollment::_CreateRequest: Access denied. 0x80090010 (-2146893808 NTE_PERM)
また、-KeyAlgorithm "ECDSA_secP256r1" -Provider "Microsoft Smart Card Key Storage Provider"のように非標準の暗号化プロバイダー(CSP)を指定した場合は、そのプロバイダーがコンピューターにインストールされていることを確認してください(デフォルトはMicrosoft Enhanced Cryptographic Provider CSP)。インストールされていない場合は、次のエラーが発生します。
New-SelfSignedCertificate: CertEnroll::CX509Enrollment::_CreateRequest: Provider type not defined. 0x80090017 (-2146893801 NTE_PROV_TYPE_NOT_DEF).
このコマンドは新しい証明書を作成し、コンピューターの個人証明書ストアにインポートします。certlm.msc MMCスナップインを開き、「個人」セクションに新しい証明書が表示されていることを確認しましょう。
デフォルト設定で生成される証明書の仕様
デフォルトでは、自己署名証明書は以下の設定で生成されます。
- 暗号化アルゴリズム:RSA
- キーの長さ:2048ビット
- 許可されるキーの用途:クライアント認証およびサーバー認証
- 証明書の用途:デジタル署名、キー暗号化
- 証明書の有効期間:1年間
証明書のプロパティを見ると、クライアント認証用であると同時にサーバー認証にも有効であることがわかります。
Get-ChildItemコマンドレットを使用すると、Thumbprint(拇印)を指定して作成した証明書のすべてのパラメーターを表示できます。
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 : 05/11/2021 06:19:42
NotBefore : 05/11/2020 05:59:42
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オプションを使用すると、別の有効期間を設定できます。たとえば、有効期間3年の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
PFX形式でのエクスポート
生成した証明書を秘密鍵付きでパスワード保護された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-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
この公開鍵または証明書ファイル自体は、GPOを使用してActive Directoryドメイン内のすべてのコンピューターとサーバーに展開できます。
サブジェクト代替名(SAN)付きの自己署名証明書を作成する
New-SelfSignedCertificateコマンドレットの便利な機能のひとつは、複数の異なる名前を持つ証明書、つまりサブジェクト代替名(SAN)付きの証明書を作成できることです。
注意:Makecert.exeツールは、New-SelfSignedCertificateコマンドレットとは異なり、SAN証明書やワイルドカード証明書を生成できません。
複数の名前を持つ証明書を作成する場合、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
Windowsでコード署名用の自己署名証明書を生成する
PowerShell 3.0のNew-SelfSignedCertificateコマンドレットは、MakeCertユーティリティで生成される証明書とは異なり、ドライバー、アプリケーション、スクリプトのコードに署名できないSSL証明書のみを生成していました。
PowerShell 5.0以降では、新版のNew-SelfSignedCertificateコマンドレットを使用してコード署名(Code Signing)証明書を発行できるようになりました。
アプリケーションコード署名用の自己署名証明書を作成するには、次のコマンドを実行します。
$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スクリプトに署名できるようになります。
Windows ServerのIISでSHA-256自己署名SSL証明書を使用する
インターネットインフォメーションサービス(IIS)マネージャーコンソールから自己署名証明書を作成する場合(「自己署名入り証明書の作成」アクションメニュー)、SSL証明書はSHA-1暗号化アルゴリズムで作成されることに注意してください。このような証明書は多くのブラウザーで信頼されず、安全な接続を確立できません(他のSSLエラーが表示される場合もあります)。New-SelfSignedCertificateコマンドレットを使用すると、より一般的なSHA-256暗号化アルゴリズムを使用した証明書を作成できます。
PowerShellで生成した自己署名SHA-256証明書は、Windows ServerのIISサイトにバインドできます。PowerShellでSSL証明書を作成してコンピューターの証明書ストアに配置すると、自動的にIISサイトで利用可能になります。
IISマネージャーコンソールを起動し、サイトを選択して、「サイト バインド」オプションで作成した証明書を選択し、変更を保存します。
-
Windows 10/11でVisual Studio Codeを使ってPowerShellスクリプトを作成・実行する方法
Windows 10やWindows 11でも、PowerShellスクリプトを作成できることをご存じでしょうか?WindowsにPowerShellをインストールしたら、次はPCで何ができるのか知りたくなるはずです。このガイドでは、Visual Studio Codeを使ってシンプルなスクリプトファイルを作成し、Windows 10およびWindows 11のPowerShellで実行する方法を解説します。 まずは基本的なPowerShellスクリプトの作り方を覚えましょう。これをマスターすれば、Windows 10とWindows 11の両方でスクリプトを作成・実行できるようになり、作業効
-
Windows 11でPowerShellを更新する3つの方法【初心者向け完全ガイド】
Windowsオペレーティングシステムを常に最新のソフトウェアとセキュリティアップデートの状態に保つことは、パソコンを快適に維持するために欠かせません。特にWindows 11は、以前のバージョンよりもセキュリティが強化されて設計されていますが、だからといってセキュリティ上の問題が一切起こらないわけではありません。OSを最新の状態に保てば、Microsoftが提供する新機能や新しい能力にもいち早くアクセスできるようになります。 当ブログを定期的にお読みの方なら、ソフトウェアの更新とパッチ適用の重要性はすでにご存じかもしれません。通常、これは最新のOSアップデート、サードパーティ製ソフトウェアの