Share via


about_Signing

簡単な説明

PowerShell 実行ポリシーに準拠するようにスクリプトに署名する方法について説明します。

長い説明

この情報は、Windows で実行されている PowerShell にのみ適用されます。

制限付き実行ポリシーでは、スクリプトの実行は許可されません。 AllSigned および RemoteSigned 実行ポリシーを使用すると、PowerShell でデジタル署名のないスクリプトが実行されなくなります。

このトピックでは、実行ポリシーが RemoteSigned であっても、署名されていない選択したスクリプトを実行する方法と、独自に使用するためにスクリプトに署名する方法について説明します。

PowerShell 実行ポリシーの詳細については、「 about_Execution_Policies」を参照してください。

署名されたスクリプトの実行を許可するには

コンピューターで PowerShell を初めて起動すると、既定の 制限付き 実行ポリシーが有効になる可能性があります。

制限付きポリシーでは、スクリプトの実行は許可されません。

コンピューターで有効な実行ポリシーを見つけるには、次のように入力します。

Get-ExecutionPolicy

ローカル コンピューターで記述した署名されていないスクリプトと他のユーザーから署名されたスクリプトを実行するには、[ 管理者として実行 ] オプションを使用して PowerShell を起動し、次のコマンドを使用してコンピューターの実行ポリシーを RemoteSigned に変更します。

Set-ExecutionPolicy RemoteSigned

詳細については、コマンドレットのヘルプ トピックを Set-ExecutionPolicy 参照してください。

RemoteSigned 実行ポリシーを使用して署名されていないスクリプトを実行する

PowerShell 実行ポリシーが RemoteSigned の場合、PowerShell では、電子メールやインスタント メッセージング プログラムを通じて受信する署名されていないスクリプトを含め、インターネットからダウンロードされた署名されていないスクリプトは実行されません。

ダウンロードしたスクリプトを実行しようとすると、PowerShell に次のエラー メッセージが表示されます。

The file <file-name> cannot be loaded. The file <file-name> is not
digitally signed. The script will not execute on the system. Please see
"Get-Help about_Signing" for more details.

スクリプトを実行する前に、コードを確認して信頼できることを確認します。 スクリプトは、実行可能プログラムと同じ効果を持ちます。

署名されていないスクリプトを実行するには、 コマンドレットを Unblock-File 使用するか、次の手順を使用します。

  1. スクリプト ファイルをコンピューターに保存します。
  2. [ スタート] をクリックし、[ マイ コンピューター] をクリックして、保存したスクリプト ファイルを見つけます。
  3. スクリプト ファイルを右クリックし、[ プロパティ] をクリックします。
  4. [ブロックの解除]をクリックします。

インターネットからダウンロードされたスクリプトがデジタル署名されていても、発行元を信頼することをまだ選択していない場合、PowerShell には次のメッセージが表示されます。

Do you want to run software from this untrusted publisher?
The file <file-name> is published by CN=<publisher-name>. This
publisher is not trusted on your system. Only run scripts
from trusted publishers.

[V] Never run  [D] Do not run  [R] Run once  [A] Always run
[?] Help (default is "D"):

発行元が信頼できる場合は、[ 1 回実行 ] または [ 常に実行] を選択します。 発行元が信頼できない場合は、[実行しない] または [実行しない] を選択します。 [実行しない] または [常に実行する] を選択した場合、PowerShell では、この発行元の入力を再度求めるメッセージは表示されません。

署名スクリプトのメソッド

作成したスクリプトと、他のソースから取得したスクリプトに署名できます。 スクリプトに署名する前に、各コマンドを調べて、実行しても安全であることを確認します。

コード署名に関するベスト プラクティスについては、「 コード署名のベスト プラクティス」を参照してください。

スクリプト ファイルに署名する方法の詳細については、「 Set-AuthenticodeSignature」を参照してください。

