我有一个通过 Digital Ocean 运行的 ubuntu 服务器,它有一个我通过 LetsEncrypt 获得的 SSH 证书。
我正在尝试切换到更便宜的服务,我需要将证书移动到我的新服务器。我怎样才能做到这一点?
看起来我可以撤销当前 DO 服务器上的证书。然后我可以在我的新服务器上创建一个新服务器而没有任何问题吗?
假设您正在使用该certbot工具来管理您的 Let's Encrypt 证书(大多数人都这样做),那么将整个/etc/letsencrypt目录从一台服务器复制到另一台服务器就足够了。您的所有证书以及 certbot 配置都在其中。因此,您可以完全像以前一样在新服务器上继续操作。
我不喜欢将整个 /etc/letsencrypt 目录从一台服务器移动到另一台服务器的建议。它假定您只托管一个站点。我还尝试将 /etc/letsencrypt 中的特定文件复制到新服务器,但这很繁琐且容易出错。所以这是我的替代建议,它不需要任何手动修改 /etc/letsencrypt 避免了任何停机时间。
/etc/pki/tls/migrationname-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 权限。其中一些已经说过了,但只是为了给出一个完整的答案。我已经开始在公共服务中使用一些 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)