1. 程式人生 > >生成線上用https證書,支援萬用字元和多域名,初學Let’s Encrypt用於IIS,純本地手動

生成線上用https證書,支援萬用字元和多域名,初學Let’s Encrypt用於IIS,純本地手動

線上一直用的騰訊雲的免費證書(每個域名都要一個證書(滑稽),今天線上用的萬用字元證書也搞定了,實現了一個證書包含多個域名(多個泛域名)。

今年(2018)年初Let’s Encrypt已開放了萬用字元證書的申請《Wildcard Certificates Coming January 2018》,目前只支援通過dns解析進行驗證。沒有萬用字元的證書時在心裡感覺用起來會很累,一直沒有去嘗試。以前AlphaSSL的萬用字元證書倒是可以免費申請,assl.loovit.net都已經跳轉到別的地方了。現在可以勇敢的去用Let’s Encrypt的萬用字元證書了。

官方並沒有簡單易用的客戶端

申請環境:本地(線上不亂搞),win7+Win32OpenSSL

Let’s Encrypt提供的客戶端列表包括開源實現《ACME Client Implementations》,電腦上能裝上的基本上都試了一下(捆綁生產環境的軟體不鳥),好幾個依賴高版本的.Net(勉為其難的裝了一下),始終沒搞懂怎麼耍,入門到放棄。然後用C#呼叫了一個封裝好的介面試了一下,目測工作量也不小,入門到放棄。

Let’s Encrypt 使用吐槽》這裡面說的比較贊同的一點這才是你真正需要的 acme-client ,只幹申請證書這一件事的指令碼。哈哈,其實發現申請證書只是簡單的呼叫幾個api.letsencrypt.org

RESTful介面,並且都含有響應頭Access-Control-Allow-Origin:*,就不去研究他們的文件了,因為翻了一般官網,並沒有發現哪裡有這種直接了當的文件。

Let’s Encrypt提供的網頁客戶端列表中的Get HTTPS for free https://gethttpsforfree.com/就是直接使用的介面,這個網站聲稱This website is static, so it can be saved and loaded locally. Just right-click and "Save Page As.."! 檢視程式碼確實是一個靜態網站。其他幾個網頁客戶端也稍微試了一下,有些要註冊還主動幫你管理證書(不鳥)。其實一個靜態網頁也能夠實現證書的申請,還不用下載安裝各種環境,比較靠譜。

使用Get HTTPS for free申請證書

地址https://gethttpsforfree.com/
這個頁面使用起來很方便,因為該提示的地方都有提示,按照提示做沒有壓力,順利申請到了兩個域名合在一起的證書。

主要要手動做的事情:
1. 建立兩個祕鑰,一個賬戶祕鑰,一個域名證書祕鑰(2048位,這個網站寫4096位感覺有點大,百度和Let’s Encrypt都是2048位)
2. 建立證書申請請求
3. 多次進行文字內容簽名(用賬戶祕鑰)

*. 申請好的證書製作成pfx檔案匯入IIS (我用IIS是要這一步的)

這些步驟都可以用指令碼去處理,點一下->複製貼上,手動也不比自動差(其實也沒有便捷的全自動,dns驗證還是要手動寫入TXT記錄)

使用到的指令碼

下面這些檔案全部是在同一個資料夾裡面:
1.建立祕鑰.cmd,2.生成請求.ini,2.生成請求.cmd,3.簽名.cmd,3.簽名.txt,4.匯出.cmd

檔名:1.建立祕鑰.cmd

@echo off

set /p isSet=建立祕鑰會覆蓋現有祕鑰,確定要建立嗎?(y)
if not "%isSet%"=="y" goto end

echo 建立賬戶祕鑰
openssl genrsa -out key.account.private 2048
openssl rsa -in key.account.private -pubout -out key.account.public

echo 建立證書祕鑰
openssl genrsa -out key.domain.key 2048

:end
echo 結束
pause

檔名:2.生成請求.ini
這個檔案是OpenSSL安裝目錄中的配置檔案,copy過來改一下名字就行了,然後在檔案結尾新增下面內容,域名自己加(泛解析的要把一級域名加上,不加他們會不會自動加不知道,目測不會自動加)

[ ext ]
subjectAltName = @dns

[ dns ]
DNS.1 = baidu1.com
DNS.2 = *.baidu1.com
DNS.3 = baidu2.com
DNS.4 = *.baidu2.com

檔名:2.生成請求.cmd

@echo off

set /p isSet=需要先配置域名列表"2.生成請求.ini",配置好了嗎?(y)
if not "%isSet%"=="y" goto end

echo 生成請求
openssl req -new -sha256 -key key.domain.key -out domain.csr -subj "/" -reqexts ext -config 2.生成請求.ini

:end
echo 結束
pause

檔名:3.簽名.cmd

@echo off

set /p isSet=需要先寫入"3.簽名.txt",寫好了嗎?(y)
if not "%isSet%"=="y" goto end

openssl dgst -sha256 -hex -sign key.account.private 3.簽名.txt

:end
echo 結束
pause

檔名:3.簽名.txt
這個檔案是一個空檔案,到時候有需要簽名的資料複製進來執行一下簽名.cmd就能快速獲得簽名。

檔名:4.匯出.cmd

@echo off

echo 匯出pfx,請輸入密碼1
pause
openssl pkcs12 -export -out domain.pfx -inkey key.domain.key -in domain.crt

:end
echo 結束
pause

申請製作過程

  1. 所有檔案準備好後(尤其是2.生成請求.ini把域名配置好),直接執行1.建立祕鑰.cmd,然後直接執行2.生成請求.cmd
  2. 把生成的key.account.public填入網頁Account Public Key中。
  3. 把生成的domain.csr填入網頁Certificate Signing Request中。
  4. 根據網頁提示簽名請求,每次簽名的時候:把文字複製到3.簽名.txt(只要引號裡面的文字內容,其他內容刪除),然後執行3.簽名.cmd得到簽名,把RSA-SHA256(3.簽名.txt)= XXXXX複製到網頁對應位置。
  5. 根據提示設定域名dns TXT解析,並完成驗證。
  6. 把最後一步生成的證書內容全部複製到新建的檔案domain.crt中,域名證書就獲取成功啦。
  7. 額外的生成IIS用的pfx檔案,執行一下4.匯出.cmd設定一下密碼就行了,我提示輸入1作為密碼,是因為我懶(滑稽。

秀一波

證書域名
有效期
涉及到的檔案