返回

Windows下PowerShell自动生成HTTPS证书并配置Nginx

开发配置

在 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!"

解释:

  1. 设定证书路径和密码
    • $CERT_PATH:证书存放的目录,可以根据实际情况修改。
    • $CERT_NAME:证书的名称,推荐使用域名。
    • $PASSWORD:设置导出证书时使用的密码。
  2. 删除旧证书: 脚本会检查是否已有相同名称的证书存在,如果存在,则将其删除,确保新的证书生成不会受到影响。
  3. 创建自签名证书: 使用 New-SelfSignedCertificate 命令创建一个新的证书。证书的 DNS 名称为 $CERT_NAME,并存储在 LocalMachine\My 存储区。
  4. 导出证书和私钥
    • 使用 Export-PfxCertificate 导出 .pfx 文件,并传递已加密的密码。这个文件包含证书和私钥。
    • 使用 openssl 命令从 .pfx 文件中提取 .key 私钥文件和 .crt 证书文件。
  5. 自动密码填充: 脚本中不再需要手动输入密码。通过设置固定密码,整个过程实现了自动化。

配置 Nginx 使用 SSL 证书

在生成并提取了证书和私钥后,接下来需要配置 Nginx 以支持 SSL。

  1. 将生成的证书文件(.crt)和私钥文件(.key)移动到 Nginx 配置目录中。例如,假设将它们放置在 D:\nginx\conf\ssl 目录下。
  2. 打开 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 配置...
}
  1. 在配置文件中启用 HTTPS,并指向你的证书和私钥文件。保存后,重启 Nginx 以使配置生效。
nginx -s reload

优点:

  • 自动化:该脚本使得证书的创建、导出和提取变得自动化,不需要用户手动干预。
  • 免输入密码:通过设置固定密码,避免了每次导出证书时都需要输入密码的麻烦。
  • 适应不同环境:你可以根据需求调整证书存储路径和文件名,甚至可以集成到 CI/CD 流程中。

使用注意事项:

  • 安全性:密码的存储需要谨慎,确保密码不被暴露。如果是用于生产环境,建议使用环境变量或更安全的存储方式。
  • 依赖工具:脚本中使用了 openssl,需要确保你的机器上已经安装并配置好 OpenSSL。
  • Windows 权限:执行 PowerShell 脚本时可能需要管理员权限,确保 PowerShell 以管理员身份运行。

结语:

通过这个 PowerShell 脚本,我们成功地实现了自动化生成、导出并提取自签名证书的流程。无论是开发、测试环境还是其他临时需求,这个脚本都能帮助我们快速部署 HTTPS 证书,节省大量的手动操作时间。

在配置 Nginx 使用 SSL 后,整个网站的 HTTPS 配置也变得更加便捷。如果你有类似需求,可以根据自己的环境做相应修改,结合自己的证书管理策略,优化和完善这一脚本。