申请免费的SSL证书(Win7,PowerShell,Let's Encrypt)

时间:2023-12-05 21:00:56

随着网络安全形势的发展,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模块

  Save-Module -Name ACMESharp -Path <path> 

这里的<path>,请自行替换为你本地的路径。

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

2、复制ACMESharp进入到Powershell目录下的Module文件夹中,通常这个文件夹位于:C:\Program Files\WindowsPowerShell\Modules目录下

3、安装ACMESharp的Powershell模块

  Install-Module -Name ACMESharp 

4、导入ACMESharp的Powershell模块

  Import-Module ACMESharp 

5、初始化Vault(Vault将用于存储证书和相关信息)

如果是第一次运行,则不会有任何输出,但如果是第二次运行,则会有错误提示,提示说Vault已存在。

  Initialize-ACMEVault 

6、向Let‘s Encrypt注册用户信息,并接受其服务协议

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

这里的<Email Address>,请替换为你的邮箱地址。

-AcceptTos,就是表示接受服务协议。

7、添加需要申请SSL证书的域名

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

这里的<Domain Name>,请替换为你需要申请SSL证书的那个域名。

这里的<Mark>,请替换为任意的一个别名,这个别名将用于后续申请中,用于代指你的域名。

8、验证这个域名的归属权是否属于申请人,Let‘s Encrypt提供了三种自助方式,可以自行选择一种。

8.1、通过IIS来验证(这个我尚未测试成功过,所以后续操作,只是仅对英文版指引所做的翻译)

如果你的网站所在的服务器是IIS 7.0及以上版本,而且你可以在服务器上运行脚本(我猜测还需要服务器可以主动向Let's Encrypt网站发送一些内容),可以尝试用如下脚本来验证。

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

其中'Default Web Site'应该是IIS中这个Website的名称。

8.2、通过在网站指定目录下存放指定文件来验证,文件中存放指定内容(本人亲自验证)

首先请运行如下命令:

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

这里的<Mark>,请替换为之前的别名。一旦执行完毕了,你将会看到如下内容。

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

其中<Domain Name>就是我们申请SSL证书时的域名。

这段内容,我们需要关注的是HTTP URL、File Path、File Content这三块。

首先,请打开一个记事本,将File Content对应的内容贴入其中(其中[]是不需要贴入的),然后保存成一个文件,文件的名称是File Path中".well-known/acme-challenge/"后面那一部分。请注意,这个文件名称是不能有后缀名的,所以保存类型必须选择“所有文件”,类似如下图。

申请免费的SSL证书(Win7,PowerShell,Let's Encrypt)

接下来,我们需要在网站根目录下创建一个文件夹“.well-known”,这个文件夹在Windows下必须通过命令行创建。

申请免费的SSL证书(Win7,PowerShell,Let's Encrypt)

在.well-known文件夹下,继续创建文件夹“acme-challenge”,创建完毕后,将之前保存的文件放在此目录下。

完成上述操作后,我们需要先验证一下,可打开浏览器,地址中贴入HTTP URL,如果我们能看到File Content对应的那一串字符串,那么下一步我们可以提交给Let's Encrypt来验证。

8.3、通过设置一个独立的二级域名来验证

首先请运行如下命令:

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

这里的<Mark>,请替换为之前的别名。一旦执行完毕了,你将会看到如下内容。

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

需要设置一个二级域名,域名名称为RR Name对应的内容,域名类型为TXT,域名类型为RR Value的内容,类似如下图。

申请免费的SSL证书(Win7,PowerShell,Let's Encrypt)

下一步我们可以提交给Let's Encrypt来验证。

9、向Let's Encrypt提交申请,验证域名所属权。(8.1方式是不需要此步的)

如果选择了8.2方式来申请验证,则执行如下命令来提交申请。

  Submit-ACMEChallenge <Mark> -ChallengeType http-01 

如果选择了8.3方式来申请验证,则执行如下命令来提交申请。

  Submit-ACMEChallenge <Mark> -ChallengeType dns-01 

这里的<Mark>,请替换为之前的别名。

执行了上述命令后,Let's Encrypt将会受到验证请求。但此请求不会立刻有反馈的,需要等待几分钟。

10、查看Let's Encrypt的验证结果

如果选择了8.2方式来申请验证,则执行如下命令来查看验证结果。

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

如果选择了8.3方式来申请验证,则执行如下命令来查看验证结果。

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

这里的<Mark>,请替换为之前的别名。

执行命令之后,将会看到一些内容,其中会有一项“Status”。
如果看到的是Pending,则表示尚未验证,则继续等待中。
如果看到的是Invalid,则表示验证失败,需要仔细查看过往操作,从第6步开始,重新执行。
如果看到的是Valid,则表示验证成功。

一旦验证成功,执行如下命令,查看域名对应的SSL证书是否已准备好。

  Update-ACMEIdentifier <Mark> 

执行命令之后,将会看到一些内容,其中会有一项“Status”,如果看到了Valid,则表示准备好了,即可开始导出证书了。

11、提交PKI证书请求

执行如下命令,则会创建一个PKI证书请求。

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

这里的<Mark>,请替换为之前的别名。这里的<CertName>,请自行设置一个个性化的证书名称。

执行完毕后,将会看到如下内容:

 Id                  : 8e38e529-55e2-4096-afb8-4f9947d6da6d
Alias : <CertName>
Label :
Memo :
IdentifierRef : 198488a7-c778-488c-978b-606a0181deb9
KeyPemFile :
CsrPemFile :
GenerateDetailsFile : 8e38e529-55e2-4096-afb8-4f9947d6da6d-gen.json
CertificateRequest :
CrtPemFile :
CrtDerFile :
IssuerSerialNumber :
SerialNumber :
Thumbprint :
Signature :
SignatureAlgorithm :

接下来,执行如下命令,更新证书。

 Update-ACMECertificate <CertName>

执行完毕后,将看到如下内容。

 Id                  : 9182eb22-cd57-468e-946e-e0b0d8843906
Alias : <CertName>
Label :
Memo :
IdentifierRef : 198488a7-c778-488c-978b-606a0181deb9
KeyPemFile : 9182eb22-cd57-468e-946e-e0b0d8843906-key.pem
CsrPemFile : 9182eb22-cd57-468e-946e-e0b0d8843906-csr.pem
GenerateDetailsFile : 9182eb22-cd57-468e-946e-e0b0d8843906-gen.json
CertificateRequest : ACMESharp.CertificateRequest
CrtPemFile : 9182eb22-cd57-468e-946e-e0b0d8843906-crt.pem
CrtDerFile : 9182eb22-cd57-468e-946e-e0b0d8843906-crt.der
IssuerSerialNumber :
SerialNumber : 00FAFC7F409C770B76EB9BA7445EC27B24494A
Thumbprint : 9A59B855EA79B3E9DE1C14307E6A21851B3C0CE8
Signature : 9A59B855EA79B3E9DE1C14307E6A21851B3C0CE8
SignatureAlgorithm : sha256RSA

可以看到证书的签名算法是sha256RSA。至此,可以导出证书了。

12、导出SSL证书

12.1 导出私人秘钥(PEM)

执行如下命令,其中<CertName>是之前自定义证书名称,<存放路径>请自行替换为存放证书的路径。

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

12.2 导出证书签名请求(CSR)

执行如下命令,其中<CertName>是之前自定义证书名称,<存放路径>请自行替换为存放证书的路径。

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

12.3 导出由LE(Let's Encrypt)发布的证书

执行如下命令,其中<CertName>是之前自定义证书名称,<存放路径>请自行替换为存放证书的路径。

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

这里会导出两种格式的证书文件,一种是PEM格式,另一种是DER格式。

12.4 导出LE(Let's Encrypt)这个发布者自己的证书

执行如下命令,其中<CertName>是之前自定义证书名称,<存放路径>请自行替换为存放证书的路径。

  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>是之前自定义证书名称,<存放路径>请自行替换为存放证书的路径。

  Get-ACMECertificate <CertName> -ExportPkcs12 "<存放路径>\<CertName>.pfx" -CertificatePassword '<证书自定义密码>' 

至此,我们已成功申请下来SSL证书了。

下一步,将是安装证书了。

《本篇结束》