Windowsでコード署名用の自己署名証明書を作成するにはどうすればよいですか?


回答:


363

更新された回答

Windows Server 2012、Windows Server 2012 R2、またはWindows 8.1以降のWindowsバージョンを使用している場合、MakeCertは非推奨になりました。PowerShellコマンドレットNew-SelfSignedCertificateの使用をお勧めします。

Windows 7などの古いバージョンを使用している場合は、MakeCertまたは別のソリューションを使用する必要があります。公開鍵基盤Powershell(PSPKI)モジュールを提案する人もいます。

元の回答

自己署名のコード署名証明書(SPC- Software Publisher Certificate)を一度に作成できますが、私は以下を実行することをお勧めします。

自己署名認証局(CA)の作成

makecert -r -pe -n "CN=My CA" -ss CA -sr CurrentUser ^
         -a sha256 -cy authority -sky signature -sv MyCA.pvk MyCA.cer

(^ =バッチコマンドラインで行を折り返すことができます)

これにより、エクスポート可能な秘密鍵(-pe)を使用して自己署名(-r)証明書が作成されます。「My CA」という名前で、現在のユーザーのCAストアに配置する必要があります。SHA-256アルゴリズムを使用しています。キーは署名用です(-sky)。

秘密鍵はMyCA.pvkファイルに保存し、証明書はMyCA.cerファイルに保存する必要があります。

CA証明書のインポート

信頼できないCA証明書は無意味なので、Windows証明書ストアにインポートする必要があります。あなたはできますが、コマンドラインから、証明書MMCスナップインを使用します。

certutil -user -addstore Root MyCA.cer

コード署名証明書(SPC)の作成

makecert -pe -n "CN=My SPC" -a sha256 -cy end ^
         -sky signature ^
         -ic MyCA.cer -iv MyCA.pvk ^
         -sv MySPC.pvk MySPC.cer

上記とほとんど同じですが、発行者キーと証明書(-icおよび-ivスイッチ)を提供しています。

証明書とキーをPFXファイルに変換する必要もあります。

pvk2pfx -pvk MySPC.pvk -spc MySPC.cer -pfx MySPC.pfx

PFXファイルを保護する場合は、-poスイッチを追加します。それ以外の場合、PVK2PFXはパスフレーズのないPFXファイルを作成します。

証明書を使用してコードに署名する

signtool sign /v /f MySPC.pfx ^
              /t http://timestamp.url MyExecutable.exe

タイムスタンプが重要になる理由を確認してください

PFXファイルを証明書ストアにインポートする場合(PVKIMPRTまたはMMCスナップインを使用できます)、次のようにコードに署名できます。

signtool sign /v /n "Me" /s SPC ^
              /t http://timestamp.url MyExecutable.exe

の可能なタイムスタンプURL signtool /tは次のとおりです。

  • http://timestamp.verisign.com/scripts/timstamp.dll
  • http://timestamp.globalsign.com/scripts/timstamp.dll
  • http://timestamp.comodoca.com/authenticode

Microsoftの完全なドキュメント

ダウンロード

.NET開発者でない場合は、Windows SDKと.NETフレームワークのコピーが必要です。現在のリンクはSDK&.NET(makecertをにインストールしますC:\Program Files\Microsoft SDKs\Windows\v7.1)です。あなたのマイレージは異なる場合があります。

MakeCertは、Visual Studioコマンドプロンプトから利用できます。Visual Studio 2015にはそれがあり、Windows 7の[スタートメニュー]から[VS 2015の開発者コマンドプロンプト]または[VS2015 x64ネイティブツールコマンドプロンプト](おそらく同じフォルダーにあるすべて)から起動できます。


この方法を使用して証明書の電子メールアドレスフィールドを入力する方法はありますか?exe>プロパティ>デジタル署名を右クリックすると、署名後にメールが「利用不可」と表示されます。
cronoklee

「パラメータが多すぎます」というエラーが発生した場合は、ハイフンの1つを誤って編集していないことを確認してください。失敗した場合-ハイフンを再入力してください-貼り付けをコピーしないでください。
フィアット2012

8
@cronoklee証明書の電子メールフィールドに入力するには、単にを追加しE=your@emailます。例:makecert -pe -n "CN=My SPC,E=email@domain" ........
Rob W

1
-eku 1.3.6.1.5.5.7.3.3証明書をコード署名に使用できるように、Extended Use キーフラグは必要ありません(Powershellがスクリプトがない場合、スクリプトに署名できないことを知っています)
Scott Chamberlain

1
@ AdamPhelps、Windowsは証明書を信頼することを「学習」しません。ユーザーは、ルートストアにCA証明書をインストールする必要があります。これは一般的に言って悪い考えです(ルートCA証明書は悪意のある目的に使用される可能性があるため)。それはできるものの、企業のシナリオで意味をなします。
Roger Lipscombe 2014年

36

回答で述べたように、非推奨ではない方法で独自のスクリプトに署名するには、New-SelfSignedCertificateを使用する必要があります。

  1. キーを生成します。
New-SelfSignedCertificate -DnsName email@yourdomain.com -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
  1. 秘密鍵なしで証明書をエクスポートします。
Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt

[0]は、複数の証明書がある場合にこれを機能させます...インデックスを使用したい証明書と明らかに一致させるか、または(thumprintまたは発行者による)フィルタリングする方法を使用します。

  1. 信頼できる発行元としてインポートする
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
  1. ルート認証局としてインポートします。
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
  1. スクリプトに署名します(ここではscript.ps1という名前を想定しています)。それに応じてパスを修正します。
Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)

キーを設定したら、他のスクリプトに署名するだけで済みます。この記事で
は、より詳細な情報とトラブルシューティングのヘルプを入手できます。


これをありがとう。最初から下から答えるべきだったのに!
mdiehl13 2018

ありがとうございました。これにより、この「一見シンプルな」プロセスを機能させるための私の問題がすべて解決されました。
Dave、

1
「2」でエラーが発生しました。(get-ChildItem ...)複数の証明書を返すため、最後に "[0]"を付けて動作しました。のようにExport-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
ルンドマン2018

1
@Laraフィードバックに感謝します。低カフェインを試しているときでも簡単にするためにコンテキスト情報を追加しました;-)
chaami

1
@Laraシグナリングに感謝します。編集中に細心の注意を払っていませんでした。StackOverflowはブロックの構文についてよりうるさくなり、コードの開始前に新しい行を必要とするようになりました。
chaami

21

ロジャーの答えは非常に役に立ちました。

しかし、使用に少し問題があり、赤い「このドライバーソフトウェアの発行元を確認できません」というエラーダイアログが表示され続けました。重要なのは、テストルート証明書を

certutil -addstore Root Demo_CA.cer

ロジャーの答えは完全にカバーしていませんでした。

これは私のために働いたバッチファイルです(私の.infファイルは含まれていません)。GUIツールを使用せずに、最初から最後まですべてを行う方法を示します(いくつかのパスワードプロンプトを除く)。

REM Demo of signing a printer driver with a self-signed test certificate.
REM Run as administrator (else devcon won't be able to try installing the driver)
REM Use a single 'x' as the password for all certificates for simplicity.

PATH %PATH%;"c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin";"c:\Program Files\Microsoft SDKs\Windows\v7.0\Bin";c:\WinDDK\7600.16385.1\bin\selfsign;c:\WinDDK\7600.16385.1\Tools\devcon\amd64

makecert -r -pe -n "CN=Demo_CA" -ss CA -sr CurrentUser ^
   -a sha256 -cy authority -sky signature ^
   -sv Demo_CA.pvk Demo_CA.cer

makecert -pe -n "CN=Demo_SPC" -a sha256 -cy end ^
   -sky signature ^
   -ic Demo_CA.cer -iv Demo_CA.pvk ^
   -sv Demo_SPC.pvk Demo_SPC.cer

pvk2pfx -pvk Demo_SPC.pvk -spc Demo_SPC.cer ^
   -pfx Demo_SPC.pfx ^
   -po x

inf2cat /drv:driver /os:XP_X86,Vista_X64,Vista_X86,7_X64,7_X86 /v

signtool sign /d "description" /du "www.yoyodyne.com" ^
   /f Demo_SPC.pfx ^
   /p x ^
   /v driver\demoprinter.cat

certutil -addstore Root Demo_CA.cer

rem Needs administrator. If this command works, the driver is properly signed.
devcon install driver\demoprinter.inf LPTENUM\Yoyodyne_IndustriesDemoPrinter_F84F

rem Now uninstall the test driver and certificate.
devcon remove driver\demoprinter.inf LPTENUM\Yoyodyne_IndustriesDemoPrinter_F84F

certutil -delstore Root Demo_CA

4
これをドライバーの署名に使用する場合は、CA証明書をマシンストアにインポートする必要があります。私の例では、テスト/内部の目的で、ユーザーストアにインポートします。これは、ほとんどのソフトウェアで問題ありません。
Roger Lipscombe 2013年

20

PowershellでNew-SelfSignedCertificateコマンドを使用するのはかなり簡単です。powershellを開き、次の3つのコマンドを実行します。

1)証明書を作成します
$ cert = New-SelfSignedCertificate -DnsName www.yourwebsite.com -Type CodeSigning -CertStoreLocation Cert:\ CurrentUser \ My

2)パスワードを設定します
$ CertPassword = ConvertTo-SecureString -String "my_passowrd" -Force –AsPlainText

3)エクスポートします
Export-PfxCertificate -Cert "cert:\ CurrentUser \ My \ $($ cert.Thumbprint)" -FilePath "d:\ selfsigncert.pfx" -Password $ CertPassword

証明書selfsigncert.pfxは@にありますD:/


オプションの手順:証明書のパスワードをシステム環境変数に追加する必要もあります。これを行うには、cmdに以下を入力します。setx CSC_KEY_PASSWORD "my_password"


JerryGoyal自己署名証明書をCAルート信頼証明書に変換する方法を知っていますか?
Heelis氏2017年

12

PowerShell 4.0(Windows 8.1 / Server 2012 R2)以降、makecert.exeなしでWindowsで証明書を作成することが可能です

必要なコマンドはNew-SelfSignedCertificateおよびExport-PfxCertificateです。

手順はPowerShellを使用した自己署名証明書の作成にあります。


3
Windows 7でPowerShell 4.0を入手するためにWMF更新をインストールした場合でも、このコマンドにアクセスできないことは言及に値します。Win8またはServer 2012以降のようです。
ダニエルヤンコウスキー2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.