如何在 Windows(非IIS) 製作 SHA2(SHA256) 的 .csr 憑證簽章檔案

如何在 Windows(非IIS) 製作 SHA2(SHA256) 的 .csr 憑證簽章檔案

今天在申請 SSL 憑證被單位告知,使用 IIS 產出的 CSR 採用的 SHA1 演算法已被破解(就找到的新聞來看,是被認為不安全,各大公司有計畫性的淘汰 SHA1,例如:SSL 和程式碼簽章憑證的 SHA-1 雜湊演算法移轉 - 以 SHA-2 憑證取代 SHA-1 憑證HTTPS網站被Chrome打臉?),需改用 SHA2(SHA256) 重新製作,但找了半天也沒找到 IIS 在建立憑證簽章請求的 GUI 中可以選擇 SHA2 演算法,後來才知道,使用 IIS GUI 來產生的 .csr 憑證檔案預設都是使用 SHA1 演算法。那麼怎麼辦呢?

還好小弟自己每年要為 kkbruce.tw 申請與安裝 SSL,剛好略懂 SSL 的申請與安裝,不然如果直覺下關鍵字「iis sha2 csr」(我還是有下啦),那些方法看完頭都昏了。

使用 certreq.exe 製作 .csr 憑證簽章檔

首先,準備一個純文字檔,複製貼上以下內容,重點在 <your-domain> 替換為你的網域名稱。

[NewRequest]
  Subject = "CN=<your-domain>"  ; E.g. "CN=www.contoso.com", or "CN=*.contoso.com" for a wildcard certificate
  Exportable = TRUE
  KeyLength = 2048              ; Required minimum is 2048
  KeySpec = 1
  KeyUsage = 0xA0
  MachineKeySet = True
  ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
  ProviderType = 12
  HashAlgorithm = SHA256

  [EnhancedKeyUsageExtension]
  OID=1.3.6.1.5.5.7.3.1         ; Server Authentication
 

透過組態檔案的方式,可以 HashAlgorithm 指定演算法,這樣就能很順利的產生 SHA256 雜湊後的 .csr 憑證簽章檔案。

使用管理者權限開啟 cmd.exe 切換至純文字檔所在目錄,執行以下指令產生 .csr 憑證簽章檔案:

certreq -new test1.txt test1.csr

.csr 憑證簽章檔案內容可以使用 CSR Check 來檢驗。紅色部份是提醒你缺少某些資訊,一般申請給 Azure WebSites 的 SSL 而言,使用以上的 .csr 憑證簽章檔案是沒有問題的。

CSR Check

但剛好需要申請的是公司正式憑證,所以補充資訊不能少,上網找了一會才知道,那個 NewRequest 的設定檔有個比較正式得名稱為 INF 組態檔,微軟官方 certreq 說明文件於這段內容沒有很完整,找到一分 vmware 的文件,裡面的範例給了完全細部資訊的完整範例:

Subject = "CN=View_Server_FQDN, OU=Organizational_Unit, O=Organization, L=City, S=State, C=Country"

有了它我們修正我們的 INF 組態檔:

[NewRequest]
  Subject = "CN=www.kkbruce.tw, OU=DevOps, O=KingKong, L=Hsinchu, S=Hsinchu, C=TW"
  Exportable = TRUE
  KeyLength = 2048
  KeySpec = 1
  KeyUsage = 0xA0
  MachineKeySet = True
  ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
  ProviderType = 12
  HashAlgorithm = SHA256

 [EnhancedKeyUsageExtension]
  OID=1.3.6.1.5.5.7.3.1
 

重新產生 .csr 並驗證:

CSR Check

事情結束了嗎?還沒,我碰到的案例剛好是這樣:

[NewRequest]
  Subject = "CN=www.kkbruce.tw, OU=DevOps, O=KingKong, Inc., L=Hsinchu, S=Hsinchu, C=TW"
  Exportable = TRUE
  KeyLength = 2048
  KeySpec = 1
  KeyUsage = 0xA0
  MachineKeySet = True
  ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
  ProviderType = 12
  HashAlgorithm = SHA256
  X500NameFlags = 0x40000000

 [EnhancedKeyUsageExtension]
  OID=1.3.6.1.5.5.7.3.1
 

有無發現那小小的差異,驗證結果超慘的,連最基本的 Common name 都過不了:

CSR Check

原因在於在組織名稱(Organisation Name)裡包含了重要的分隔符號(,),結果 CSR Check 解析就出問題了。還好找到一個相同問題的討論串,解法就是指定其他的分隔符號:

[NewRequest]
  Subject = "CN=www.kkbruce.tw; OU=DevOps; O=KingKong, Inc.; L=Hsinchu; S=Hsinchu; C=TW"
  Exportable = TRUE
  KeyLength = 2048
  KeySpec = 1
  KeyUsage = 0xA0
  MachineKeySet = True
  ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
  ProviderType = 12
  HashAlgorithm = SHA256
  X500NameFlags = 0x40000000

 [EnhancedKeyUsageExtension]
  OID=1.3.6.1.5.5.7.3.1
 
CSR Check

使用 X500NameFlags = 0x40000000 指定分隔符號,就能正常在 Subject 裡使用","(Comma)符號。

這樣,就從略懂又進步到"略懂略懂"。 :-)

2 則留言:

  1. 不好意思,想請教一下,使用這個方法產生出來的csr檔,要怎樣import到IIS中給https使用?
    我使用的環境是Windows Server 2012 R2

    回覆刪除
    回覆
    1. 這是要提交給你購買憑證的單位,憑證單位會用你產生 csr 產生對應憑證當給你,你才能匯入。

      刪除

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。