表格示意: 標準 邏輯電平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 腳本,使用前,更改執行策略
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加入到隊列中。在常規頁面中,勾選“不管用戶是否登錄都要運行”以及“使用最高許可權”,保存即可
任務計劃程式是按照順序執行的。