返回
Windows下PowerShell自动生成HTTPS证书并配置Nginx
开发配置
2025-02-23 19:48:03
在 Windows 系统中设置 Nginx 的 HTTPS 证书可能会遇到一些问题,尤其是在证书的生成和导出过程中。为了简化这一过程,我们可以使用 PowerShell 脚本自动化生成和导出自签名证书,并使用 OpenSSL 提取私钥和证书。这篇文章将详细介绍如何使用 PowerShell 脚本解决这个问题,并配置 Nginx 来支持 SSL。
步骤 1:生成自签名证书
首先,使用 PowerShell 创建一个自签名证书。我们会使用 New-SelfSignedCertificate
命令来创建证书,并指定证书的 DNS 名称(即主机名)。
步骤 2:导出证书和私钥
生成证书后,我们将导出 .pfx
文件(包含证书和私钥)。为了避免手动输入密码,我们会在脚本中设置一个固定密码,脚本会自动填充该密码。
步骤 3:提取私钥和证书
接下来,我们使用 openssl
命令行工具从 .pfx
文件中提取私钥(.key
)和证书(.crt
),这两者可以单独用于配置服务器。
完整脚本
# 设定证书路径和名称
$CERT_PATH = "D:\server\ssl"
$CERT_NAME = "your-domain-name"
$PASSWORD = "YourPasswordHere" # 设置你想要的密码
# Step 1: 删除旧证书(如果存在)
$cert = Get-ChildItem -Path cert:\LocalMachine\My | Where-Object { $_.Subject -like "*$CERT_NAME*" }
if ($cert) { Remove-Item -Path $cert.PSPath }
# Step 2: 创建新的自签名证书
New-SelfSignedCertificate -DnsName $CERT_NAME -CertStoreLocation "cert:\LocalMachine\My\"
# Step 3: 导出证书为 .pfx 文件,使用设置的密码
$cert = Get-ChildItem -Path cert:\LocalMachine\My | Where-Object { $_.Subject -like "*$CERT_NAME*" }
# 转换为SecureString对象
$SecurePassword = ConvertTo-SecureString -String $PASSWORD -Force -AsPlainText
# 导出证书为 .pfx 文件,传递密码
Export-PfxCertificate -Cert $cert -FilePath "$CERT_PATH\$CERT_NAME.pfx" -Password $SecurePassword
# Step 4: 提取私钥和证书
# 提取私钥
openssl pkcs12 -in "$CERT_PATH\$CERT_NAME.pfx" -nocerts -out "$CERT_PATH\$CERT_NAME.key" -password pass:$PASSWORD -nodes
# 提取证书
openssl pkcs12 -in "$CERT_PATH\$CERT_NAME.pfx" -clcerts -nokeys -out "$CERT_PATH\$CERT_NAME.crt" -password pass:$PASSWORD
Write-Host "Certificate generation and export completed successfully!"
解释:
- 设定证书路径和密码:
$CERT_PATH
:证书存放的目录,可以根据实际情况修改。$CERT_NAME
:证书的名称,推荐使用域名。$PASSWORD
:设置导出证书时使用的密码。
- 删除旧证书: 脚本会检查是否已有相同名称的证书存在,如果存在,则将其删除,确保新的证书生成不会受到影响。
- 创建自签名证书: 使用
New-SelfSignedCertificate
命令创建一个新的证书。证书的 DNS 名称为$CERT_NAME
,并存储在LocalMachine\My
存储区。 - 导出证书和私钥:
- 使用
Export-PfxCertificate
导出.pfx
文件,并传递已加密的密码。这个文件包含证书和私钥。 - 使用
openssl
命令从.pfx
文件中提取.key
私钥文件和.crt
证书文件。
- 使用
- 自动密码填充: 脚本中不再需要手动输入密码。通过设置固定密码,整个过程实现了自动化。
配置 Nginx 使用 SSL 证书
在生成并提取了证书和私钥后,接下来需要配置 Nginx 以支持 SSL。
- 将生成的证书文件(
.crt
)和私钥文件(.key
)移动到 Nginx 配置目录中。例如,假设将它们放置在D:\nginx\conf\ssl
目录下。 - 打开 Nginx 配置文件(
nginx.conf
),并在server
配置块中添加 SSL 配置:
server {
listen 443 ssl;
server_name your-domain-name; # 替换为你的域名
ssl_certificate D:/nginx/conf/ssl/your-domain-name.crt; # 证书路径
ssl_certificate_key D:/nginx/conf/ssl/your-domain-name.key; # 私钥路径
ssl_protocols TLSv1.2 TLSv1.3; # 推荐的协议版本
ssl_ciphers HIGH:!aNULL:!MD5;
# 可选:设置 HTTP 到 HTTPS 的重定向
error_page 497 https://$host$request_uri;
# 其他 server 配置...
}
- 在配置文件中启用 HTTPS,并指向你的证书和私钥文件。保存后,重启 Nginx 以使配置生效。
nginx -s reload
优点:
- 自动化:该脚本使得证书的创建、导出和提取变得自动化,不需要用户手动干预。
- 免输入密码:通过设置固定密码,避免了每次导出证书时都需要输入密码的麻烦。
- 适应不同环境:你可以根据需求调整证书存储路径和文件名,甚至可以集成到 CI/CD 流程中。
使用注意事项:
- 安全性:密码的存储需要谨慎,确保密码不被暴露。如果是用于生产环境,建议使用环境变量或更安全的存储方式。
- 依赖工具:脚本中使用了
openssl
,需要确保你的机器上已经安装并配置好 OpenSSL。 - Windows 权限:执行 PowerShell 脚本时可能需要管理员权限,确保 PowerShell 以管理员身份运行。
结语:
通过这个 PowerShell 脚本,我们成功地实现了自动化生成、导出并提取自签名证书的流程。无论是开发、测试环境还是其他临时需求,这个脚本都能帮助我们快速部署 HTTPS 证书,节省大量的手动操作时间。
在配置 Nginx 使用 SSL 后,整个网站的 HTTPS 配置也变得更加便捷。如果你有类似需求,可以根据自己的环境做相应修改,结合自己的证书管理策略,优化和完善这一脚本。