署名について
概要
PowerShell 実行ポリシーに準拠するようにスクリプトに署名する方法について説明します。
詳細説明
制限付き実行ポリシーでは、スクリプトの実行は許可されません。 AllSigned および RemoteSigned 実行ポリシーを使用すると、PowerShell でデジタル署名のないスクリプトが実行されなくなります。
このトピックでは、実行ポリシーが RemoteSigned であっても、署名されていない選択したスクリプトを実行する方法と、独自に使用するためにスクリプトに署名する方法について説明します。
PowerShell 実行ポリシーの詳細については、「 about_Execution_Policies」を参照してください。
署名されたスクリプトの実行を許可するには
コンピューターで PowerShell を初めて起動すると、 制限付き 実行ポリシー (既定) が有効になる可能性があります。
制限付きポリシーでは、スクリプトの実行は許可されません。
コンピューターで有効な実行ポリシーを見つけるには、次のように入力します。
Get-ExecutionPolicy
ローカル コンピューターで記述した署名されていないスクリプトと他のユーザーから署名されたスクリプトを実行するには、[管理者として実行] オプションを使用して PowerShell を起動し、次のコマンドを使用してコンピューターの実行ポリシーを RemoteSigned に変更します。
Set-ExecutionPolicy RemoteSigned
詳細については、コマンドレットのヘルプ トピックを Set-ExecutionPolicy
参照してください。
署名されていないスクリプトの実行 (REMOTESIGNED 実行ポリシー)
PowerShell 実行ポリシーが RemoteSigned の場合、Windows 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 コマンドレットを使用するか、次の手順を使用します。
- スクリプト ファイルをコンピューターに保存します。
- [スタート] をクリックし、[マイ コンピューター] をクリックして、保存したスクリプト ファイルを見つけます。
- スクリプト ファイルを右クリックし、[プロパティ] をクリックします。
- [ブロックの解除] をクリックします。
インターネットからダウンロードされたスクリプトがデジタル署名されていても、発行元を信頼することをまだ選択していない場合、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 で導入され、Windows 8とWindows Server 2012に含まれています。 詳細については、New-SelfSignedCertificate コマンドレットのヘルプ トピックを参照してください。
以前のバージョンの Windows で自己署名証明書を作成するには、証明書作成ツール (MakeCert.exe) を使用します。 このツールは、Microsoft .NET Framework SDK (バージョン 1.1 以降) およびMicrosoft Windows SDKに含まれています。
MakeCert.exe ツールの構文とパラメーターの説明の詳細については、「 証明書作成ツール (MakeCert.exe)」を参照してください。
MakeCert.exe ツールを使用して証明書を作成するには、SDK コマンド プロンプト ウィンドウで次のコマンドを実行します。
注: 最初のコマンドは、コンピューターのローカル証明機関を作成します。 2 番目のコマンドは、証明機関から個人証明書を生成します。
注: コマンドは、表示されるとおりにコピーまたは入力できます。 証明書名は変更できますが、置換は必要ありません。
makecert -n "CN=PowerShell Local Certificate Root" -a sha1 `
-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 sha1 `
-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 スクリプトに署名する必要があります。
このスクリプトを使用するには、次のテキストをテキスト ファイルにコピーし、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 Framework SDK、Microsoft Windows SDK、およびインターネット エクスプローラー 5.0 以降のバージョンに含まれています。
証明書をエクスポートするには:
- 証明書マネージャーを起動します。
- PowerShell ローカル証明書ルートによって発行された証明書を選択します。
- [エクスポート] をクリックして、証明書のエクスポート ウィザードを開始します。
- [はい、秘密キーをエクスポートします] を選択し、[次へ] をクリックします。
- [強力な保護を有効にする] を選択します。
- パスワードを入力し、もう一度入力して確認します。
- .pfx ファイル名拡張子を持つファイル名を入力します。
- [完了] をクリックします。
証明書を再インポートするには:
- 証明書マネージャーを起動します。
- [インポート] をクリックして、証明書のインポート ウィザードを開始します。
- エクスポート プロセス中に作成した .pfx ファイルの場所を開きます。
- [パスワード] ページで、[強力な秘密キー保護を有効にする] を選択し、エクスポート プロセス中に割り当てたパスワードを入力します。
- [ 個人 ] 証明書ストアを選択します。
- [完了] をクリックします。
署名の有効期限が切れないようにする
スクリプト内のデジタル署名は、署名証明書の有効期限が切れるまで、またはタイム スタンプ サーバーが署名証明書が有効な間にスクリプトが署名されたことを確認できる限り有効です。
ほとんどの署名証明書は 1 年間のみ有効であるため、タイム スタンプ サーバーを使用すると、ユーザーがスクリプトを何年も使用できるようになります。