windows在cygwin64下使用acme.sh批量簽發Let's Encrypt的ssl證書,並用powershell重新分配iis證書

来源:https://www.cnblogs.com/NickSmith/p/18270573
-Advertisement-
Play Games

表格示意: 標準 邏輯電平0 邏輯電平1 是否全雙工 抗干擾能力 TTL 輸出低電平<0.4V, 輸入低電平<=0.8V 輸出高電平>2.4V,輸入高電平>=2.0V 全雙工 差 RS232 +3~+15V -3~-15V 全雙工 強 RS485 +2V~+6V - 6V~- 2V 半雙工 很強 電 ...


使用前提

本腳本是在使用阿裡雲Windows伺服器的前提,如果使用其他dns服務,請參看acme.sh的dns相關文檔

配置好cygwin64、acme.sh並配置好阿裡雲賬戶,openssl最好也安裝上

cygwin64配置

如果windows server 08R2啟動安裝程式失敗,請使用cmd運行

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文件中

@echo off & setlocal EnableDelayedExpansion

:: 數組長度,不用管,會自己加值
set objLength=0
:: 公共證書備份路徑
set commonPath=E:\cert
:: cygwin64用戶路徑
set cygwinPath=E:\Cygwin64\home\Administrator
:: cygwin64內部用戶路徑
set cygwinUserPath=/home/Administrator
:: pfx文件密鑰,這裡的密鑰必須和powershell里的pfx密鑰一致
set pfxPassword=dgfdgsdfg

:: 如果公共路徑不存在,那麼創建,如果路徑已存在,不影響命令繼續執行
md %commonPath%

:: 證書在以下列表中添加即可
:: 指定功能變數名稱
set obj[%objLength%]*domain=www.test.com
:: 最終路徑
set obj[%objLength%]*path=D:\Web\Main

set /a objLength+=1
:: 指定功能變數名稱
set obj[%objLength%]*domain=buy.test.com
:: 最終路徑
set obj[%objLength%]*path=D:\Web\buy

set /a objLength+=1
:: 指定功能變數名稱
set obj[%objLength%]*domain=go.test.com
:: 最終路徑
set obj[%objLength%]*path=D:\Web\Go

:: 初始索引
set objIndex=0
:: 重試次數
set retryCnt=0
::迴圈
:loopStart
::判斷索引值是否大於數組長度,大於的話跳到結束,不大於的話繼續迴圈
if %objIndex% gtr %objLength% goto end

::初始化當前變數
set curr.domain=0
set curr.path=0
::重置重試次數
set /a retryCnt=0

:: delims==*表示使用=和*分割字元串,tokens=1-3是取切割後字元串的前1到3個,迴圈對象的每個屬性,%%i 是如 obj[0] 標識是第幾個對象, %%j 標識是對象的那個屬性,%%k 是指定對象屬性的值
for /f "usebackq delims==* tokens=1-3" %%i in (`set obj[%objIndex%]`) do (
    :: 賦值變數
    set curr.%%j=%%k
)

echo domain=%curr.domain%
echo path=%curr.path%

:: 登錄到cygwin使用acme.sh簽發證書,並將文件拷貝到公共證書目錄,並轉成pfx格式,密碼統一使用%pfxPassword%
echo 簽發%curr.domain%證書
:: 設置執行命令尾碼,這裡是acme.sh相關命令,修改dns api就在這裡
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
bash --login -i -c "acme.sh %issueCmd%"

echo 檢查%curr.domain%key文件大小和backup目錄是否存在文件
set byte=0
for %%A in ("%cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.key") do (
	set /a byte=%%~zA
)

echo %curr.domain%.key大小:%byte%位元組
:: 如果key文件大小為零
if %byte% equ 0 (
    if EXIST %cygwinPath%\.acme.sh\%curr.domain%_ecc\backup\key.bak (
        echo 檢查key.bak的大小
        for %%A in ("%cygwinPath%\.acme.sh\%curr.domain%_ecc\backup\key.bak") do (
            set /a byte=%%~zA
        )
        :: bak文件不為零,那麼拷貝覆蓋
        echo /backup/key.bak大小:%byte%位元組
        if %byte% equ 0 (
            echo 拷貝key.bak到根目錄
            copy %cygwinPath%\.acme.sh\%curr.domain%_ecc\backup\key.bak %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.key /y
        ) else (
            :: 如果全部失敗,那麼直接重新申請
            :forceIssue
            echo 嘗試重新申請%curr.domain%證書第%retryCnt%次
            bash --login -i -c "acme.sh %issueCmd% --force"
            :: 重試一次,加一次次數
            set /a retryCnt+=1
        )
    )
)

echo 拷貝key文件到公共目錄
copy %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.key %commonPath%\%curr.domain%.key /y

echo 賦予許可權
bash --login -i -c "chmod -R g+rw %cygwinUserPath%/.acme.sh/%curr.domain%_ecc"

echo 第一次檢查%curr.domain%.pfx文件是否存在
IF NOT EXIST %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.pfx (
    echo openssl轉換pfx,因為acme.sh轉換失敗
    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%"
)

