隨著網(wǎng)絡(luò)安全形勢的發(fā)展,SSL已是各大網(wǎng)站的標配,啟用SSL的好處自然不必多說,然后每份SSL證書也要花費不菲的銀子,按最便宜的DV證書來看,每年也要個四五百呢。
有趨勢有需求,自然也有免費可用。免費的SSL證書中,首推就是Let's Encrypt。
Let's Encrypt,官網(wǎng)是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研發(fā)了一套協(xié)議,命名為ACME protocol(Automatic Certificate Management Environment),借助這套協(xié)議,更多熱心人員開發(fā)了相應(yīng)的工具,使用這些工具就可以不借助其他人的幫助下,完成SSL證書的申請。
目前已有各種工具可以用于申請證書,你可以在如下這個地址里查找:
https://letsencrypt.org/docs/client-options/
我最熟悉的自然是Windows平臺,此平臺下,首推ACMESharp工具,因此將用此工具來進行SSL證書的申請。
我們需要準備的有:
1、一臺可以訪問Internet的Windows 7電腦,并具備管理員權(quán)限
2、Powershell 5.0
3、SSL證書對應(yīng)的網(wǎng)站域名
4、一個郵箱地址
5、可以設(shè)置網(wǎng)站域名的DNS,或者可以設(shè)置網(wǎng)站下的文件夾和文件內(nèi)容
如何查看和升級Powershell,請參見查看Powershell的版本和升級Powershell到5.0(最新版本)。
ACMESharp是一個開源軟件,它的源代碼位于“https://github.com/ebekker/ACMESharp”,如果你感興趣,可以到此網(wǎng)址下載源代碼自行研究。
它也自帶了一個英文版的快速安裝指引,訪問地址為:https://github.com/ebekker/ACMESharp/wiki/Quick-Start。
申請步驟詳情如下:
如下的命令,必須以管理員身份運行Powershell,方能執(zhí)行成功。
1、下載ACMESharp的Powershell模塊
1 Save-Module -Name ACMESharp -Path <path>
這里的<path>,請自行替換為你本地的路徑。
最新版本是0.8.1,你也可以點此位置下載。
2、復(fù)制ACMESharp進入到Powershell目錄下的Module文件夾中,通常這個文件夾位于:C:\Program Files\WindowsPowerShell\Modules目錄下
3、安裝ACMESharp的Powershell模塊
1 Install-Module -Name ACMESharp
4、導(dǎo)入ACMESharp的Powershell模塊
1 Import-Module ACMESharp
5、初始化Vault(Vault將用于存儲證書和相關(guān)信息)
如果是第一次運行,則不會有任何輸出,但如果是第二次運行,則會有錯誤提示,提示說Vault已存在。
1 Initialize-ACMEVault
6、向Let‘s Encrypt注冊用戶信息,并接受其服務(wù)協(xié)議
1 New-ACMERegistration -Contacts mailto:<Email Address> -AcceptTos
這里的<Email Address>,請?zhí)鎿Q為你的郵箱地址。
-AcceptTos,就是表示接受服務(wù)協(xié)議。
7、添加需要申請SSL證書的域名
1 New-ACMEIdentifier -Dns <Domain Name> -Alias <Mark>
這里的<Domain Name>,請?zhí)鎿Q為你需要申請SSL證書的那個域名。
這里的<Mark>,請?zhí)鎿Q為任意的一個別名,這個別名將用于后續(xù)申請中,用于代指你的域名。
8、驗證這個域名的歸屬權(quán)是否屬于申請人,Let‘s Encrypt提供了三種自助方式,可以自行選擇一種。
8.1、通過IIS來驗證(這個我尚未測試成功過,所以后續(xù)操作,只是僅對英文版指引所做的翻譯)
如果你的網(wǎng)站所在的服務(wù)器是IIS 7.0及以上版本,而且你可以在服務(wù)器上運行腳本(我猜測還需要服務(wù)器可以主動向Let's Encrypt網(wǎng)站發(fā)送一些內(nèi)容),可以嘗試用如下腳本來驗證。
1 Complete-ACMEChallenge dns1 -ChallengeType http-01 -Handler iis -HandlerParameters @{ WebSiteRef = 'Default Web Site' }
其中'Default Web Site'應(yīng)該是IIS中這個Website的名稱。
8.2、通過在網(wǎng)站指定目錄下存放指定文件來驗證,文件中存放指定內(nèi)容(本人親自驗證)
首先請運行如下命令:
1 Complete-ACMEChallenge <Mark> -ChallengeType http-01 -Handler manual
這里的<Mark>,請?zhí)鎿Q為之前的別名。一旦執(zhí)行完畢了,你將會看到如下內(nèi)容。
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證書時的域名。
這段內(nèi)容,我們需要關(guān)注的是HTTP URL、File Path、File Content這三塊。
首先,請打開一個記事本,將File Content對應(yīng)的內(nèi)容貼入其中(其中[]是不需要貼入的),然后保存成一個文件,文件的名稱是File Path中".well-known/acme-challenge/"后面那一部分。請注意,這個文件名稱是不能有后綴名的,所以保存類型必須選擇“所有文件”,類似如下圖。
接下來,我們需要在網(wǎng)站根目錄下創(chuàng)建一個文件夾“.well-known”,這個文件夾在Windows下必須通過命令行創(chuàng)建。
在.well-known文件夾下,繼續(xù)創(chuàng)建文件夾“acme-challenge”,創(chuàng)建完畢后,將之前保存的文件放在此目錄下。
完成上述操作后,我們需要先驗證一下,可打開瀏覽器,地址中貼入HTTP URL,如果我們能看到File Content對應(yīng)的那一串字符串,那么下一步我們可以提交給Let's Encrypt來驗證。
8.3、通過設(shè)置一個獨立的二級域名來驗證
首先請運行如下命令:
1 Complete-ACMEChallenge <Mark> -ChallengeType dns-01 -Handler manual
這里的<Mark>,請?zhí)鎿Q為之前的別名。一旦執(zhí)行完畢了,你將會看到如下內(nèi)容。
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 Resource5 Record (RR) with the following characteristics:6 * RR Type: [TXT]7 * RR Name: [_acme-challenge.<Domain Name>]8 * RR Value: [vNx_fpLgvq0l4rqSATuxhxl9pa155SoeKvNZ98AFB_4]9 ------------------------------------
需要設(shè)置一個二級域名,域名名稱為RR Name對應(yīng)的內(nèi)容,域名類型為TXT,域名類型為RR Value的內(nèi)容,類似如下圖。
下一步我們可以提交給Let's Encrypt來驗證。
9、向Let's Encrypt提交申請,驗證域名所屬權(quán)。(8.1方式是不需要此步的)
如果選擇了8.2方式來申請驗證,則執(zhí)行如下命令來提交申請。
1 Submit-ACMEChallenge <Mark> -ChallengeType http-01
如果選擇了8.3方式來申請驗證,則執(zhí)行如下命令來提交申請。
1 Submit-ACMEChallenge <Mark> -ChallengeType dns-01
這里的<Mark>,請?zhí)鎿Q為之前的別名。
執(zhí)行了上述命令后,Let's Encrypt將會受到驗證請求。但此請求不會立刻有反饋的,需要等待幾分鐘。
10、查看Let's Encrypt的驗證結(jié)果
如果選擇了8.2方式來申請驗證,則執(zhí)行如下命令來查看驗證結(jié)果。
1 (Update-ACMEIdentifier <Mark> -ChallengeType http-01).Challenges | Where-Object {$_.Type -eq "http-01"}
如果選擇了8.3方式來申請驗證,則執(zhí)行如下命令來查看驗證結(jié)果。
1 (Update-ACMEIdentifier <Mark> -ChallengeType dns-01).Challenges | Where-Object {$_.Type -eq "dns-01"}
這里的<Mark>,請?zhí)鎿Q為之前的別名。
執(zhí)行命令之后,將會看到一些內(nèi)容,其中會有一項“Status”。
如果看到的是Pending,則表示尚未驗證,則繼續(xù)等待中。
如果看到的是Invalid,則表示驗證失敗,需要仔細查看過往操作,從第6步開始,重新執(zhí)行。
如果看到的是Valid,則表示驗證成功。
一旦驗證成功,執(zhí)行如下命令,查看域名對應(yīng)的SSL證書是否已準備好。
1 Update-ACMEIdentifier <Mark>
執(zhí)行命令之后,將會看到一些內(nèi)容,其中會有一項“Status”,如果看到了Valid,則表示準備好了,即可開始導(dǎo)出證書了。
11、提交PKI證書請求
執(zhí)行如下命令,則會創(chuàng)建一個PKI證書請求。
1 New-ACMECertificate <Mark> -Generate -Alias <CertName>2 Submit-ACMECertificate <CertName>
這里的<Mark>,請?zhí)鎿Q為之前的別名。這里的<CertName>,請自行設(shè)置一個個性化的證書名稱。
執(zhí)行完畢后,將會看到如下內(nèi)容:
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 :
接下來,執(zhí)行如下命令,更新證書。
1 Update-ACMECertificate <CertName>
執(zhí)行完畢后,將看到如下內(nèi)容。
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.CertificateRequest10 CrtPemFile : 9182eb22-cd57-468e-946e-e0b0d8843906-crt.pem11 CrtDerFile : 9182eb22-cd57-468e-946e-e0b0d8843906-crt.der12 IssuerSerialNumber :13 SerialNumber : 00FAFC7F409C770B76EB9BA7445EC27B24494A14 Thumbprint : 9A59B855EA79B3E9DE1C14307E6A21851B3C0CE815 Signature : 9A59B855EA79B3E9DE1C14307E6A21851B3C0CE816 SignatureAlgorithm : sha256RSA
可以看到證書的簽名算法是sha256RSA。至此,可以導(dǎo)出證書了。
12、導(dǎo)出SSL證書
12.1 導(dǎo)出私人秘鑰(PEM)
執(zhí)行如下命令,其中<CertName>是之前自定義證書名稱,<存放路徑>請自行替換為存放證書的路徑。
1 Get-ACMECertificate <CertName> -ExportKeyPEM "<存放路徑>\<CertName>.key.pem"
12.2 導(dǎo)出證書簽名請求(CSR)
執(zhí)行如下命令,其中<CertName>是之前自定義證書名稱,<存放路徑>請自行替換為存放證書的路徑。
1 Get-ACMECertificate <CertName> -ExportCsrPEM "<存放路徑>\<CertName>.csr.pem"
12.3 導(dǎo)出由LE(Let's Encrypt)發(fā)布的證書
執(zhí)行如下命令,其中<CertName>是之前自定義證書名稱,<存放路徑>請自行替換為存放證書的路徑。
1 Get-ACMECertificate <CertName> -ExportCertificatePEM "<存放路徑>\<CertName>.crt.pem" -ExportCertificateDER "<存放路徑>\<CertName>.crt"
這里會導(dǎo)出兩種格式的證書文件,一種是PEM格式,另一種是DER格式。
12.4 導(dǎo)出LE(Let's Encrypt)這個發(fā)布者自己的證書
執(zhí)行如下命令,其中<CertName>是之前自定義證書名稱,<存放路徑>請自行替換為存放證書的路徑。
1 Get-ACMECertificate <CertName> -ExportIssuerPEM "<存放路徑>\<CertName>-issuer.crt.pem" -ExportIssuerDER "<存放路徑>\<CertName>-issuer.crt"
這里會導(dǎo)出兩種格式的證書文件,一種是PEM格式,另一種是DER格式,自行對應(yīng)12.3步導(dǎo)出的證書格式。
12.5 導(dǎo)出PKCS#12 (PFX)證書
對于Windows下的IIS站點,我們需要導(dǎo)出PFX格式證書。執(zhí)行如下命令,其中<CertName>是之前自定義證書名稱,<存放路徑>請自行替換為存放證書的路徑。
1 Get-ACMECertificate <CertName> -ExportPkcs12 "<存放路徑>\<CertName>.pfx" -CertificatePassword '<證書自定義密碼>'
至此,我們已成功申請下來SSL證書了。
下一步,將是安裝證書了。
《本篇結(jié)束》
本博文屬作者原創(chuàng),首發(fā)于www.boxfun.net,除非特別聲明,本作品采用知識共享署名-非商業(yè)性使用-相同方式共享 4.0 國際許可協(xié)議進行許可。