当前位置:首页 > 操作系统 > 正文内容

windows在cygwin64下运用acme.sh批量签发Let's Encrypt的ssl证书,并用powershell重新分配iis证书

邻居的猫1个月前 (12-09)操作系统1214

运用条件

本脚本是在运用阿里云Windows服务器的条件,假如运用其他dns服务,请参看acme.sh的dns相关文档

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

cygwin64装备参阅

acme.sh装备

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

终究途径便是项目途径

一、装置cygwin64

1. 下载

cygwin64官网下载
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答复
cygwin64下载示例

2. 非老旧体系装备镜像点

假如不是老久体系 ,则能够考虑运用阿里云镜像

阿里云镜像点: https://mirrors.aliyun.com
非老体系参阅镜像点

3. 装置包参阅列表

curl
cron
bzip2
wget
gcc-core
gcc-g++
make
openssh
openssl
lynx
dos2unix
vim

4. Windows装备环境变量

在Path后加;C:\cygwin64\bin;C:\cygwin64\usr\local\bin
cygwin64装备环境变量

5. 假如遇到VIM不能张贴仿制

翻开cygwin64桌面图标Cygwin64 Terminal,进入操控台
cd /home
vim .vimrc
i键进入修正形式,键入以下内容

set mouse=c
syntax on

esc键退出修正形式,输入:wq即可保存文件

shift+ins 是cygwin64操控台下的张贴键

二、装置acme.sh

1. 经过curl指令直接装置acme.sh

curl -k https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m  [email protected]

假如报错如图
acme.ssh ssl证书报错
输入以下,使curl疏忽大局ssl认证,成功后 ,再去经过curl装置acme.sh试试

echo insecure > ~/.curlrc

2. 假如过程二.1成功则不需要看此条

1)直接去git下载acme.sh的源码

acme.sh git资源
acme.sh 百度云
示例
运用解压软件如7z将acme.sh-3.0.7.tar.gz解压两次放在/usr/download目录下,偏重命名为acme.sh,如图
目录示例

2)装置acme.sh

切换到cygwin64操控台

cd /usr/download/acme.sh
./acme.sh --install -m [email protected]

3. 装备acme.sh

0)装置完成后从头加载 Bash

source ~/.bashrc

1)装备主动更新

acme.sh --upgrade --auto-upgrade

2)切换至Letsencrypt

acme.sh --set-default-ca --server letsencrypt

3)装备DNSApi,这儿是参阅阿里云的dnsapi,其他请参阅acme.sh的dns相关文档

cd /home/Administrator/.acme.sh
vim account.conf
i键进入修正形式,输入阿里云帐号的AccessKey相关内容

export Ali_Key="LTAIsadfd8J9qs4fxxxxxxxxxx"
export Ali_Secret="Xp3adgfNDOW0CJcPLKoUwqxxxxxxxxxx"

esc键退出修正形式,输入 :wq 保存文件并退出

三、预备powershell脚本

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

以下是PowerShell脚本,假如乱码,请将文件保存为GB2312字符文件

1.acme主动请求证书脚本,请保存在cygwin64批量主动签发证书.ps1文件中

# 设定bash别号,假如体系装了wsl或许抵触,运用别号强制运用cygwin64指令
Set-Alias -Name bash C:\cygwin64\bin\bash.exe
# 设定openssl别号,假如体系装了wsl或许抵触,运用别号强制运用cygwin64指令
Set-Alias -Name openssl C:\cygwin64\bin\openssl.exe
# 公共证书备份途径,必须带盘符
$commonPath = "E:\cert"
# cygwin64用户途径,必须带盘符,Administrator是计算机装置cygwin64的用户名,不同状况姓名不同
$userPath = "C:\Cygwin64\home\Administrator"
# cygwin64内部用户途径
$cygwinUserPath = "/home/Administrator"
# pfx文件密钥
$pfxPassword = "dgfdgsdfg"

# 证书在以下列表中增加即可
$data = @(
    [pscustomobject]@{
        # 要请求的域名
        domain = "buy.test.com";
        # 项目途径,可空
        path   = "D:\Web\Main"
    },
    [pscustomobject]@{
        domain = "go.test.com";
    },
    [pscustomobject]@{
        domain = "*.test.com";
    }
)

# 假如公共途径不存在,那么创立,假如途径已存在,不影响指令持续履行
if (![System.IO.Directory]::Exists($commonPath)) {
    md $commonPath
}