echo 第二次檢查%curr.domain%.pfx文件是否存在
IF NOT EXIST %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.pfx (
    IF %retryCnt% gtr 3 goto skipCurr 
    else goto forceIssue
)

echo 拷貝pfx文件到公共目錄
copy %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.pfx %commonPath%\%curr.domain%.pfx /y

:: 如果pem格式文件不存在,那麼使用openssl轉換成pem格式
IF NOT EXIST %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.pem (
    echo openssl轉換pem
    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%"
)

:: 拷貝pem文件到公共目錄
echo 拷貝pem到公共目錄
copy %cygwinPath%\.acme.sh\%curr.domain%_ecc\%curr.domain%.pem %commonPath%\%curr.domain%.pem /y

:: 拷貝證書到最終路徑,如果路徑相等會直接拷貝失敗,如果最終路徑不存在,也會拷貝失敗
echo 拷貝%curr.domain%證書到項目目錄
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


:skipCurr
:: 索引+1
set /a objIndex=%objIndex% + 1
:: 繼續迴圈
goto loopStart

:end
:: 暫停看結果
:: pause
:: 執行完後退出
exit

PowerShell 腳本,使用前,更改執行策略

關於執行策略:
https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.4#powershell-execution-policies

Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser

將以下腳本保存為reissueIISCert.ps1文件

# 使用前先將策略設置為不嚴格 Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
# 保證證書有效的情況下再運行次腳本,將證書名稱、證書目錄、密鑰放入以下數組
# 公共證書密鑰
$pfxpassword = "dgfdgsdfg"
# 公共證書路徑
$pfxCommandDir= "E:\cert"
# 功能變數名稱
$domain="test.com"
# 伺服器上的證書與埠映射關係
$data = @(
    [pscustomobject]@{subDomain = 'www';port=443}
    [pscustomobject]@{subDomain = 'buy';port=8443}
    [pscustomobject]@{subDomain = 'go';port=7443}
)
$certRootStore = "localmachine"
$certStore = "My"
# 創建證書存儲
$store = new-object System.Security.Cryptography.X509Certificates.X509Store($certStore, $certRootStore) 
$store.open("MaxAllowed")

# 開始迴圈數組操作
foreach ($element in $data) {
    $pfxPath = "$($pfxCommandDir)\$($element.subDomain).$($domain).pfx"
    Write-Host $pfxPath
    # 創建pfx對象
    try {
        $certificateObject = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($pfxPath, $pfxpassword)
        # 存儲證書到個人
        $store.Add($certificateObject)
        Write-Host 導入證書成功
        $newThumbprint = $certificateObject.Thumbprint
        Write-Host 獲取證書信息成功
        $guid = New-Guid
        $applicationID = "{$($guid)}"
        $addr = "0.0.0.0:$($element.port)"
        Write-Host $addr $newThumbprint
        netsh http delete sslcert ipport=$addr
        netsh http add sslcert ipport=$addr certhash=$newThumbprint appid=$applicationID
    }
    catch {
        Write-Host "發生異常:$_"
        break
    }
}
# 關閉證書存儲
$store.close() 

# 執行完後退出
exit

創建任務計劃程式參考