PowerShell 3.0 の PKI モジュールで導入された コマンドレットは New-SelfSignedCertificate 、テストに適した自己署名証明書を作成します。 詳細については、コマンドレットのヘルプ トピックを New-SelfSignedCertificate 参照してください。

デジタル署名をスクリプトに追加するには、コード署名証明書で署名する必要があります。 スクリプト ファイルの署名には、次の 2 種類の証明書が適しています。

  • 証明機関によって作成された証明書: 有料で、パブリック証明機関が ID を検証し、コード署名証明書を提供します。 信頼できる証明機関から証明書を購入すると、他のコンピューターが証明機関を信頼しているため、Windows を実行している他のコンピューター上のユーザーとスクリプトを共有できます。

  • 作成する証明書: コンピューターが証明書を作成する機関である自己署名証明書を作成できます。 この証明書は無料で、コンピューターでスクリプトの作成、署名、実行を行うことができます。 ただし、自己署名証明書によって署名されたスクリプトは、他のコンピューターでは実行されません。

通常、自己署名証明書は、自分で使用するために記述したスクリプトに署名し、安全であることを確認した他のソースから取得したスクリプトに署名する場合にのみ使用します。 企業内であっても、共有されるスクリプトには適していません。

自己署名証明書を作成する場合は、証明書で強力な秘密キー保護を有効にしてください。 これにより、悪意のあるプログラムがユーザーに代わってスクリプトに署名するのを防ぐことができます。 この手順は、このトピックの最後に記載されています。

自己署名証明書を作成する

自己署名証明書を作成するには、PKI モジュールの New-SelfSignedCertificate コマンドレットを使用します。 このモジュールは、PowerShell 3.0 で導入されています。 詳細については、コマンドレットのヘルプ トピックを New-SelfSignedCertificate 参照してください。

$params = @{
    Subject = 'CN=PowerShell Code Signing Cert'
    Type = 'CodeSigning'
    CertStoreLocation = 'Cert:\CurrentUser\My'
    HashAlgorithm = 'sha256'
}
$cert = New-SelfSignedCertificate @params

Makecert.exe の使用

以前のバージョンの Windows で自己署名証明書を作成するには、証明書作成ツール MakeCert.exeを使用します。 このツールは、Microsoft .NET SDK (バージョン 1.1 以降) およびMicrosoft Windows SDKに含まれています。

ツールの構文とパラメーターの MakeCert.exe 説明の詳細については、「 証明書作成ツール (MakeCert.exe)」を参照してください。

ツールを MakeCert.exe 使用して証明書を作成するには、SDK コマンド プロンプト ウィンドウで次のコマンドを実行します。

注意

最初のコマンドは、コンピューターのローカル証明機関を作成します。 2 番目のコマンドは、証明機関から個人証明書を生成します。 コマンドは、表示されているとおりにコピーまたは入力できます。 証明書名は変更できますが、置換は必要ありません。

makecert -n "CN=PowerShell Local Certificate Root" -a sha256 `
-eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer `
-ss Root -sr localMachine

