隨着網絡安全形勢的發展,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證書了。
下一步,將是安裝證書了。
《本篇結束》