C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

実行ファイルのデジタル署名

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■89666 / inTopicNo.1)  実行ファイルのデジタル署名
  
□投稿者/ ken (1回)-(2018/12/13(Thu) 16:41:22)

分類:[C#] 

お世話になります。

環境:Winodws10、.NET 4.6.1

あるフォルダ配下にある実行ファイルについている
デジタル署名(署名者名、アルゴリズム、タイムスタンプ)
を取得して、ファイルに出力したいのですが、
そのようなことは可能でしょうか?

FileInfoには、該当の内容が無いようですので、ほかのクラスで取得できるのでしょうか?
Shell32.Folderでも、デジタル署名に係る内容は取得できませんでした。

ご教示、よろしくお願い致します。

引用返信 編集キー/
■89668 / inTopicNo.2)  Re[1]: 実行ファイルのデジタル署名
□投稿者/ SO (1回)-(2018/12/13(Thu) 16:50:46)
No89666 (ken さん) に返信

ググっただけですが。

https://ja.stackoverflow.com/questions/18873/%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA%E7%BD%B2%E5%90%8D%E3%82%92%E8%A1%8C%E3%81%A3%E3%81%9Fexe%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%88%A4%E5%88%A5%E3%81%97%E3%81%9F%E3%81%84
引用返信 編集キー/
■89669 / inTopicNo.3)  Re[2]: 実行ファイルのデジタル署名
□投稿者/ ken (3回)-(2018/12/13(Thu) 17:15:37)
No89668 (SO さん) に返信


ありがとうございます。

情報が不足し、申し訳ありません。
実行ファイルは、必ずしも.netでないので、例外が発生します。

右クリック→プロパティ→デジタル署名 で表示される内容が欲しいのです。
システムファイルは、 sigverifコマンドで見られるようなのですが。


> ■No89666 (ken さん) に返信
>
> ググっただけですが。
>
> https://ja.stackoverflow.com/questions/18873/%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA%E7%BD%B2%E5%90%8D%E3%82%92%E8%A1%8C%E3%81%A3%E3%81%9Fexe%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%88%A4%E5%88%A5%E3%81%97%E3%81%9F%E3%81%84
引用返信 編集キー/
■89670 / inTopicNo.4)  Re[3]: 実行ファイルのデジタル署名
□投稿者/ とっちゃん (557回)-(2018/12/13(Thu) 17:41:53)
No89669 (ken さん) に返信

X509Certificate.CreateFromSignedFile(String) Method とかどうでしょう?

https://docs.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.x509certificates.x509certificate.createfromsignedfile?view=netframework-4.7.2


引用返信 編集キー/
■89671 / inTopicNo.5)  Re[4]: 実行ファイルのデジタル署名
□投稿者/ とっちゃん (558回)-(2018/12/13(Thu) 17:54:17)
追記。

var cert = new X509Certificate2( X509Certificate.CreateFromSingedFile( filePath ) );

とすれば、X509Certificate2 クラスが取れます(単純キャストみたいなもの)。
いろいろみたいという場合はこっちのほうがいいのかな?

署名がついてない場合は例外が出ます。そのほかにも発生条件があるけどもう覚えてません。

引用返信 編集キー/
■89672 / inTopicNo.6)  Re[1]: 実行ファイルのデジタル署名
□投稿者/ ito (1回)-(2018/12/13(Thu) 17:56:07)
2018/12/13(Thu) 17:57:27 編集(投稿者)

No89666 (ken さん) に返信
SignTool.exeを子プロセスとして起動するのはどうでしょう?
https://docs.microsoft.com/ja-jp/dotnet/framework/tools/signtool-exe
※子プロセスとして起動する場合、SignTool.exeの標準出力をリダイレクトしてプログラムで拾う必要があるでしょう。

おそらく、使うコマンド。
SignTool.exe verify /v <filename(s)>

引用返信 編集キー/
■89673 / inTopicNo.7)  Re[5]: 実行ファイルのデジタル署名
□投稿者/ ken (5回)-(2018/12/13(Thu) 18:09:08)
No89671 (とっちゃん さん) に返信

ありがとうございます。

まだ、途中ですが、教えていただいたX509Certificate2 クラスで、行けそうです。
いろいろと、試してみます。


> 追記。
>
> var cert = new X509Certificate2( X509Certificate.CreateFromSingedFile( filePath ) );
>
> とすれば、X509Certificate2 クラスが取れます(単純キャストみたいなもの)。
> いろいろみたいという場合はこっちのほうがいいのかな?
>
> 署名がついてない場合は例外が出ます。そのほかにも発生条件があるけどもう覚えてません。
>
引用返信 編集キー/
■89674 / inTopicNo.8)  Re[2]: 実行ファイルのデジタル署名
□投稿者/ ken (6回)-(2018/12/13(Thu) 18:12:55)
No89672 (ito さん) に返信

ありがとうございます。

SignTool.exeのVerify /pa で見られる内容で最悪対応しようと思っていました。

しかし、/vのスイッチが分かりませんでした。
日本語ページには、記載ないですね。。。
参考にして、対応させていただきます。



> 2018/12/13(Thu) 17:57:27 編集(投稿者)
>
> ■No89666 (ken さん) に返信
> SignTool.exeを子プロセスとして起動するのはどうでしょう?
> https://docs.microsoft.com/ja-jp/dotnet/framework/tools/signtool-exe
> ※子プロセスとして起動する場合、SignTool.exeの標準出力をリダイレクトしてプログラムで拾う必要があるでしょう。
>
> おそらく、使うコマンド。
> SignTool.exe verify /v <filename(s)>
>
引用返信 編集キー/
■89675 / inTopicNo.9)  Re[6]: 実行ファイルのデジタル署名
□投稿者/ 魔界の仮面弁士 (1990回)-(2018/12/13(Thu) 18:29:48)
No89666 (ken さん) に返信
> あるフォルダ配下にある実行ファイルについている
> デジタル署名(署名者名、アルゴリズム、タイムスタンプ)
> を取得して、ファイルに出力したいのですが、
> そのようなことは可能でしょうか?

X509Certificate2 クラスから辿れそうな気もするのですが、タイムスタンプが分からない…。
アンマネージ(crypt32.dll) な実装はあったのですが。


// using System;
// using System.IO;
// using System.Security.Cryptography;
// using System.Security.Cryptography.X509Certificates;

var filePath = @"C:\Windows\explorer.exe";
using (var cert = new X509Certificate2(X509Certificate.CreateFromSignedFile(filePath)))
{
  Console.WriteLine("FileName: {0}", Path.GetFileName(filePath));
  Console.WriteLine("Subject: {0}", cert.SubjectName.Format(false));
  Console.WriteLine("Issuer: {0}", cert.IssuerName.Format(false));
  Console.WriteLine("SimpleName: {0} ({1})", cert.GetNameInfo(X509NameType.SimpleName, false), cert.GetNameInfo(X509NameType.SimpleName, true));
  Console.WriteLine("Thumbprint: {0}", cert.Thumbprint);
  Console.WriteLine("SignatureAlgorithm: {0} ({1})", cert.SignatureAlgorithm.Value, cert.SignatureAlgorithm.FriendlyName);
  var extKeyUsage = (X509KeyUsageExtension)cert.Extensions["2.5.29.15"];
  if (extKeyUsage != null)
  {
    Console.WriteLine("KeyUsage: {0}", extKeyUsage.KeyUsages);
  }
  var extEnhancedKeyUsage = (X509EnhancedKeyUsageExtension)cert.Extensions["2.5.29.37"];
  if (extEnhancedKeyUsage != null)
  {
    Console.WriteLine("{0} ({1}):", extEnhancedKeyUsage.Oid.Value, extEnhancedKeyUsage.Oid.FriendlyName);
    //Console.WriteLine(extEnhancedKeyUsage.Format(true));
    foreach (var oid in extEnhancedKeyUsage.EnhancedKeyUsages)
    {
      Console.WriteLine("  {0} ({1})", oid.Value, oid.FriendlyName);
    }
  }
  // UNDER CONSTRUCTION...
}
引用返信 編集キー/
■89681 / inTopicNo.10)  Re[7]: 実行ファイルのデジタル署名
□投稿者/ とっちゃん (559回)-(2018/12/14(Fri) 11:29:41)
No89675 (魔界の仮面弁士 さん) に返信
> ■No89666 (ken さん) に返信
>>あるフォルダ配下にある実行ファイルについている
>>デジタル署名(署名者名、アルゴリズム、タイムスタンプ)
>>を取得して、ファイルに出力したいのですが、
>>そのようなことは可能でしょうか?
>
> X509Certificate2 クラスから辿れそうな気もするのですが、タイムスタンプが分からない…。
> アンマネージ(crypt32.dll) な実装はあったのですが。
>
DateTime X509Certificate2.NotBefore; // 発効日
DateTime X509Certificate2.NotAfter; // 有効期限

