トピック
    about_signing

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

詳細説明
    Restricted 実行ポリシーでは、すべてのスクリプトの実行が禁止されます。
    AllSigned 実行ポリシーおよび RemoteSigned 実行ポリシーでは、デジタル署名がないスクリプ
    トの実行が禁止されます。

    このトピックでは、実行ポリシーが RemoteSigned の場合であっても選択した署名されていないス
    クリプトを実行する方法について説明します。加えて、自分専用にスクリプトに署名する方法について
    説明します。
    
    Windows PowerShell の実行ポリシーの詳細については、「about_Execution_Policy」を参照
    してください。


 署名されているスクリプトの実行の許可
 -------------------------------
    コンピューター上で初めて Windows PowerShell を起動すると、通常は Restricted 実行ポリシ
    ー (既定値) が有効になります。

    Restricted 実行ポリシーでは、すべてのスクリプトの実行が禁止されます。

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

        get-executionpolicy

    自分がローカル コンピューター上で作成した署名のないスクリプトおよび他のユーザーの署名が付け
    られたスクリプトを実行するには、次のコマンドを使用して、コンピューター上の実行ポリシーを 
    RemoteSigned に変更します。

	set-executionpolicy remotesigned

    詳細については、「Set-ExecutionPolicy」を参照してください。


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

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

        ファイル <file-name> を読み込めません。ファイル <file-name> はデジタル署名されてい
        ません。このスクリプトはシステムで実行されません。詳細については、「Get-Help 
        about_signing」と入力してヘルプを参照してください。

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

    署名なしスクリプトを実行するには、以下の手順を実行します。

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

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

        この信頼されていない発行元からのソフトウェアを実行しますか? ファイル <file-name> の発行
        元は CN=<publisher-name> であり、このシステムで信頼されていません。信頼された発行元からのス
        クリプトのみを実行してください。

        [V] 常に実行しない [D] 実行しない [R] 一度だけ実行する [A] 常に実行する 
        [?] ヘルプ (既定値は "D") :
    
        発行元が信頼できる場合は、[一度だけ実行する] または [常に実行する] を選択します。発行元が
        信頼できない場合は、[常に実行しない] または [実行しない] を選択します。[常に実行しない] または 
        [常に実行する] を選択した場合は、この発行元に関するプロンプトは二度と表示されません。
    

 スクリプトの署名方法
 --------------------------
    自分で記述したスクリプトおよび他のソースから入手したスクリプトに署名できます。スクリプトに署名する前に、
    各コマンドをチェックして、実行しても安全であることを確認します。

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

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

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

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

           公的な証明機関が有料でユーザーの身元を確認し、コード署名用の証明書を発行します。
           信頼できる証明機関から証明書を購入した場合は、Windows を実行している他のコンピュー
           ターがその証明機関を信頼しているので、そのコンピューター上のユーザーとスクリプトを共有できます。

        -- 独自に作成した証明書:

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

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

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


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

    MakeCert.exe ツールの構文およびパラメーターの詳細については、MSDN (Microsoft 
    Developer Network) ライブラリの「Certificate Creation Tool (証明書作成ツール、
    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
            ## ファイルに署名する
            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 実行ポリシーによって、信頼された機関からのデジタル署名が要求されるコンピュータ
    ー上では、そのスクリプトを実行できません。スクリプトを実行しようとした場合、次のエラー メッセージが表示
    されます。

        ファイル C:\remote_file.ps1 を読み込めません。証明書の署名を検証できません。
        行:1 文字:15
        + .\ remote_file.ps1 <<<<

    自作スクリプト以外のスクリプトを実行してこのメッセージが表示された場合は、そのファイルを署名
    なしスクリプトと同様に処理します。コードを調べて、スクリプトが信頼できるかどうかを判定します。


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

    コンピューター上にプライベート証明書が存在する場合は、悪意のあるプログラムが勝手にスクリプトに署名して、
    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
    Set-ExecutionPolicy
    Set-AuthenticodeSignature
    「Introduction to Code Signing (コード署名の概要)」
    (https://go.microsoft.com/fwlink/?LinkId=106296)




目次