將啟動程式設置為autoacme.bat即可,設置完成後,右鍵對應任務計劃程式->屬性->操作,在這一對話框中,將reissueIISCert.ps1加入到隊列中。在常規頁面中,勾選“不管用戶是否登錄都要運行”以及“使用最高許可權”,保存即可
任務計劃程式是按照順序執行的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡要:Win安裝WSL(Windows Subsystem for Linux)主要是在win系統可以運行linux系統,下麵詳解介紹如何安裝WSL和Ubuntu以及Ubuntu一些簡單配置 一、安裝WSL 可以參考官網內容->WSL相關介紹 1、使用圖像界面 打開控制面板(win+r輸入contr ...
  • 基於ESP8266網路天氣時鐘的OLED顯示 註意修改 WiFi 名稱和密碼 需要申請【心知天氣】API私鑰 心知天氣URL:https://www.seniverse.com /* 參考: https://blog.csdn.net/weixin_44668788/article/details/ ...
  • 寄存器,本質上就是單片機內部的RAM存儲器,用來暫時存放參與運算的數據和運算結果。一個寄存器由若幹個鎖存器或者觸發器組成。比如STM32的一個寄存器有32位,則由32個觸發器組成。 STM32的寄存器包括通用寄存器、控制寄存器以及外設寄存器,每種寄存器都有其特定的功能和用途。而且在技術手冊占了非常多 ...
  • 今天我在安裝qview並運行時時,遇到了這個問題。 我在網上查找了許多解決方案,但它們大多都說是某些dll缺失或錯誤引起的。 這些說法應該是正確的,但我用了dll修複工具後,一點用都沒有。 後來搗鼓半天後,我發現很可能是visual c++出了問題。後來的事實證明,確實是這樣。 我在微軟官網下載了最 ...
  • 目錄TTL、RS232、RS485三種協議介紹TTL(Transistor-Transistor Logic)串口通信協議工作原理:TTL電平標準:特點:優勢:缺點:TTL協議混淆點澄清:擴展學習:COMS技術CMOS技術的工作方式:主要特點:CMOS技術的局限性:RS232協議工作原理:特點:優勢 ...
  • 設備採用晶元:STM32F407ZET6 4個LED燈,網路標號分別為LED0 ,LED1,FSMC D10,FSMC D11。對應的引腳號分別為PF9,PF10,PE12,PE13。 GPIO外設基本概念 General-Purpose Input Output,通用型輸入輸出的,也簡稱I/O口, ...
  • 目錄操作系統,啟動!大致過程重要程式bootsect.ssetup.shead.s 操作系統,啟動! 大致過程 ​ 電腦的工作方式是取指執行,而執行其的前提是記憶體中有代碼。操作系統剛開始並不是在記憶體中,而是在磁碟上,因此第一步需要將其以一定的方式從磁碟讀入記憶體。 (1)x86PC剛開機時CPU處於 ...
  • 在 CentOS 上安裝 Git 可以通過以下幾個步驟來完成: 1. 使用 YUM 安裝 Git(一般這種情況已經可以滿足) 這是最簡單的方法,使用 CentOS 自帶的 YUM 包管理器。 更新 YUM 包索引: sudo yum update 安裝 Git: sudo yum install g ...
一周排行
    -Advertisement-
    Play Games
  • 通過WPF的按鈕、文本輸入框實現了一個簡單的SpinBox數字輸入用戶組件並可以通過數據綁定數值和步長。本文中介紹了通過Xaml代碼實現自定義組件的佈局,依賴屬性的定義和使用等知識點。 ...
  • 以前,我看到一個朋友在對一個系統做初始化的時候,通過一組魔幻般的按鍵,調出來一個隱藏的系統設置界面,這個界面在常規的菜單或者工具欄是看不到的,因為它是一個後臺設置的關鍵界面,不公開,同時避免常規用戶的誤操作,它是作為一個超級管理員的入口功能,這個是很不錯的思路。其實Winform做這樣的處理也是很容... ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他的程式每次關閉時就會自動崩潰,一直找不到原因讓我幫忙看一下怎麼回事,這位朋友應該是第二次找我了,分析了下 dump 還是挺經典的,拿出來給大家分享一下吧。 二:WinDbg 分析 1. 為什麼會崩潰 找崩潰原因比較簡單,用 !analyze -v 命 ...
  • 在一些報表模塊中,需要我們根據用戶操作的名稱,來動態根據人員姓名,更新報表的簽名圖片,也就是電子手寫簽名效果,本篇隨筆介紹一下使用FastReport報表動態更新人員簽名圖片。 ...
  • 最新內容優先發佈於個人博客:小虎技術分享站,隨後逐步搬運到博客園。 創作不易,如果覺得有用請在Github上為博主點亮一顆小星星吧! 博主開始學習編程於11年前,年少時還只會使用cin 和cout ,給單片機點點燈。那時候,類似async/await 和future/promise 模型的認知還不是 ...
  • 之前在阿裡雲ECS 99元/年的活動實例上搭建了一個測試用的MINIO服務,以前都是直接當基礎設施來使用的,這次準備自己學一下S3相容API相關的對象存儲開發,因此有了這個小工具。目前僅包含上傳功能,後續計劃開發一個類似圖床的對象存儲應用。 ...
  • 目錄簡介快速入門安裝 NuGet 包實體類User資料庫類DbFactory增刪改查InsertSelectUpdateDelete總結 簡介 NPoco 是 PetaPoco 的一個分支,具有一些額外的功能,截至現在 github 星數 839。NPoco 中文資料沒多少,我是被博客園群友推薦的, ...
  • 前言 前面使用 Admin.Core 的代碼生成器生成了通用代碼生成器的基礎模塊 分組,模板,項目,項目模型,項目欄位的基礎功能,本篇繼續完善,實現最核心的模板生成功能,並提供生成預覽及代碼文件壓縮下載 準備 首先清楚幾個模塊的關係,如何使用,簡單畫一個流程圖 前面完成了基礎的模板組,模板管理,項目 ...
  • 假設需要實現一個圖標和文本結合的按鈕 ,普通做法是 直接重寫該按鈕的模板; 如果想作為通用的呢? 兩種做法: 附加屬性 自定義控制項 推薦使用附加屬性的形式 第一種:附加屬性 創建Button的附加屬性 ButtonExtensions 1 public static class ButtonExte ...
  • 在C#中,委托是一種引用類型的數據類型,允許我們封裝方法的引用。通過使用委托,我們可以將方法作為參數傳遞給其他方法,或者將多個方法組合在一起,從而實現更靈活的編程模式。委托類似於函數指針,但提供了類型安全和垃圾回收等現代語言特性。 基本概念 定義委托 定義委托需要指定它所代表的方法的原型,包括返回類 ...