about_Signing

適用対象: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

トピック

about_Signing

概要

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

詳細説明

制限付きの実行ポリシーは、任意のスクリプトの実行を許可しません。AllSigned および RemoteSigned の実行ポリシーは、Windows PowerShell がデジタル署名を持たないスクリプトを実行するのを禁止します。

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

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

署名付きスクリプトの実行を許可するには

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

制限付きのポリシーは、任意のスクリプトの実行を許可しません。

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

        Get-ExecutionPolicy

ローカル コンピューターで作成した未署名のスクリプトおよび他のユーザーからの署名済みスクリプトを実行するには、[管理者として実行] オプションを使用して Windows PowerShell を開始し、次のコマンドを使用して、コンピューター上の実行ポリシーを RemoteSigned に変更します。

        Set-ExecutionPolicy RemoteSigned

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

署名されていないスクリプトの実行 (RemoteSigned 実行ポリシー)

Windows PowerShell 実行ポリシーが RemoteSigned の場合、Windows PowerShell は、電子メールおよびインスタント メッセージング プログラムを経由して受け取った署名されていないスクリプトなど、インターネットからダウンロードされた署名されていないスクリプトを実行しません。

ダウンロードしたスクリプトを実行しようとすると、Windows 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.

スクリプトを実行する前に、コードが信頼できるかどうかを必ず確認してください。スクリプトは実行可能プログラムと同じ効果があります。

  • 1. お使いのコンピューター上にスクリプト ファイルを保存します。

  • 2. [スタート]、[マイ コンピューター] の順にクリックし、保存されているスクリプト ファイルを特定します。

  • 3. スクリプト ファイルを右クリックし、[プロパティ] をクリックします。

  • 4. [ブロックの解除] をクリックします。

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

  • この信頼されていない発行元からのソフトウェアを実行しますか。ファイル <file-name> は CN=<publisher-name> によって発行されています。システムではこの発行元が信頼されていません。信頼できる発行元からのスクリプトのみを実行します。

  • [V] 決して実行しない [D] 実行しない [R] 1 回実行する [A] 常に実行する [?] ヘルプ (既定値は「D」):

  • 発行元を信頼する場合は、[1 回実行する] または [常に実行する] を選択します。発行元を信頼しない場合は、[決して実行しない] または [実行しない] のいずれかを選択します。[決して実行しない] または [常に実行する] を選択した場合、Windows PowerShell はこの発行元に関して再度プロンプトを表示しません。

スクリプトの署名方法

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

コード署名に関するベスト プラクティスについては、「コード署名のベスト プラクティス」(https://go.microsoft.com/fwlink/?LinkId=119096) を参照してください。

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

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

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

  • - 証明機関によって作成される証明書:

    料金を支払うことで、公共の証明機関は利用者の身元を確認し、コード署名証明書を提供します。よく知られた証明機関から証明書を購入すると、Windows を実行している他のコンピューターはその証明機関を信頼しているため、そうした他のコンピューター上のユーザーとスクリプトを共有することができます。

  • -- みずから作成する証明書:

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

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

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

自己署名証明書の作成

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

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

MakeCert.exe ツールの構文とパラメーターの詳細については、MSDN ライブラリの「証明書作成ツール (MakeCert.exe)」(https://go.microsoft.com/fwlink/?LinkId=119097) を参照してください。

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 ツールでは、秘密キーのパスワードを入力するよう求められます。パスワードにより、誰も同意を得ずに証明書を使用またはアクセスすることはできません。記憶可能なパスワードを作成して、入力します。後でこのパスワードを使用して、証明書を取得します。

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

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

            get-childitem cert:\CurrentUser\my -codesigning

このコマンドは Windows 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 という名前を付けます。

注記:スクリプト ファイルには .txt ファイル名拡張子を付けないでください。テキスト エディターで「.txt」を追加される場合、"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 スクリプト ファイルに署名するには、Windows PowerShell コマンド プロンプトで次のコマンドを入力します。

        $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
    
        Set-AuthenticodeSignature add-signature.ps1 $cert

スクリプトが署名されると、ローカル コンピューターで実行できます。ただし、Windows PowerShell 実行ポリシーで信頼された証明機関からのデジタル署名が必要なコンピューターではスクリプトは実行されません。実行しようとすると、Windows 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 <<<<

自ら作成したものではないスクリプトを実行すると Windows PowerShell がこのメッセージを表示する場合、任意の署名されていないスクリプトと同様に扱います。コードを確認し、スクリプトを信頼できるかどうかを判別します。

証明書の強力な秘密キー保護の有効化

コンピューター上にプライベート証明書がある場合、悪意のあるプログラムはユーザーに代わってスクリプトに署名し、Windows PowerShell に実行権限を与える場合があります。

ユーザーの代理による自動署名を回避するには、証明書マネージャー (Certmgr.exe) を使用して、署名証明書を .pfx ファイルにエクスポートします。証明書マネージャーは、Microsoft .NET Framework SDK、Microsoft Windows SDK、および Internet Explorer 5.0 以降のバージョンに含まれています。

証明書をエクスポートするには、次の手順を実行します。

  • 1. 証明書マネージャーを起動します。

  • 2. PowerShell ローカル証明書ルートによって発行された証明書を選択します。

  • 3. [エクスポート] をクリックして、証明書のエクスポート ウィザードを起動します。

  • 4. [はい] を選択し、秘密キーをエクスポートして、[次へ] をクリックします。

  • 5. [強力な保護を有効にする] を選択します。

  • 6. パスワードを入力し、確認のためにもう一度入力します。

  • 7. .pfx ファイル名拡張子を持つファイル名を入力します。

  • 8. [完了] をクリックします。

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

  • 1. 証明書マネージャーを起動します。

  • 2. [インポート] をクリックして、証明書のインポート ウィザードを起動します。

  • 3. エクスポート処理中に作成した .pfx ファイルの場所を開きます。

  • 4. [パスワード] ページで、[秘密キーの保護を強力にする] を選択し、エクスポート処理中に割り当てたパスワードを入力します。

  • 5. 個人証明書ストアを選択します。

  • 6. [完了] をクリックします。

署名の有効期限切れの防止

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

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

関連項目

about_Execution_Policies

about_Profiles

Get-ExecutionPolicy

New-SelfSignedCertificate

Set-ExecutionPolicy

Set-AuthenticodeSignature

「コード署名の概要」(https://go.microsoft.com/fwlink/?LinkId=106296)