about_Signing

簡単な説明

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

長い説明

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

制限付き実行ポリシーでは、スクリプトの実行は許可されません。 AllSignedRemoteSigned の実行ポリシーにより、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」を参照してください。

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

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

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

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

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

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

自己署名証明書の作成

自己署名証明書を作成するには、PKI モジュールで New-SelfSignedCertificate コマンドレットを使用します。 このモジュールは PowerShell 3.0 で導入され、Windows 8とWindows Server 2012に含まれています。 詳細については、コマンドレットのヘルプ トピックを 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このツールでは、秘密キー パスワードの入力を求められます。 パスワードを使用すると、ユーザーの同意なしに誰も証明書を使用またはアクセスできなくなります。 覚えておくことができるパスワードを作成して入力します。 このパスワードは、後で証明書を取得するために使用します。

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

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
param([string] $file=$(throw "Please specify a filename."))
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature $file $cert

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

$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
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、および Internet Explorer に含まれています。

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

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

証明書を再インポートするには、次の手順を実行します。

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

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

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

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

こちらもご覧ください