Looking at the Stars.(简称叫我853!

Windows使用acme.sh申请let’s encrypt泛域名SSL证书方法(附带自动续期)

该文章适用于:在Windows服务器上搭建Web服务的程序猿,包括用IIS的

由于win-acme申请不了泛域名证书,就尝试其他方法来申请证书,发现certbot和acme.sh都可以申请,找了一下Windows运行certbot的教程,发现教程里要把certbot大换血后才能运行,见麻烦,告辞。
然后看了看acme.sh,发现可以用Cygwin带起来,就直接试了试,效果还算不错。就弄了个教程方便参考。

1、全程联网,安装Cygwin,直接点点点下一步,节点使用163节点(速度快,如果只想配置acme.sh的话):http://mirrors.163.com/cygwin/或其他可以用的节点

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

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

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

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

或者是这个:

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

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

5、关掉并重新打开“C:\cygwin64”目录下的“Cygwin.bat”文件,使用DNS方式来配置DNS API并申请域名证书。
(我这里用的是大佬推荐的CloudXNS,所以我用的是CloudXNS的DNS API)
!务必阅读!How to use 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”检查是否运行,成功的话在存放证书的路径就能看得见你申请的证书了:

7、打开“任务计划程序”,点击左边的“任务计划程序库”,点击右边的“创建基本任务”,按自己想法输入名称和描述,点击下一步

触发器选择每天

每天早上9:00一次

选择运行“autoacme.bat”脚本

完成后双击或右键属性选择刚刚创建好的项目,设置安全选项下的选项“不管用户是否登陆都要运行”以及“使用最高权限运行”。

All Done!

之后可以使用其他httpd程序来应用证书了!(请参阅其他文章来应用HTTPS证书)

Windows设置Apache以及Nginx的SSL证书再简单不过了,有难度的是IIS,这倒好,花了我一天的青春才弄好这个教程(暗示捐助233)

关于在IIS上应用泛域名证书

由于本人用的是Apache,部署证书没有IIS那么麻烦,看见大佬群里也有人用IIS,就打算尝试一下。首先上面的步骤还是要做的,要部署在IIS就要多弄以下的步骤。

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管理平台都显示成功绑定域名的话,代表你的泛域名证书已经可以支持绑定并自动续期了!





累死,我已经躺好了

来自网友的4条留言

  • qq_avatar
    chu853!1

    在IIS中是不是还要转成pfx文件?三个月转一次?

    2018-09-29 08:40  
    • Sonic853站长20

      是要转成pfx文件,我用的是Apache就免去了转pfx文件的操作,应该有命令行工具来转换证书

      2018-09-30 14:16  
    • Sonic853站长20

      已更新文章!附上了IIS的自动导入并支持自动续期的脚本

      2018-10-01 03:58  