署名について
概要
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.
スクリプトを実行する前に、コードを確認して、信頼できることを確認してください。 スクリプトは、実行可能プログラムと同じ効果があります。
署名されていないスクリプトを実行するには、ブロック解除ファイルコマンドレットを使用するか、次の手順を使用します。
- スクリプトファイルをコンピューターに保存します。
- [スタート] をクリックし、[マイコンピューター] をクリックして、保存されているスクリプトファイルを探します。
- スクリプトファイルを右クリックし、[プロパティ] をクリックします。
- [ブロックの解除] をクリックします。
インターネットからダウンロードされたスクリプトがデジタル署名されていても、その発行元を信頼するように選択していない場合は、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"):
発行元を信頼する場合は、[一度だけ実行する] または [常に実行する] を選択します。 発行元を信頼していない場合は、[実行しない] または [実行しない] のいずれかを選択します。 [実行しない] または [常に実行する] を選択した場合、PowerShell はこのパブリッシャーに対して再度メッセージを表示しません。
スクリプトの署名方法
作成したスクリプトと他のソースから取得したスクリプトに署名することができます。 任意のスクリプトに署名する前に、各コマンドを調べて、実行しても安全かどうかを確認します。
コード署名のベストプラクティスについては、「コード署名のベストプラクティス」を参照してください。
スクリプトファイルに署名する方法の詳細については、「 get-authenticodesignature」を参照してください。
New-SelfSignedCertificate
PowerShell 3.0 の PKI モジュールで導入されたコマンドレットは、テストに適した自己署名証明書を作成します。 詳細については、新しい SelfSignedCertificate コマンドレットのヘルプトピックを参照してください。
デジタル署名をスクリプトに追加するには、コード署名証明書を使用して署名する必要があります。 スクリプトファイルの署名には、次の2種類の証明書が適しています。
証明機関によって作成された証明書: 有料では、パブリック証明機関が id を検証し、コード署名証明書を提供します。 信頼できる証明機関から証明書を購入すると、他のコンピューターが証明機関を信頼しているため、Windows を実行している他のコンピューターのユーザーとスクリプトを共有できます。
証明書を作成する: 自分のコンピューターが証明書を作成する機関である自己署名証明書を作成できます。 この証明書は無料で使用でき、コンピューター上でスクリプトの記述、署名、および実行を行うことができます。 ただし、自己署名証明書によって署名されたスクリプトは、他のコンピューターでは実行されません。
通常は、自己署名証明書を使用して、自分で使用するために作成したスクリプトに署名したり、安全であることを確認した他のソースから取得したスクリプトに署名したりすることができます。 企業内でも共有されるスクリプトには適していません。
自己署名証明書を作成する場合は、証明書に対して強力な秘密キーの保護を有効にする必要があります。 これにより、悪意のあるプログラムがユーザーに代わってスクリプトに署名するのを防ぐことができます。 手順については、このトピックの最後に記載されています。
自己署名証明書の作成
で自己署名証明書を作成するには、PKI モジュールで New-SelfSignedCertificate コマンドレットを使用します。 このモジュールは PowerShell 3.0 で導入され、Windows 8 および Windows Server 2012 に含まれています。 詳細については、新しい 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 ツールでは、秘密キーのパスワードの入力を求められます。 パスワードは、同意せずに証明書を使用またはアクセスできないようにします。 覚えやすいパスワードを作成して入力します。 このパスワードは後で証明書を取得するために使用します。
証明書が正しく生成されたことを確認するには、次のコマンドを使用して、コンピューター上の証明書ストアにある証明書を取得します。 (ファイルシステムディレクトリに証明書ファイルはありません)。
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 の実行が承認されます。
自動的に署名を行わないようにするには、証明書マネージャー (Certmgr.exe) を使用して、署名証明書を .pfx ファイルにエクスポートします。 証明書マネージャーは、Microsoft .NET Framework SDK、Microsoft Windows SDK、および Internet Explorer 5.0 以降のバージョンに含まれています。
証明書をエクスポートするには:
- 証明書マネージャーを起動します。
- PowerShell ローカル証明書のルートによって発行された証明書を選択します。
- [エクスポート] をクリックして、証明書のエクスポートウィザードを開始します。
- [はい、秘密キーをエクスポートします] を選択し、[次へ] をクリックします。
- [強力な保護を有効にする] を選択します。
- パスワードを入力し、確認のためにもう一度入力します。
- ファイル名拡張子が .pfx のファイル名を入力します。
- [完了] をクリックします。
証明書を再インポートするには:
- 証明書マネージャーを起動します。
- [インポート] をクリックして、証明書のインポートウィザードを開始します。
- エクスポートプロセスで作成した .pfx ファイルの場所を開きます。
- [パスワード] ページで、[秘密キーの保護を強力にする] を選択し、エクスポート処理中に割り当てたパスワードを入力します。
- [ 個人 ] 証明書ストアを選択します。
- [完了] をクリックします。
署名の有効期限が切れないようにする
スクリプト内のデジタル署名は、署名証明書の有効期限が切れている間に、タイムスタンプサーバーでスクリプトが署名されたことを確認できる限り有効です。
ほとんどの署名証明書は1年間有効であるため、タイムスタンプサーバーを使用すると、ユーザーがスクリプトを何年も使用できるようになります。