翼度科技»论坛 云主机 服务器技术 查看内容

windows在cygwin64下使用acme.sh批量签发Let's Encrypt的ssl证书,并用

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
使用前提

本脚本是在使用阿里云Windows服务器的前提,如果使用其他dns服务,请参看acme.sh的dns相关文档

配置好cygwin64、acme.sh并配置好阿里云账户,openssl最好也安装上

cygwin64配置

如果windows server 08R2启动安装程序失败,请使用cmd运行
  1. setup-x86_64.exe --allow-unsupported-windows --site http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2024/01/30/231215 --no-verify
复制代码
其他老旧系统请参考cygwin64官网网页的How can I install the last Cygwin version for an old, unsupported Windows回答
acme.sh配置

openssl参考,添加-certpbe PBE-SHA1-3DES -keypbe PBE-SHA1-3DES -nomac 是为了应对pfx输入密钥不正确

最终路径就是项目路径

以下是batch脚本,请保存在autoacme.bat文件中
  1. @echo off & setlocal EnableDelayedExpansion
  2. :: 数组长度,不用管,会自己加值
  3. set objLength=0
  4. :: 公共证书备份路径
  5. set commonPath=E:\cert
  6. :: cygwin64用户路径
  7. set cygwinPath=E:\Cygwin64\home\Administrator
  8. :: cygwin64内部用户路径
  9. set cygwinUserPath=/home/Administrator
  10. :: pfx文件密钥,这里的密钥必须和powershell里的pfx密钥一致
  11. set pfxPassword=dgfdgsdfg
  12. :: 如果公共路径不存在,那么创建,如果路径已存在,不影响命令继续执行
  13. md %commonPath%
  14. :: 证书在以下列表中添加即可
  15. :: 指定域名
  16. set obj[%objLength%]*domain=www.test.com
  17. :: 最终路径
  18. set obj[%objLength%]*path=D:\Web\Main
  19. set /a objLength+=1
  20. :: 指定域名
  21. set obj[%objLength%]*domain=buy.test.com
  22. :: 最终路径
  23. set obj[%objLength%]*path=D:\Web\buy
  24. set /a objLength+=1
  25. :: 指定域名
  26. set obj[%objLength%]*domain=go.test.com
  27. :: 最终路径
  28. set obj[%objLength%]*path=D:\Web\Go
  29. :: 初始索引
  30. set objIndex=0
  31. :: 重试次数
  32. set retryCnt=0
  33. ::循环
  34. :loopStart
  35. ::判断索引值是否大于数组长度,大于的话跳到结束,不大于的话继续循环
  36. if %objIndex% gtr %objLength% goto end
  37. ::初始化当前变量
  38. set curr.domain=0
  39. set curr.path=0
  40. ::重置重试次数
  41. set /a retryCnt=0
  42. :: delims==*表示使用=和*分割字符串,tokens=1-3是取切割后字符串的前1到3个,循环对象的每个属性,%%i 是如 obj[0] 标识是第几个对象, %%j 标识是对象的那个属性,%%k 是指定对象属性的值
  43. for /f "usebackq delims==* tokens=1-3" %%i in (`set obj[%objIndex%]`) do (
  44.     :: 赋值变量
  45.     set curr.%%j=%%k
  46. )
  47. echo domain=%curr.domain%
  48. echo path=%curr.path%
  49. :: 登录到cygwin使用acme.sh签发证书,并将文件拷贝到公共证书目录,并转成pfx格式,密码统一使用%pfxPassword%
  50. echo 签发%curr.domain%证书
  51. :: 设置执行命令后缀,这里是acme.sh相关命令,修改dns api就在这里
  52. set issueCmd=--issue --dns dns_ali -d %curr.domain% --fullchain-file %cygwinUserPath%/.acme.sh/%curr.domain%_ecc/%curr.domain%.pem --key-file %cygwinUserPath%/.acme.sh/%curr.domain%_ecc/%curr.domain%.key
  53. bash --login -i -c "acme.sh %issueCmd%"
  54. echo 检查%curr.domain%key文件大小和backup目录是否存在文件
  55. set byte=0
  56. for %%A in ("%cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.key") do (
  57.         set /a byte=%%~zA
  58. )
  59. echo %curr.domain%.key大小:%byte%字节
  60. :: 如果key文件大小为零
  61. if %byte% equ 0 (
  62.     if EXIST %cygwinPath%\.acme.sh\%curr.domain%_ecc\backup\key.bak (
  63.         echo 检查key.bak的大小
  64.         for %%A in ("%cygwinPath%\.acme.sh\%curr.domain%_ecc\backup\key.bak") do (
  65.             set /a byte=%%~zA
  66.         )
  67.         :: bak文件不为零,那么拷贝覆盖
  68.         echo /backup/key.bak大小:%byte%字节
  69.         if %byte% equ 0 (
  70.             echo 拷贝key.bak到根目录
  71.             copy %cygwinPath%\.acme.sh\%curr.domain%_ecc\backup\key.bak %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.key /y
  72.         ) else (
  73.             :: 如果全部失败,那么直接重新申请
  74.             :forceIssue
  75.             echo 尝试重新申请%curr.domain%证书第%retryCnt%次
  76.             bash --login -i -c "acme.sh %issueCmd% --force"
  77.             :: 重试一次,加一次次数
  78.             set /a retryCnt+=1
  79.         )
  80.     )
  81. )
  82. echo 拷贝key文件到公共目录
  83. copy %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.key %commonPath%\%curr.domain%.key /y
  84. echo 赋予权限
  85. bash --login -i -c "chmod -R g+rw %cygwinUserPath%/.acme.sh/%curr.domain%_ecc"
  86. echo 第一次检查%curr.domain%.pfx文件是否存在
  87. IF NOT EXIST %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.pfx (
  88.     echo openssl转换pfx,因为acme.sh转换失败
  89.     openssl pkcs12 -export -certpbe PBE-SHA1-3DES -keypbe PBE-SHA1-3DES -nomac -out %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.pfx -inkey %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.key -in %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.cer -password pass:"%pfxPassword%"
  90. )
  91. echo 第二次检查%curr.domain%.pfx文件是否存在
  92. IF NOT EXIST %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.pfx (
  93.     IF %retryCnt% gtr 3 goto skipCurr
  94.     else goto forceIssue
  95. )
  96. echo 拷贝pfx文件到公共目录
  97. copy %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.pfx %commonPath%\%curr.domain%.pfx /y
  98. :: 如果pem格式文件不存在,那么使用openssl转换成pem格式
  99. IF NOT EXIST %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.pem (
  100.     echo openssl转换pem
  101.     openssl pkcs12 -in %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.pfx -out %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.pem -nodes -password pass:"%pfxPassword%"
  102. )
  103. :: 拷贝pem文件到公共目录
  104. echo 拷贝pem到公共目录
  105. copy %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.pem %commonPath%\%curr.domain%.pem /y
  106. :: 拷贝证书到最终路径,如果路径相等会直接拷贝失败,如果最终路径不存在,也会拷贝失败
  107. echo 拷贝%curr.domain%证书到项目目录
  108. copy %commonPath%\%curr.domain%.pem %curr.path%\%curr.domain%.pem /y & copy %commonPath%\%curr.domain%.key %curr.path%\%curr.domain%.key /y & copy %commonPath%\%curr.domain%.pfx %curr.path%\%curr.domain%.pfx /y
  109. :skipCurr
  110. :: 索引+1
  111. set /a objIndex=%objIndex% + 1
  112. :: 继续循环
  113. goto loopStart
  114. :end
  115. :: 暂停看结果
  116. :: pause
  117. :: 执行完后退出
  118. exit
