申请免费的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证书了。
下一步,将是安装证书了。
《本篇结束》