# 获取公共证书备份途径在cygwin64环境下的途径
$cygwinCommonPath = "/cygdrive/" + $commonPath.Replace(":", "").Replace("\", "/");

# 重试次数
$retryCnt = 0

function IssueKey {
    param (
        [string]$currDomain,
        [string]$currPath,
        [bool]$force
    )
    # 假如重试次数大于2,那么退出当时函数
    if ($retryCnt -gt 2) {
        return
    }

    # 替换特别途径名
    $domain = $currDomain.Replace("*", "_")
    $cygDomain = $currDomain.Replace("*", "\*")

    # 设置履行指令后缀,这儿是acme.sh相关指令,修正dns api就在这儿
    $issueCmd = "--issue --dns dns_ali -d $($currDomain) --key-file $($cygwinCommonPath)/$($domain).key --fullchain-file $($cygwinCommonPath)/$($domain)_fullchain.cer"
    #假如是强制重发
    if ($force) {
        $issueCmd += " --force"
    }
    Write-Host 被履行的acme.sh后缀指令 $issueCmd
    bash --login -i -c "acme.sh $($issueCmd)"
    
    Write-Host 查看$currDomain key文件巨细和backup目录是否存在文件
    
    $commonFullChainPath = "$($commonPath)\$($domain)_fullchain.cer"
    $commonKeyPath = "$($commonPath)\$($domain).key"
    $commonPfxPath = "$($commonPath)\$($domain).pfx"
    $commonPemPath = "$($commonPath)\$($domain).pem"
    # cygwin环境下的目录
    $cygwinCertPath = "$($cygwinUserPath)/.acme.sh/$($cygDomain)_ecc"

    Write-Host 赋予权限
    bash --login -i -c "chmod -R g+rw $($cygwinCertPath)"

    Write-Host 复制Key、Fullchain文件到公共目录
    bash --login -i -c "cp -f $($cygwinCertPath)/$($cygDomain).key $($cygwinCommonPath)/$($domain).key"
    bash --login -i -c "cp -f $($cygwinCertPath)/fullchain.cer $($cygwinCommonPath)/$($domain)_fullchain.cer"

    # 判别绝对途径下证书文件是否存在,假如不存在直接强制从头生成证书
    Write-Host 第一次查看$commonKeyPath 文件是否存在
    if (![System.IO.File]::Exists($commonKeyPath)) {
        Write-Host 查看key.bak是否存在
        # 测验从备份中康复文件到原目录
        bash --login -i -c "cp -f $($cygwinCertPath)/backup/key.bak $($cygwinCertPath)/$($cygDomain).key"
        # 测验从原目录复制文件到公共目录
        bash --login -i -c "cp -f $($cygwinCertPath)/$($cygDomain).key $($cygwinCommonPath)/$($domain).key"
        Write-Host 第2次查看$commonKeyPath 文件是否存在
        if (![System.IO.File]::Exists($commonKeyPath)) {
            Write-Host 公共途径证书文件不存在 $commonKeyPath 行将强制从头请求
            # 重试次数+1
            $retryCnt += 1
            IssueKey -currDomain $currDomain -currPath $currPath -force $true
        }
    }

    Write-Host 第一次查看 $($domain).pfx 文件是否存在
    if (![System.IO.File]::Exists($commonPfxPath)) {
        Write-Host openssl转化pfx    
        # openssl 3.x 版别  
        openssl pkcs12 -export -certpbe PBE-SHA1-3DES -keypbe PBE-SHA1-3DES -nomac -out $commonPfxPath -inkey $commonKeyPath -in $commonFullChainPath -password pass:$pfxPassword
        # openssl 1.0 版别
        # openssl pkcs12 -export -out $commonPfxPath -inkey $commonKeyPath -in $commonFullChainPath -password pass:$pfxPassword
    }

    Write-Host 第2次查看 $($domain).pfx 文件是否存在
    if (![System.IO.File]::Exists($commonPfxPath)) {
        # 假如重试次数大于2,那么退出当时函数
        if ($retryCnt -gt 2) {
            return
        }
        else {
            # 重试次数+1
            $retryCnt += 1
            IssueKey -currDomain $currDomain -currPath $currPath -force $true
        }
    }

    # 假如pem格局文件不存在,那么运用openssl转化成pem格局
    if (![System.IO.File]::Exists($commonPemPath)) {
        Write-Host openssl转化pem  
        openssl pkcs12 -in $commonPfxPath -out $commonPemPath -nodes -password pass:$pfxPassword
    }

    # 假如目标path不为空且存在,将证书复制到项目途径下 
    if (![string]::IsNullOrEmpty($currPath)) {
        Write-Host 复制$domain 证书文件到项目目录
        Copy-Item -Path $commonKeyPath -Destination "$($currPath)\$($domain).key" -Force
        Copy-Item -Path $commonPfxPath -Destination "$($currPath)\$($domain).pfx" -Force
        Copy-Item -Path $commonPemPath -Destination "$($currPath)\$($domain).pem" -Force
    }
}

foreach ($curr in $data) {
    # 每次弄新的,就重置次数
    $retryCnt = 0

    try {
        # 登录到cygwin运用acme.sh签发证书,并将文件复制到公共证书目录,并转成pfx格局,暗码一致运用$pfxPassword
        Write-Host 地址 $curr.path
        Write-Host 签发 $curr.domain 证书
        IssueKey -currDomain $curr.domain -currPath $curr.path -force $false
    }
    catch {
        Write-Host "产生反常:$_"
        break
    }
}
# 履行完后退出
exit

2.iis分配证书脚本,请保存在iis批量从头分配证书.ps1文件中

# 运用前先将战略设置为不严厉 Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
# 确保证书有用的状况下再运转次脚本,将证书称号、证书目录、密钥放入以下数组
# 公共证书密钥
$pfxpassword = "dgfdgsdfg"
# 公共证书途径
$pfxCommandDir= "E:\cert"
# 域名
$domain="test.com"
# 服务器上的证书与端口映射联系
$data = @(
    [pscustomobject]@{subDomain = '*';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) {
    $currDomain=$element.subDomain.Replace("*","_");
    $pfxPath = "$($pfxCommandDir)\$($currDomain).$($domain).pfx"
    Write-Host $pfxPath
    # 创立pfx目标
    try {
        $certificateObject = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($pfxPath, $pfxpassword)
        if (!$certificateObject.Verify()) {
            Write-Host $element.subDomain证书验证失利, 请查看相关装备
            break
        }
        else {
            Write-Host 证书验证成功
        }
        # 存储证书到个人
        if (!$store.Certificates.Contains($certificateObject)) {
            $store.Add($certificateObject)
            Write-Host 导入证书成功
        }
        $newThumbprint = $certificateObject.Thumbprint
        Write-Host 获取证书信息成功
        $guid = [System.Guid]::NewGuid()
        $applicationID = "{$($guid)}"
        $addr = "0.0.0.0:$($element.port)"
        Write-Host $addr $newThumbprint
        # netsh删去原有监听端口
        netsh http delete sslcert ipport=$addr
        # netsh增加端口
        netsh http add sslcert ipport=$addr certhash=$newThumbprint appid=$applicationID
        # 假如目标path不为空且存在,将证书复制到项目途径下 
        if (![string]::IsNullOrEmpty($element.path)) {
            $dest = "$($element.path)\$($currDomain).$($domain).pfx"
            Copy-Item -Path $pfxPath -Destination $dest -Force
            Write-Host 复制文件到项目目录成功
        }
    }
    catch {
        Write-Host "产生反常:$_"
        break
    }
}
# 封闭证书存储
$store.close() 

# 履行完后退出
exit

创立使命方案程序参阅

在惯例页面中,勾选“只在用户登录时运转”以及“运用最高权限”,保存即可

使命方案程序是依照次序履行的。

使命方案程序设置界面作用终究如图

以Windows Server 2008R2所示:
惯例界面
操作界面

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=603

分享给朋友:

“windows在cygwin64下运用acme.sh批量签发Let's Encrypt的ssl证书,并用powershell重新分配iis证书” 的相关文章

如安在LInux上装置并运转Jenkins

如安在LInux上装置并运转Jenkins

如安在LInux上装置并运转Jenkins Jenkins 是什么? Jenkins是一款开源 CI&CD 软件,用于主动化各种使命,包含构建、测验和布置软件。 Jenkins 支撑各种运转方法,可经过体系包、Docker 或许经过一个独立的 Java 程序。 官网:https://www...

linux服务器配置ip,linux怎么配置ip地址命令

linux服务器配置ip,linux怎么配置ip地址命令

在Linux服务器上配置IP地址,通常可以通过修改网络配置文件或使用命令行工具来完成。以下是两种常见的方法: 1. 使用`ifconfig`或`ip`命令在Linux中,可以使用`ifconfig`或`ip`命令来配置网络接口的IP地址。以下是一个使用`ip`命令的例子:```bashsudo ip...

电脑windows启动不了,电脑Windows启动不了?教你排查与解决方法

1. 检查电源:确保电脑的电源线已经正确连接,并且电源插座工作正常。2. 检查硬件连接:确认所有内部硬件(如内存、硬盘、显卡等)都正确安装并牢固连接。3. 安全模式启动: 在电脑启动时,尝试进入安全模式。这可以通过在启动时按下F8键(对于较旧的Windows版本)或Shift F8(对于W...

windows内核安全与驱动开发,二、Windows内核安全概述

windows内核安全与驱动开发,二、Windows内核安全概述

Windows内核安全与驱动开发是计算机科学中非常专业和深入的一个领域。它主要涉及对Windows操作系统的内核级别进行编程,以及开发能够直接与硬件交互的驱动程序。这些驱动程序可以控制和管理计算机的各种硬件设备,如显卡、声卡、网卡等。 Windows内核安全Windows内核安全是指保护操作系统内核...

linux查看yum源,什么是yum源?

linux查看yum源,什么是yum源?

在Linux系统中,您可以使用以下命令来查看当前系统使用的YUM源:```bashyum repolist```这个命令会列出所有已启用的仓库,以及它们的ID、名称、状态(已启用或已禁用)和仓库中可用的软件包数量。如果您想查看包括已禁用仓库在内的所有仓库,可以使用:```bashyum repoli...

linux历史命令记录,高效管理你的命令行历史

linux历史命令记录,高效管理你的命令行历史

在Linux系统中,历史命令记录是一个非常有用的功能,它允许用户查看和重复执行之前输入的命令。这个功能是由bash shell的历史命令机制实现的。 历史命令的基本操作1. 查看历史命令: 使用 `history` 命令可以查看之前执行过的命令列表。 `history n` 显示自上次使...