申請免費的SSL證書(Win7,PowerShell,Let's Encrypt)


隨着網絡安全形勢的發展,SSL已是各大網站的標配,啟用SSL的好處自然不必多說,然后每份SSL證書也要花費不菲的銀子,按最便宜的DV證書來看,每年也要個四五百呢。

有趨勢有需求,自然也有免費可用。免費的SSL證書中,首推就是Let's Encrypt。

Let's Encrypt,官網是https://letsencrypt.org/,它是一個由各大公司贊助的公益組織,我們看看它的介紹。

“Let’s Encrypt is a free, automated, and open certificate authority brought to you by the non-profit Internet Security Research Group (ISRG).”

既然是個公益組織,所以不可能請很多工作人員,所以,Let's Encrypt研發了一套協議,命名為ACME protocol(Automatic Certificate Management Environment),借助這套協議,更多熱心人員開發了相應的工具,使用這些工具就可以不借助其他人的幫助下,完成SSL證書的申請。

目前已有各種工具可以用於申請證書,你可以在如下這個地址里查找:
https://letsencrypt.org/docs/client-options/

我最熟悉的自然是Windows平台,此平台下,首推ACMESharp工具,因此將用此工具來進行SSL證書的申請。

我們需要准備的有

1、一台可以訪問Internet的Windows 7電腦,並具備管理員權限
2、Powershell 5.0
3、SSL證書對應的網站域名
4、一個郵箱地址
5、可以設置網站域名的DNS,或者可以設置網站下的文件夾和文件內容

如何查看和升級Powershell,請參見查看Powershell的版本升級Powershell到5.0(最新版本)

ACMESharp是一個開源軟件,它的源代碼位於“https://github.com/ebekker/ACMESharp”,如果你感興趣,可以到此網址下載源代碼自行研究。

它也自帶了一個英文版的快速安裝指引,訪問地址為:https://github.com/ebekker/ACMESharp/wiki/Quick-Start

申請步驟詳情如下:

如下的命令,必須以管理員身份運行Powershell,方能執行成功。

1、下載ACMESharp的Powershell模塊

 1 Save-Module -Name ACMESharp -Path <path> 

這里的<path>,請自行替換為你本地的路徑。

最新版本是0.8.1,你也可以點此位置下載。

2、復制ACMESharp進入到Powershell目錄下的Module文件夾中,通常這個文件夾位於:C:\Program Files\WindowsPowerShell\Modules目錄下

3、安裝ACMESharp的Powershell模塊

 1 Install-Module -Name ACMESharp 

4、導入ACMESharp的Powershell模塊

 1 Import-Module ACMESharp 

5、初始化Vault(Vault將用於存儲證書和相關信息)

如果是第一次運行,則不會有任何輸出,但如果是第二次運行,則會有錯誤提示,提示說Vault已存在。

 1 Initialize-ACMEVault 

6、向Let‘s Encrypt注冊用戶信息,並接受其服務協議

 1 New-ACMERegistration -Contacts mailto:<Email Address> -AcceptTos 

這里的<Email Address>,請替換為你的郵箱地址。

-AcceptTos,就是表示接受服務協議。

7、添加需要申請SSL證書的域名

 1 New-ACMEIdentifier -Dns <Domain Name> -Alias <Mark> 

這里的<Domain Name>,請替換為你需要申請SSL證書的那個域名。

這里的<Mark>,請替換為任意的一個別名,這個別名將用於后續申請中,用於代指你的域名。

8、驗證這個域名的歸屬權是否屬於申請人,Let‘s Encrypt提供了三種自助方式,可以自行選擇一種。

8.1、通過IIS來驗證(這個我尚未測試成功過,所以后續操作,只是僅對英文版指引所做的翻譯)

如果你的網站所在的服務器是IIS 7.0及以上版本,而且你可以在服務器上運行腳本(我猜測還需要服務器可以主動向Let's Encrypt網站發送一些內容),可以嘗試用如下腳本來驗證。

 1 Complete-ACMEChallenge dns1 -ChallengeType http-01 -Handler iis -HandlerParameters @{ WebSiteRef = 'Default Web Site' } 

其中'Default Web Site'應該是IIS中這個Website的名稱。

8.2、通過在網站指定目錄下存放指定文件來驗證,文件中存放指定內容(本人親自驗證)

首先請運行如下命令:

 1 Complete-ACMEChallenge <Mark> -ChallengeType http-01 -Handler manual 

這里的<Mark>,請替換為之前的別名。一旦執行完畢了,你將會看到如下內容。

 1 == Manual Challenge Handler - HTTP ==
 2   * Handle Time:      [1/12/2016 1:16:34 PM]
 3   * Challenge Token:  [2yRd04TwqiZTh6TWLZ1azL15QIOGaiRmx8MjAoA5QH0]
 4 To complete this Challenge please create a new file
 5 under the server that is responding to the hostname
 6 and path given with the following characteristics:
 7   * HTTP URL:     [http://<Domain Name>/.well-known/acme-challenge/2yRd04TwqiZTh6TWLZ1azL15QIOGaiRmx8MjAoA5QH0]
 8   * File Path:    [.well-known/acme-challenge/2yRd04TwqiZTh6TWLZ1azL15QIOGaiRmx8MjAoA5QH0]
 9   * File Content: [2yRd04TwqiZTh6TWLZ1azL15QIOGaiRmx8MjAoA5QH0.H3URk7qFUvhyYzqJySfc9eM25RTDN7bN4pwil37Rgms]
10   * MIME Type:    [text/plain]
11 ------------------------------------

其中<Domain Name>就是我們申請SSL證書時的域名。

這段內容,我們需要關注的是HTTP URL、File Path、File Content這三塊。

首先,請打開一個記事本,將File Content對應的內容貼入其中(其中[]是不需要貼入的),然后保存成一個文件,文件的名稱是File Path中".well-known/acme-challenge/"后面那一部分。請注意,這個文件名稱是不能有后綴名的,所以保存類型必須選擇“所有文件”,類似如下圖。

接下來,我們需要在網站根目錄下創建一個文件夾“.well-known”,這個文件夾在Windows下必須通過命令行創建。

在.well-known文件夾下,繼續創建文件夾“acme-challenge”,創建完畢后,將之前保存的文件放在此目錄下。

完成上述操作后,我們需要先驗證一下,可打開瀏覽器,地址中貼入HTTP URL,如果我們能看到File Content對應的那一串字符串,那么下一步我們可以提交給Let's Encrypt來驗證。

8.3、通過設置一個獨立的二級域名來驗證

首先請運行如下命令:

 1 Complete-ACMEChallenge <Mark> -ChallengeType dns-01 -Handler manual 

這里的<Mark>,請替換為之前的別名。一旦執行完畢了,你將會看到如下內容。

1 == Manual Challenge Handler - DNS ==
2   * Handle Time:      [1/12/2016 1:41:51 PM]
3   * Challenge Token:  [xfc0oQahXVqdaBlcZbk5nL8H-GSDFCoQ8LGzOL07qVI]
4 To complete this Challenge please create a new Resource
5 Record (RR) with the following characteristics:
6   * RR Type:  [TXT]
7   * RR Name:  [_acme-challenge.<Domain Name>]
8   * RR Value: [vNx_fpLgvq0l4rqSATuxhxl9pa155SoeKvNZ98AFB_4]
9 ------------------------------------

需要設置一個二級域名,域名名稱為RR Name對應的內容,域名類型為TXT,域名類型為RR Value的內容,類似如下圖。

下一步我們可以提交給Let's Encrypt來驗證。

9、向Let's Encrypt提交申請,驗證域名所屬權。(8.1方式是不需要此步的)

如果選擇了8.2方式來申請驗證,則執行如下命令來提交申請。

 1 Submit-ACMEChallenge <Mark> -ChallengeType http-01 

如果選擇了8.3方式來申請驗證,則執行如下命令來提交申請。

 1 Submit-ACMEChallenge <Mark> -ChallengeType dns-01 

這里的<Mark>,請替換為之前的別名。

執行了上述命令后,Let's Encrypt將會受到驗證請求。但此請求不會立刻有反饋的,需要等待幾分鍾。

10、查看Let's Encrypt的驗證結果

如果選擇了8.2方式來申請驗證,則執行如下命令來查看驗證結果。

 1 (Update-ACMEIdentifier <Mark> -ChallengeType http-01).Challenges | Where-Object {$_.Type -eq "http-01"} 

如果選擇了8.3方式來申請驗證,則執行如下命令來查看驗證結果。

 1 (Update-ACMEIdentifier <Mark> -ChallengeType dns-01).Challenges | Where-Object {$_.Type -eq "dns-01"} 

這里的<Mark>,請替換為之前的別名。

執行命令之后,將會看到一些內容,其中會有一項“Status”。
如果看到的是Pending,則表示尚未驗證,則繼續等待中。
如果看到的是Invalid,則表示驗證失敗,需要仔細查看過往操作,從第6步開始,重新執行。
如果看到的是Valid,則表示驗證成功。

一旦驗證成功,執行如下命令,查看域名對應的SSL證書是否已准備好。

 1 Update-ACMEIdentifier <Mark> 

執行命令之后,將會看到一些內容,其中會有一項“Status”,如果看到了Valid,則表示准備好了,即可開始導出證書了。

11、提交PKI證書請求

執行如下命令,則會創建一個PKI證書請求。

1 New-ACMECertificate <Mark> -Generate -Alias <CertName>
2 Submit-ACMECertificate <CertName>

這里的<Mark>,請替換為之前的別名。這里的<CertName>,請自行設置一個個性化的證書名稱。

執行完畢后,將會看到如下內容:

 1 Id                  : 8e38e529-55e2-4096-afb8-4f9947d6da6d
 2 Alias               : <CertName>
 3 Label               :
 4 Memo                :
 5 IdentifierRef       : 198488a7-c778-488c-978b-606a0181deb9
 6 KeyPemFile          :
 7 CsrPemFile          :
 8 GenerateDetailsFile : 8e38e529-55e2-4096-afb8-4f9947d6da6d-gen.json
 9 CertificateRequest  :
10 CrtPemFile          :
11 CrtDerFile          :
12 IssuerSerialNumber  :
13 SerialNumber        :
14 Thumbprint          :
15 Signature           :
16 SignatureAlgorithm  :

接下來,執行如下命令,更新證書。

1 Update-ACMECertificate <CertName>

執行完畢后,將看到如下內容。

 1 Id                  : 9182eb22-cd57-468e-946e-e0b0d8843906
 2 Alias               : <CertName>
 3 Label               :
 4 Memo                :
 5 IdentifierRef       : 198488a7-c778-488c-978b-606a0181deb9
 6 KeyPemFile          : 9182eb22-cd57-468e-946e-e0b0d8843906-key.pem
 7 CsrPemFile          : 9182eb22-cd57-468e-946e-e0b0d8843906-csr.pem
 8 GenerateDetailsFile : 9182eb22-cd57-468e-946e-e0b0d8843906-gen.json
 9 CertificateRequest  : ACMESharp.CertificateRequest
10 CrtPemFile          : 9182eb22-cd57-468e-946e-e0b0d8843906-crt.pem
11 CrtDerFile          : 9182eb22-cd57-468e-946e-e0b0d8843906-crt.der
12 IssuerSerialNumber  :
13 SerialNumber        : 00FAFC7F409C770B76EB9BA7445EC27B24494A
14 Thumbprint          : 9A59B855EA79B3E9DE1C14307E6A21851B3C0CE8
15 Signature           : 9A59B855EA79B3E9DE1C14307E6A21851B3C0CE8
16 SignatureAlgorithm  : sha256RSA

可以看到證書的簽名算法是sha256RSA。至此,可以導出證書了。

12、導出SSL證書

12.1 導出私人秘鑰(PEM)

執行如下命令,其中<CertName>是之前自定義證書名稱,<存放路徑>請自行替換為存放證書的路徑。

 1 Get-ACMECertificate <CertName> -ExportKeyPEM "<存放路徑>\<CertName>.key.pem" 

12.2 導出證書簽名請求(CSR)

執行如下命令,其中<CertName>是之前自定義證書名稱,<存放路徑>請自行替換為存放證書的路徑。

 1 Get-ACMECertificate <CertName> -ExportCsrPEM "<存放路徑>\<CertName>.csr.pem" 

12.3 導出由LE(Let's Encrypt)發布的證書

執行如下命令,其中<CertName>是之前自定義證書名稱,<存放路徑>請自行替換為存放證書的路徑。

 1 Get-ACMECertificate <CertName> -ExportCertificatePEM "<存放路徑>\<CertName>.crt.pem" -ExportCertificateDER "<存放路徑>\<CertName>.crt" 

這里會導出兩種格式的證書文件,一種是PEM格式,另一種是DER格式。

12.4 導出LE(Let's Encrypt)這個發布者自己的證書

執行如下命令,其中<CertName>是之前自定義證書名稱,<存放路徑>請自行替換為存放證書的路徑。

 1 Get-ACMECertificate <CertName> -ExportIssuerPEM "<存放路徑>\<CertName>-issuer.crt.pem" -ExportIssuerDER "<存放路徑>\<CertName>-issuer.crt" 

這里會導出兩種格式的證書文件,一種是PEM格式,另一種是DER格式,自行對應12.3步導出的證書格式。

12.5 導出PKCS#12 (PFX)證書

對於Windows下的IIS站點,我們需要導出PFX格式證書。執行如下命令,其中<CertName>是之前自定義證書名稱,<存放路徑>請自行替換為存放證書的路徑。

 1 Get-ACMECertificate <CertName> -ExportPkcs12 "<存放路徑>\<CertName>.pfx" -CertificatePassword '<證書自定義密碼>' 

至此,我們已成功申請下來SSL證書了。

下一步,將是安裝證書了。

《本篇結束》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM