1. 程式人生 > >c# 生成數字簽名

c# 生成數字簽名

通過查閱msdn數字證書相關資訊,個人覺得程式的證書要最終發揮作用,應當是將我們自己的證書最終要匯入到控制檯的受信任的根證書頒發機構,不論可執行程式是在何時註冊的數字證書(可能是已經註冊好放入安裝包,也可能是在安裝時註冊),這時以管理員執行時就會顯示出證書的資訊,若沒有在受信任的根證書頒發機構,將顯示釋出者未知。

  那現在我們要做的也很明確了:

  1:首先我們需要生成一個自己的證書

  2:我們要將證書匯入到 受信任的根證書頒發機構

  那如何生成自己的證書呢?微軟提供有Makecert.exe(證書建立工具),也可以使用程式碼的方式生成,下面介紹如何使用Makecert.exe建立我們的證書

  Makecert.exe這個工具只要我們安裝了visual studio,使用命令提示符就可以了

  在命令提示符內輸入

  makecert -r -pe -n "CN=你的證書名字" -a sha1 -b 01/01/2012 -e 01/01/2040 -sky exchange -ss my

  -ss my:證書生成到個人證書位置,這時我們可以在控制檯個人證書位置找到生成的證書了,引數的具體含義檢視Makecert.exe

  因後續我們需要將證書在安裝時匯入到客戶機器上,所以我們將生成好的證書匯出,右鍵證書->所有任務->匯出,如圖

  我們選擇預設的格式匯出(.CER)。

  現在我們已經有了自己的證書檔案,還需要將其匯入到 受信任的根證書頒發機構。我們這塊使用程式碼實現將其匯入,操作類(X509Certificate2)。

  + View Code?

  X509Certificate2 cert = new X509Certificate2("逗豆豆.cer");

  bool my_import = false;

  bool root_import = false;

  if (cert != null)

  {

  var store2 = new X509Store(StoreName.My, StoreLocation.CurrentUser);

  store2.Open(OpenFlags.ReadWrite);

  if (!store2.Certificates.Contains(cert))

  {

  my_import = true;

  store2.Add(cert);

  }

  var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);

  store.Open(OpenFlags.ReadWrite);

  if (!store.Certificates.Contains(cert))

  {

  root_import = true;

  store.Add(cert);

  }

  }

  StringBuilder sb = new StringBuilder();

  if (my_import)

  {

  sb.Append("成功匯入到個人證書目錄\r\n");

  }

  if (root_import)

  {

  sb.Append("成功匯入到受信任的根證書頒發機構證書目錄\r\n");

  }

  if (sb.Length == 0)

  MessageBox.Show("已經匯入過證書");

  else

  MessageBox.Show(sb.ToString());

  上面程式碼將證書匯入到了個人證書以及受信任的根證書頒發機構,接下來我們需要對我們的可執行程式進行簽名,那簽名與生成證書類似,微軟也有提供一個SignTool.exe(簽名工具),同樣開啟命令提示符輸入:signtool sign /a F:\SignatureDemo.exe,引數的具體含義檢視SignTool.exe

  這個時候右鍵管理員身份執行就可以看到我們要的效果便達到了。但是實際專案中可能需要在安裝程式的時候將證書匯入,所以我們可以新增一個安裝類,在重寫安裝的方法內將證書匯入:

  + View Code?

  using System;

  using System.Collections;

  using System.Collections.Generic;

  using System.ComponentModel;

  using System.Configuration.Install;

  using System.Linq;

  using System.Security.Cryptography.X509Certificates;

  namespace SignatureDemoInstaller

  {

  [RunInstaller(true)]

  public partial class DemoInstaller : System.Configuration.Install.Installer

  {

  public DemoInstaller()

  {

  InitializeComponent();

  }

  //-------------重寫安裝方法------------------------------------------------

  public override void Install(IDictionary stateSaver)

  {

  base.Install(stateSaver);

  ImportCert();

  }

  //-------------匯入證書----------------------------------------------------

  private void ImportCert()

  {

  X509Certificate2 cert = new X509Certificate2(Context.Parameters["targetdir"] + "\\Bin\\SityTech.cer");

  if (cert != null)

  {

  var store2 = new X509Store(StoreName.My, StoreLocation.CurrentUser);

  store2.Open(OpenFlags.ReadWrite);

  if (!store2.Certificates.Contains(cert))

  {

  store2.Add(cert);

  }

  var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);

  store.Open(OpenFlags.ReadWrite);

  if (!store.Certificates.Contains(cert))

  {

  store.Add(cert);

  }

  }

  }

  }

  }

  五、原始碼什麼的

  關於如何打包以及部署問題,可以參考文章的最頂端有介紹,這裡就不再贅述,實際步驟很簡單,大家完全可以使用程式碼生成證書的方式,做到動態生成證書並匯入,文章可能看起來排版不這麼好,也是給想要深入研究的人一點點小建議,另外使用vs2011之前版本的部署專案,生成的msi檔案安裝完畢之後,桌面的快捷方式右鍵指向不到程式目錄並且右鍵也沒有管理員身份執行的選項,需要使用Orca工具編輯一下,安裝完畢Orca之後右鍵Msi程式->用Orca編輯,在左邊的Tables列表中找到Shortcut表,在右邊記錄中找到Directory為DesktopFolder的記錄,修改該記錄的Target屬性為 [TARGETDIR]應用程式名稱.exe即可。

  再另外一下..此文章生成證書僅限於學習交流,正式生產環境下,大家應該去證書頒發機構購買,其實很便宜的...,最後demo和msi編輯工具奉上,算是有點用的話,點下推薦吧