makecert -pe -n "CN=PowerShell User" -ss MY -a sha256 `
-eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer

このツールでは MakeCert.exe 、秘密キー パスワードの入力を求められます。 パスワードを使用すると、同意なしに誰も証明書を使用したりアクセスしたりできなくなります。 Createし、覚えておくことができるパスワードを入力します。 このパスワードは、後で証明書を取得するために使用します。

証明書が正しく生成されたことを確認するには、次のコマンドを使用して、コンピューター上の証明書ストアで証明書を取得します。 ファイル システム ディレクトリに証明書ファイルが見つかりません。

PowerShell プロンプトで次のように入力します。

Get-ChildItem cert:\CurrentUser\my -codesigning

このコマンドでは、PowerShell 証明書プロバイダーを使用して証明書に関する情報を表示します。

証明書が作成された場合、出力には、次のような表示で証明書を識別する 拇印 が表示されます。

Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My

Thumbprint                                Subject
----------                                -------
4D4917CB140714BA5B81B96E0B18AAF2C4564FDF  CN=PowerShell User ]

スクリプトに署名する

自己署名証明書を作成したら、スクリプトに署名できます。 AllSigned 実行ポリシーを使用する場合、スクリプトに署名すると、コンピューターでスクリプトを実行できます。

次のサンプル スクリプトである は、 Add-Signature.ps1スクリプトに署名します。 ただし、 AllSigned 実行ポリシーを使用している場合は、スクリプトを実行する前に署名する Add-Signature.ps1 必要があります。

重要

PowerShell 7.2 より前では、ASCII または UTF8NoBOM エンコードを使用してスクリプトを保存する必要があります。 PowerShell 7.2 以降では、任意のエンコード形式の署名付きスクリプトがサポートされています。

このスクリプトを使用するには、次のテキストをテキスト ファイルにコピーし、 という名前を付けます Add-Signature.ps1

## Signs a file
[cmdletbinding()]
param(
    [Parameter(Mandatory=$true)]
    [string] $File
)

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

Set-AuthenticodeSignature -FilePath $File -Certificate $cert

スクリプト ファイルに Add-Signature.ps1 署名するには、PowerShell コマンド プロンプトで次のコマンドを入力します。

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

Set-AuthenticodeSignature add-signature.ps1 $cert

スクリプトに署名したら、ローカル コンピューターでスクリプトを実行できます。 ただし、PowerShell 実行ポリシーで信頼された機関からのデジタル署名が必要なコンピューターでは、スクリプトは実行されません。 試行すると、PowerShell に次のエラー メッセージが表示されます。

The file C:\remote_file.ps1 cannot be loaded. The signature of the
certificate cannot be verified.
At line:1 char:15
+ .\ remote_file.ps1 <<<<

書き込まなかったスクリプトを実行するときに PowerShell でこのメッセージが表示される場合は、署名されていないスクリプトを扱うのと同じようにファイルを扱います。 コードを確認して、スクリプトを信頼できるかどうかを判断します。

秘密キーの強力な保護を有効にする

コンピューターに秘密キーと証明書がある場合、悪意のあるプログラムが自分の代わりにスクリプトに署名でき、PowerShell でスクリプトの実行が承認される可能性があります。

ユーザーに代わって自動的に署名されないようにするには、Certificate Manager を Certmgr.exe 使用して署名キーと証明書をファイルに .pfx エクスポートします。 証明書マネージャーは、Microsoft .NET SDK、Microsoft Windows SDK、およびインターネット エクスプローラーに含まれています。

証明書をエクスポートするには:

  1. 証明書マネージャーを起動します。
  2. PowerShell ローカル証明書ルートによって発行された証明書を選択します。
  3. [ エクスポート] をクリックして、証明書のエクスポート ウィザードを開始します。
  4. [はい、秘密キーをエクスポートします] を選び、 [次へ] をクリックします。
  5. [ 強力な保護を有効にする] を選択します
  6. パスワードを入力し、もう一度入力して確認します。
  7. ファイル名拡張子を持つファイル名を .pfx 入力します。
  8. [完了] をクリックします。

証明書を再インポートするには:

  1. 証明書マネージャーを起動します。
  2. [ インポート] をクリックして、証明書のインポート ウィザードを開始します。
  3. エクスポート プロセス中に作成した .pfx ファイルの場所を開きます。
  4. [パスワード] ページで、[ 強力な秘密キー保護を有効にする] を選択し、エクスポート プロセス中に割り当てたパスワードを入力します。
  5. [個人] 証明書ストアを選択します。
  6. [完了] をクリックします。

署名の有効期限が切れないようにする

スクリプト内のデジタル署名は、署名証明書の有効期限が切れるまで、またはタイムスタンプ サーバーが署名証明書が有効な間にスクリプトが署名されたことを確認できる限り有効です。

ほとんどの署名証明書は 1 年間のみ有効であるため、タイム スタンプ サーバーを使用すると、ユーザーがスクリプトを何年も使用できるようになります。

こちらもご覧ください