将我的 LetsEncrypt 证书从一台服务器移动到另一台服务器有哪些选择?

Kec*_*oey 4 lets-encrypt

我有一个通过 Digital Ocean 运行的 ubuntu 服务器,它有一个我通过 LetsEncrypt 获得的 SSH 证书。

我正在尝试切换到更便宜的服务,我需要将证书移动到我的新服务器。我怎样才能做到这一点?

看起来我可以撤销当前 DO 服务器上的证书。然后我可以在我的新服务器上创建一个新服务器而没有任何问题吗?

Mic*_*ton 9

假设您正在使用该certbot工具来管理您的 Let's Encrypt 证书(大多数人都这样做),那么将整个/etc/letsencrypt目录从一台服务器复制到另一台服务器就足够了。您的所有证书以及 certbot 配置都在其中。因此,您可以完全像以前一样在新服务器上继续操作。

  • 如果新服务器已经包含其他证书,最好有真正需要的文件列表(并且可能需要在复制后重命名?) (8认同)

Dan*_*ard 7

我不喜欢将整个 /etc/letsencrypt 目录从一台服务器移动到另一台服务器的建议。它假定您只托管一个站点。我还尝试将 /etc/letsencrypt 中的特定文件复制到新服务器,但这很繁琐且容易出错。所以这是我的替代建议,它不需要任何手动修改 /etc/letsencrypt 避免了任何停机时间。

  1. 将站点文件、数据等复制到您的新服务器
  2. 在新服务器上,为临时证书/密钥创建一个目录,我认为“迁移”是一个合适的名称,例如 /etc/pki/tls/migration
  3. 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 权限。
  4. 在新服务器上配置您的网络服务器软件以使用迁移目录中的证书/密钥。
  5. 更新您的 DNS 记录。当它们传播时,一些用户获得旧服务器,一些获得新服务器,但两者都可以正常工作,因为它们具有相同的、有效的 SSL 证书。
  6. 第二天,当 DNS 传播后,您将能够在新服务器上运行 certbot 以获取更新的证书,您可以随时更新该证书。
  7. 更改新服务器上的网络服务器配置以使用新的 letencrypt 证书。
  8. 删除迁移目录中不再需要的证书/密钥。
  9. 删除旧服务器上的网站和证书。


Cor*_*son 2

其中一些已经说过了,但只是为了给出一个完整的答案。我已经开始在公共服务中使用一些 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
}
Run Code Online (Sandbox Code Playgroud)