TimestampInformation のほうはよくわからないです。
引用返信 編集キー/
■89683 / inTopicNo.11)  Re[8]: 実行ファイルのデジタル署名
□投稿者/ 魔界の仮面弁士 (1991回)-(2018/12/14(Fri) 12:01:17)
No89681 (とっちゃん さん) に返信
>> X509Certificate2 クラスから辿れそうな気もするのですが、タイムスタンプが分からない…。
>> アンマネージ(crypt32.dll) な実装はあったのですが。
> TimestampInformation のほうはよくわからないです。

今のところ、証明書のチェーンを辿ることぐらいまでしかできていません。

using (var chain = X509Chain.Create())
using (var cert = new X509Certificate2(X509Certificate.CreateFromSignedFile(filePath)))
{
 // X509Certificate2UI.DisplayCertificate(cert);
 chain.Build(cert);
 foreach (var x509Cert in chain.ChainElements.OfType<X509ChainElement>().Select(c => c.Certificate))
 {
  X509Certificate2UI.DisplayCertificate(x509Cert);
 }
}


https://www9.atwiki.jp/kurushima/pages/67.html
1.2.840.113549.1.9.16.2.14 (SignatureTimeStamp)


https://support.microsoft.com/ja-jp/help/287547/object-ids-associated-with-microsoft-cryptography
1.3.6.1.4.1.311.2 (Authenticode)
1.3.6.1.4.1.311.10.3.2 (szOID_KP_TIME_STAMP_SIGNING)


https://docs.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.pkcs.signedcms
https://docs.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.pkcs.pkcs9signingtime
関係あるかは不明
引用返信 編集キー/
■89731 / inTopicNo.12)  Re[9]: 実行ファイルのデジタル署名
□投稿者/ ken (7回)-(2018/12/19(Wed) 13:24:36)
No89683 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士さん。
いろいろと、ありがとうございます。

いったんタイムスタンプは、有効期間にてもラッテお茶を濁しました。

表示される署名の情報を取得するだけなので簡単に取れるかと思ったのですが、なかなか難しいですね。

一旦、解決済みとしておきます。


> ■No89681 (とっちゃん さん) に返信
> >> X509Certificate2 クラスから辿れそうな気もするのですが、タイムスタンプが分からない…。
> >> アンマネージ(crypt32.dll) な実装はあったのですが。
>>TimestampInformation のほうはよくわからないです。
>
> 今のところ、証明書のチェーンを辿ることぐらいまでしかできていません。
>
> using (var chain = X509Chain.Create())
> using (var cert = new X509Certificate2(X509Certificate.CreateFromSignedFile(filePath)))
> {
>  // X509Certificate2UI.DisplayCertificate(cert);
>  chain.Build(cert);
>  foreach (var x509Cert in chain.ChainElements.OfType<X509ChainElement>().Select(c => c.Certificate))
>  {
>   X509Certificate2UI.DisplayCertificate(x509Cert);
>  }
> }
>
>
> https://www9.atwiki.jp/kurushima/pages/67.html
> 1.2.840.113549.1.9.16.2.14 (SignatureTimeStamp)
>
>
> https://support.microsoft.com/ja-jp/help/287547/object-ids-associated-with-microsoft-cryptography
> 1.3.6.1.4.1.311.2 (Authenticode)
> 1.3.6.1.4.1.311.10.3.2 (szOID_KP_TIME_STAMP_SIGNING)
>
>
> https://docs.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.pkcs.signedcms
> https://docs.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.pkcs.pkcs9signingtime
> 関係あるかは不明
解決済み
引用返信 編集キー/
■89732 / inTopicNo.13)  Re[10]: 実行ファイルのデジタル署名
□投稿者/ 魔界の仮面弁士 (1999回)-(2018/12/19(Wed) 15:17:13)
No89731 (ken さん) に返信
> 一旦、解決済みとしておきます。
チェックは維持しておきます。


> いったんタイムスタンプは、有効期間にてもラッテお茶を濁しました。
これだけだと、コード署名(1.3.6.1.5.5.7.3.3)に対応した証明書の存在等を
確認できるだけで、その署名の有効性は確認できないのでは無いでしょうか。

タイムスタンプが無い署名は、証明書の有効期限が切れると効力を失いますが、
署名時にタイムスタンプが含まれている場合、証明書の有効期限が切れたとしても、
署名は引き続き有効ですよね。


No89675 (魔界の仮面弁士) に追記
> X509Certificate2 クラスから辿れそうな気もするのですが、タイムスタンプが分からない…。
> アンマネージ(crypt32.dll) な実装はあったのですが。

ちなみに上記のアンマネージ実装というのは下記の事です。(試していません)

https://support.microsoft.com/ja-jp/help/323809/how-to-get-information-from-authenticode-signed-executables
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