Win 下申请 let's encrypt 野卡 (附续期)

⚠前言

本文复制粘贴自 https://blog.853lab.com/2018/09/post_1965.html ,已获 Sonic853 授权。
该文章适用于:在 Windows 服务器上搭建 Web 服务的程序猿,包括用 IIS 的。
当然我那么懒的人,没有进行测试!但是,我永远喜欢 Windows!

一、Cygwin 的配置

1、全程联网(等会,服务器应该会有网的吧?),安装 Cygwin,直接点点点下一步,节点使用 163 节点(http://mirrors.163.com/cygwin/,速度快,如果只想配置 acme.sh 的话)
ssl1.png

2、在选择包列表,选择 curl、cron、bzip2、wget、gcc-core、gcc-g++、make、openssh、lynx,然后下一步
ssl2.png

3、点点点下一步,Cygwin 就安装好了(网络错误除外)然后在 Windows 的 path 变量下追加:
;C:\cygwin64\bin;C:\cygwin64\usr\local\bin
ssl3.png
ssl4.png

4、双击打开“C:\cygwin64”目录下的“Cygwin.bat”文件,运行以下命令:

curl https://get.acme.sh | sh

或者是这个:

wget -O -  https://get.acme.sh | sh

等待安装妥当,出现下面的界面代表安装完成(如果不显示或不显示最后的“Install success!”,估计是你安装 Cygwin 时没安装全所选的包,不卸载再重新运行 Cygwin 安装包安装)
ssl5.png

二、配置 DNS API,申请证书

5、关掉并重新打开“C:\cygwin64”目录下的“Cygwin.bat”文件,使用 DNS 方式来配置 DNS API 并申请域名证书。⚠必读:How to use DNS API
(我这里用的是大佬推荐的 CloudXNS,所以我用的是 CloudXNS 的 DNS API)
CloudXNS 使用示范:

export CX_Key="77777777777777888888ccccccczzzzz"
export CX_Secret="zzzzzddddddsssss"

之后运行下面的命令申请( CloudXNS 用的是-dns dns_cx,阿里云用的是-dns dns_ali,其他请参考 How to use DNS API ):

acme.sh --issue --dns dns_cx -d 853lab.com -d *.853lab.com

等候完成。

三、创建计划任务以自动更新证书

6、开始设置自动续期,请打开记事本,粘贴并修改以下文本,保存为“autoacme.bat”
注意修改[要修改的位置]!

bash --login -i -c "[acme.sh --issue --dns dns_cx -d 853lab.com -d *.853lab.com]" & copy C:\cygwin64\home\[Windows用户名]\.acme.sh\[853lab.com]\*.* [复制到一个存放证书的路径] /y

示例:

bash --login -i -c "acme.sh --issue --dns dns_cx -d 853lab.com -d *.853lab.com" & copy C:\cygwin64\home\Sonic853\.acme.sh\853lab.com\*.* C:\web-config\cet /y

之后双击运行一次“autoacme.bat”检查是否运行,成功的话在存放证书的路径就能看得见你申请的证书了:
ssl6.png

7、打开“任务计划程序”,点击左边的“任务计划程序库”,点击右边的“创建基本任务”,按自己想法输入名称和描述,点击下一步
ssl7.png
触发器选择每天
ssl8.png
每天早上9:00一次
ssl9.png
选择运行“autoacme.bat”脚本
ssl10.png
完成后双击或右键属性选择刚刚创建好的项目,设置安全选项下的选项“不管用户是否登陆都要运行”以及“使用最高权限运行”。
ssl11.png
All Done!

四、在 IIS 上应用申请的证书

设置 Apache 以及 Nginx 的 SSL 证书再简单不过了(请参阅其他文章),有难度的是 IIS ,花了 853 一天的青春才弄好这个教程(帮助他暗示 捐助

IIS 用的是 *.pfx 格式证书,我们可以用 Cygwin 里的 OpenSSL 来转换 *.cer 为 *.pfx ,然后修改运行 PowerShell 脚本 来执行导入。

8、我们要把“autoacme.bat”多加几个命令,如下所示:
注意修改[要修改的位置]!

bash --login -i -c "[acme.sh --issue --dns dns_cx -d 853lab.com -d *.853lab.com]" & copy C:\cygwin64\home\[Windows用户名]\.acme.sh\[853lab.com]\*.* [复制到一个存放证书的路径] /y & bash --login -i -c "openssl pkcs12 -export -out [/cygdrive/小写盘符/][存放证书的路径][存放pfx文件的文件名] -inkey [/cygdrive/小写盘符/][盘符之后存放证书的路径][你的key文件] -in [/cygdrive/小写盘符/][盘符之后存放证书的路径][你的cer文件] -passin pass:[设置pfx的密码] -password pass:[再次输入设置pfx的密码]" & PowerShell -file [存放“importcet.ps1”脚本的路径]

示例:

bash --login -i -c "acme.sh --issue --dns dns_cx -d 853lab.com -d *.853lab.com" & copy C:\cygwin64\home\Sonic853\.acme.sh\853lab.com\*.* C:\web-config\cet /y & bash --login -i -c "openssl pkcs12 -export -out /cygdrive/c/web-config/cet/853lab.com.pfx -inkey /cygdrive/c/web-config/cet/853lab.com.key -in /cygdrive/c/web-config/cet/853lab.com.cer -passin pass:123 -password pass:123" & PowerShell -file C:\web-config\cet\importcet.ps1

然后,再新建或 下载 创建好的“importcet.ps1”脚本,按照编辑区提示修改配置:

# 泛域名证书自动导入应用脚本 Ver1.0 By: Sonic853 License: MIT License
# -------编辑区Start-------

# 你的IIS站点列表,如有多个站点列表请按示例添加,请将一级域名的站点列表放在第一位,请确保站点列表比域名列表少一位或相同
# 示例(单个站点列表):
# $IISSite=,"Default Web Site"

# 示例(多个站点列表):
# $IISSite=,"853lab.com","blog.853lab.com"

$IISSite=,"853lab.com","blog.853lab.com"

# 你的域名列表,如有多个域名请按示例添加,请将一级域名放在第一位,如果一级域名需要多绑定带有“www”的域名,请放至一级域名后面,请确保域名列表比站点列表多一位或相同
# 示例(单个域名):
# $HostName=,"853lab.com"

# 示例(单个域名,但需要多绑定www域名):
# $HostName=,"853lab.com","www.853lab.com"

# 示例(多个域名):
# $HostName=,"853lab.com","blog.853lab.com","csgo.853lab.com","love.853lab.com"

# 示例(多个域名,但需要多绑定www域名):
# $HostName=,"853lab.com","www.853lab.com","blog.853lab.com","csgo.853lab.com","love.853lab.com"
$HostName=,"853lab.com","www.853lab.com","blog.853lab.com"

# 你的证书所在的位置
# 示例:$YourCert="C:\web-config\cet\853lab.com.pfx"
$YourCert="C:\web-config\cet\853lab.com.pfx"

# 你生成pfx证书使用的密码
# 示例:$YourCertPass=123
$YourCertPass=123

# 编辑区域修改完成,请勿修改下面的代码,除非你知道你在做什么。

# -------编辑区End-------

# 获取第一个域名
$FristHostName=$HostName[0]
# 先导入一次证书
certutil -p $YourCertPass -importPFX $YourCert
# 先声明几个函数
Function SetToDomainZ{
    # 封装语句
    Param(
        $TheSet1,
        $TheSet2
    )
    netsh http delete sslcert hostnameport="${TheSet2}:443"
    netsh http add sslcert hostnameport="${TheSet2}:443" certhash=$LastCert certstorename=MY appid='{ab3c58f7-8316-42e3-bc6e-771d4ce4b201}'
    Remove-WebBinding -name "${TheSet1}" -HostHeader "${TheSet2}" -Protocol https
    New-WebBinding -name "${TheSet1}" -Protocol https -HostHeader "${TheSet2}" -Port 443 -SslFlags 1
}
Function SetToDomain{
    # 获取 IISSite 数量
    $EZ=$IISSite.Count
    # 获取 HostName 数量
    $PZ=$HostName.Count
    # 两个数量对比,如果 HostName 数量多了一个(也就是一级域名要多绑定www的二级域名),则执行满足if的下列命令,反之执行不满足if的下列命令)
    if($EZ -eq $PZ-1){
        $ThisIISSite=$IISSite[0]
        $ThisHostName=$HostName[0]
        SetToDomainZ -TheSet1 $ThisIISSite -TheSet2 $ThisHostName
        for($i=1;$i -lt $HostName.Count;$i++){
            $Z=$i
            $ThisHostName=$HostName[$Z]
            $ThisIISSite=$IISSite[--$Z]
            SetToDomainZ -TheSet1 $ThisIISSite -TheSet2 $ThisHostName
        }
    }else{
        # 如果两个数量相同,则执行不满足if的下列命令)
        for($i=0;$i -lt $HostName.Count;$i++){
            $ThisIISSite=$IISSite[$i]
            $ThisHostName=$HostName[$i]
            SetToDomainZ -TheSet1 $ThisIISSite -TheSet2 $ThisHostName
        }
    }
}
Function CheckCert{
    # 获取列表里的第一个证书
    $FristCert = (Get-ChildItem cert:\localmachine\my | where-object { $_.Subject -like "*$FristHostName*" } | Select-Object -First 1).Thumbprint
    # 获取列表里的最后一个证书
    $LastCert = (Get-ChildItem cert:\localmachine\my | where-object { $_.Subject -like "*$FristHostName*" } | Select-Object -Last 1).Thumbprint
    #如果这两个证书不一致,将同时删除这两个证书并重新导入新证书并重新检查,这里是防止误删新证书的解决方法。完成后再次重新执行 CheckCert 函数
    if($FristCert -ne $LastCert){
        certutil -delstore My $FristCert
        certutil -delstore My $LastCert
        certutil -p $YourCertPass -importPFX $YourCert
        CheckCert
    }else{
        # 两个证书一致,执行 SetToDomain 函数
        SetToDomain
    }
}
# 执行 CheckCert 函数
CheckCert

最后,修改并测试运行下面的命令查看是否成功为你的站点添加泛域名证书(请无视报错,直接在IIS管理平台检查是否成功绑定):

bash --login -i -c "openssl pkcs12 -export -out [/cygdrive/小写盘符/][存放证书的路径][存放pfx文件的文件名] -inkey [/cygdrive/小写盘符/][盘符之后存放证书的路径][你的key文件] -in [/cygdrive/小写盘符/][盘符之后存放证书的路径][你的cer文件] -passin pass:[设置pfx的密码] -password pass:[再次输入设置pfx的密码]" & PowerShell -file [存放“importcet.ps1”脚本的路径]

示例:

bash --login -i -c "openssl pkcs12 -export -out /cygdrive/c/web-config/cet/853lab.com.pfx -inkey /cygdrive/c/web-config/cet/853lab.com.key -in /cygdrive/c/web-config/cet/853lab.com.cer -passin pass:123 -password pass:123" & PowerShell -file C:\web-config\cet\importcet.ps1

在 IIS 管理平台都显示成功绑定域名的话,代表你的泛域名证书已经可以支持绑定并自动续期了!
ssl12.png

点赞
  1. 惶心说道:

    可以使用 Chocolatey 直接安装 Cygwin,免去设置 path
    可以参见:https://i.loli.net/2018/10/11/5bbe287d08dd2.png

    1. 小白-白说道:

      能用就行系列

  2. Zero说道:

    :huaji12: Centos用户强烈谴责

    1. 小白-白说道:

      Windows 真香.jpg

当前页面评论已关闭。