复制代码
PowerShell 脚本,使用前,更改执行策略

关于执行策略:
https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.4#powershell-execution-policies
  1. Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
复制代码
将以下脚本保存为reissueIISCert.ps1文件
  1. # 使用前先将策略设置为不严格 Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
  2. # 保证证书有效的情况下再运行次脚本,将证书名称、证书目录、密钥放入以下数组
  3. # 公共证书密钥
  4. $pfxpassword = "dgfdgsdfg"
  5. # 公共证书路径
  6. $pfxCommandDir= "E:\cert"
  7. # 域名
  8. $domain="test.com"
  9. # 服务器上的证书与端口映射关系
  10. $data = @(
  11.     [pscustomobject]@{subDomain = 'www';port=443}
  12.     [pscustomobject]@{subDomain = 'buy';port=8443}
  13.     [pscustomobject]@{subDomain = 'go';port=7443}
  14. )
  15. $certRootStore = "localmachine"
  16. $certStore = "My"
  17. # 创建证书存储
  18. $store = new-object System.Security.Cryptography.X509Certificates.X509Store($certStore, $certRootStore)
  19. $store.open("MaxAllowed")
  20. # 开始循环数组操作
  21. foreach ($element in $data) {
  22.     $pfxPath = "$($pfxCommandDir)\$($element.subDomain).$($domain).pfx"
  23.     Write-Host $pfxPath
  24.     # 创建pfx对象
  25.     try {
  26.         $certificateObject = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($pfxPath, $pfxpassword)
  27.         # 存储证书到个人
  28.         $store.Add($certificateObject)
  29.         Write-Host 导入证书成功
  30.         $newThumbprint = $certificateObject.Thumbprint
  31.         Write-Host 获取证书信息成功
  32.         $guid = New-Guid
  33.         $applicationID = "{$($guid)}"
  34.         $addr = "0.0.0.0:$($element.port)"
  35.         Write-Host $addr $newThumbprint
  36.         netsh http delete sslcert ipport=$addr
  37.         netsh http add sslcert ipport=$addr certhash=$newThumbprint appid=$applicationID
  38.     }
  39.     catch {
  40.         Write-Host "发生异常:$_"
  41.         break
  42.     }
  43. }
  44. # 关闭证书存储
  45. $store.close()
  46. # 执行完后退出
  47. exit
复制代码
创建任务计划程序参考

将启动程序设置为autoacme.bat即可,设置完成后,右键对应任务计划程序->属性->操作,在这一对话框中,将reissueIISCert.ps1加入到队列中。在常规页面中,勾选“不管用户是否登录都要运行”以及“使用最高权限”,保存即可
任务计划程序是按照顺序执行的。

来源:https://www.cnblogs.com/NickSmith/p/18270573
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具