我有一个通过 Digital Ocean 运行的 ubuntu 服务器,它具有我通过 LetsEncrypt 获得的 SSH 证书。
我正在尝试切换到更便宜的服务,并且需要将证书移至我的新服务器。我该怎么做?
看来我可以撤销当前 DO 服务器上的证书。然后我可以在新服务器上顺利创建新证书吗?
答案1
其中一些已经说过了,但只是为了给出一个完整的答案。我已经开始在公共服务上使用一些 LE 证书。移动选项几乎不受限制,更多地取决于您用于请求证书的项目。获得证书后,您可以将密钥和证书导出到文件中,以便移动到您喜欢的任何服务。您不需要撤销任何内容即可获得新证书。由于 LE 证书的寿命短(3 个月)且免费,我发现大多数人将它们视为一次性用品。
我使用了 eBekker 的 ACMEsharp 项目来构建 powershell 脚本,以自动获取新证书。这是我目前所拥有的。它目前必须在 Web 服务器上运行。
https://github.com/ebekker/ACMESharp
## This requires the ACMESharp module from EBekker
#Import-Module AcmeSharp
$dns = "www.example.com"
$webRoot = "C:\inetpub\wwwroot"
$idRef = "$($dns.Replace('.','-'))-$(Get-Date -Format "yyyy-MM-dd_HH-mm")"
$certRef = "cert-$($dns.Replace('.','-'))-$(Get-Date -Format "yyyy-MM-dd")"
Import-Module AcmeSharp
Write-Host "Getting a new challenge"
New-ACMEIdentifier -Dns $dns -Alias $idRef | Out-Null
$challanges = Complete-ACMEChallenge -IdentifierRef $idRef -ChallengeType http-01 -Handler manual
$httpChallenge = ($challanges.Challenges | Where-Object {$_.Type -like 'http-01'}).Challenge
Write-Host "Creating challenge folder path"
New-Item -ItemType Directory -Path "$webRoot\$($httpChallenge.FilePath)" | Out-Null
$challengeFilePath = "$webRoot\$($httpChallenge.FilePath)\Default.htm"
if (Test-Path -Path $challengeFilePath) {
Remove-Item -Path $challengeFilePath -Force
}
Write-Host "Adding Challenge text to the reuqested path"
Add-Content -Path $challengeFilePath -Value $httpChallenge.FileContent -Force | Out-Null
Write-Host "Waitin 15 sec..."
Start-Sleep -Seconds 15
Write-Host "Submitting Challenge"
Submit-ACMEChallenge -IdentifierRef $idRef -ChallengeType http-01 -Force | Out-Null
Write-Host "Waiting 15 sec..."
Start-Sleep -Seconds 15
$id = Update-ACMEIdentifier -IdentifierRef $idRef
if ($id.Status -eq "pending") {
Write-Host "Challenge still pending, waiting 30 sec and retrying"
Start-Sleep -Seconds 30
Update-ACMEIdentifier -IdentifierRef $idRef
}
if ($id.Status -ne "valid") {
throw "Identifier could not be validated."
}
else {
Write-Host "Challenge appears completed. Building cert"
New-ACMECertificate -IdentifierRef $idRef -Alias $certRef -Generate | Out-Null
Submit-ACMECertificate -CertificateRef $certRef | Out-Null
Start-Sleep -Seconds 15
Update-ACMECertificate -CertificateRef $certRef
Get-ACMECertificate -CertificateRef $certRef -ExportKeyPEM C:\SSL\$dns.key.pem -ExportCertificatePEM C:\SSL\$dns.crt.pem -ExportPkcs12 C:\SSL\$dns.pfx
#Install Cert
#Install-ACMECertificateToIIS -Certificate $certRef
}
答案2
假设您正在使用该certbot
工具来管理 Let's Encrypt 证书(大多数人都这样做),那么将整个/etc/letsencrypt
目录从一台服务器复制到另一台服务器就足够了。您的所有证书以及 certbot 配置都在那里。因此,您可以像以前一样继续在新服务器上工作。
答案3
我不太赞成将整个 /etc/letsencrypt 目录从一台服务器移动到另一台服务器的建议。它假设您只托管一个站点。我也尝试过将 /etc/letsencrypt 中的特定文件复制到新服务器,但这样做很麻烦,而且容易出错。所以这是我的替代建议,它不需要手动修改 /etc/letsencrypt,可以避免任何停机时间。
- 将站点文件、数据等复制到新服务器
- 在新服务器上,为临时证书/密钥创建一个目录,我认为“迁移”是一个合适的名称,例如
/etc/pki/tls/migration
- 在迁移目录中创建一个文件
name-of-site-fullchain.pem
,然后将旧服务器上的证书文件的内容从 复制并粘贴/etc/letsencrypt/live/name.of.site/fullchain.pem
到其中。对密钥执行相同操作。name-of-site-privkey.pem
在迁移目录中创建并从 复制/粘贴/etc/letsencrypt/live/name.of.site/privkey.pem
。您可能还需要在密钥文件上设置 600 权限。 - 在新服务器上配置您的 Web 服务器软件以使用迁移目录中的证书/密钥。
- 更新您的 DNS 记录。在传播过程中,一些用户会获取旧服务器,一些用户会获取新服务器,但两者都可以正常工作,因为它们具有相同的有效 SSL 证书。
- 第二天,当 DNS 传播完成后,您将能够在新服务器上运行 certbot 来获取更新的证书,您可以随时更新该证书。
- 更改新服务器上的 Web 服务器配置以使用新的 Letsencrypt 证书。
- 删除迁移目录中不再需要的证书/密钥。
- 删除旧服务器上的网站和证书。
答案4
- 在旧服务器上存档证书
- 将其移至新服务器
- 解压到正确位置
- 创建符号链接
- 重定向域名
- 试运行以验证新服务器上的证书。
根据本文:https://druss.co/2019/03/migrate-letsencrypt-certificates-certbot-to-new-server/