
在当今互联网环境中,网络安全已不再是可选项,而是必备基础。HTTPS加密协议已成为保护网站数据传输安全的标准方案,而SSL/TLS证书则是启用HTTPS的关键。然而,传统商业SSL证书价格昂贵,部署复杂,这成为了许多网站管理员实现全站HTTPS的障碍。
Let's Encrypt的出现彻底改变了这一局面。作为一家由互联网安全研究小组(ISRG) 运营的免费、自动化、开放的证书颁发机构(CA),它旨在推动全球互联网向HTTPS迁移。Let's Encrypt于2015年正式推出,通过自动化证书管理环境(ACME) 协议简化了证书的申请、验证和部署过程。
本文将深入探讨如何在Ubuntu Server环境中充分利用Let's Encrypt免费SSL证书服务,从基础概念到高级应用,从单服务器部署到复杂场景实践,提供一份全面且深入的技术指南。
Let's Encrypt是一个由Mozilla、思科、Akamai、IdenTrust和EFF等组织发起的免费SSL证书提供商。它的使命是为全球网站提供免费的HTTPS加密服务,降低安全通信的技术和财务门槛。与传统CA不同,Let's Encrypt不验证组织身份,只验证申请者对域名的控制权,因此它颁发的是域名验证(DV)证书。
截至2024年,Let's Encrypt已成为全球最大的证书颁发机构,为数千万个网站提供SSL证书,极大地推动了全网HTTPS化进程。
ACME(Automated Certificate Management Environment)协议是Let's Encrypt的核心技术,它标准化了证书申请、验证和续订的自动化流程。ACME协议主要通过RESTful API进行通信,使用JSON格式传输数据。
ACME协议中的证书申请流程包含以下几个关键步骤:
Let's Encrypt主要通过以下方式验证申请者对域名的控制权:
http://域名/.well-known/acme-challenge/<token>。Let's Encrypt服务器会访问该URL验证内容是否正确。在实际操作中,Certbot等客户端工具会自动完成这些挑战过程,大大简化了管理员的工作。
在开始安装和配置Let's Encrypt SSL证书之前,请确保您的Ubuntu服务器满足以下条件:
确保系统软件包是最新的:
sudo apt update
sudo apt upgrade -y根据您的需求安装合适的Web服务器。对于Nginx:
sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx对于Apache:
sudo apt install apache2 -y
sudo systemctl enable apache2
sudo systemctl start apache2配置防火墙允许HTTP和HTTPS流量:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload确保您拥有一个有效的域名,并且该域名的A记录或AAAA记录已正确指向您的服务器IP地址。您可以使用以下命令验证DNS解析是否正确:
nslookup yourdomain.com
dig yourdomain.com注意:Let's Encrypt在颁发证书前会验证域名所有权,因此务必确保DNS配置正确且已完全传播。
Certbot是EFF(电子前沿基金会)为Let's Encrypt开发的开源客户端工具,它简化了证书的获取和续订过程。Certbot支持多种Web服务器和操作系统,并提供了丰富的插件系统,可以自动配置Web服务器使用新获取的证书。
根据您的Ubuntu版本和Web服务器类型,可以选择不同的安装方法:
方法一:使用APT官方仓库(推荐)
sudo apt update
sudo apt install certbot python3-certbot-nginx -y # 对于Nginx
# 或者
sudo apt install certbot python3-certbot-apache -y # 对于Apache方法二:使用Snap包(最新版本)
sudo apt install snapd -y
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot # 确保certbot在PATH中方法三:使用Certbot官方PPA
sudo apt-get install software-properties-common -y
sudo add-apt-repository ppa:certbot/certbot -y
sudo apt-get update
sudo apt-get install python-certbot-nginx -y # 对于Nginx安装完成后,可以查看Certbot的帮助信息了解可用选项:
certbot --helpCertbot的配置文件通常位于/etc/letsencrypt/目录。主要的配置文件包括:
cli.ini:Certbot主配置文件renewal/:证书续订配置目录您可以创建或编辑/etc/letsencrypt/cli.ini文件来设置默认选项:
# 使用ACME v2服务器,默认为Let's Encrypt的生产环境
server = https://acme-v02.api.letsencrypt.org/directory
# 注册时使用的邮箱地址
email = your-email@example.com
# 同意Let's Encrypt服务条款
agree-tos = True
# 在成功获取证书后自动重启Web服务器
deploy-hook = systemctl reload nginx根据您的Web服务器和需求,有多种方式可以获取SSL证书:
为Nginx自动获取并配置证书
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com为Apache自动获取并配置证书
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com仅获取证书(不自动修改Web服务器配置)
sudo certbot certonly --standalone -d yourdomain.com -d www.yourdomain.com使用Webroot插件获取证书(不需要停止Web服务器)
sudo certbot certonly --webroot -w /var/www/html -d yourdomain.com -d www.yourdomain.com在执行这些命令时,Certbot会引导您完成以下步骤:
成功获取证书后,Let's Encrypt会将证书文件存储在/etc/letsencrypt/live/yourdomain.com/目录中。该目录包含以下重要文件:
cert.pem:域名证书privkey.pem:私钥文件(应严格保护)chain.pem:Let's Encrypt中间证书链fullchain.pem:包含域名证书和中间证书链的完整证书链在实际配置中,Nginx和Apache通常需要使用fullchain.pem和privkey.pem文件。
如果使用certonly选项获取证书,您需要手动配置Nginx使用SSL证书。编辑Nginx站点配置文件(通常位于/etc/nginx/sites-available/目录):
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# 其他服务器配置...
}
# HTTP重定向到HTTPS
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$server_name$request_uri;
}配置完成后,测试Nginx配置并重新加载:
sudo nginx -t
sudo systemctl reload nginx对于Apache,同样需要手动配置SSL虚拟主机。启用SSL模块并编辑虚拟主机配置文件:
sudo a2enmod ssl
sudo a2enmod rewrite创建或编辑Apache虚拟主机配置文件:
<VirtualHost *:443>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/yourdomain.com/chain.pem
# 其他服务器配置...
</VirtualHost>
# HTTP重定向到HTTPS
<VirtualHost *:80>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>配置完成后,测试Apache配置并重新加载:
sudo apache2ctl configtest
sudo systemctl reload apache2Let's Encrypt证书的有效期为90天,这比传统商业证书(通常1-2年)短得多。这种设计鼓励自动化和持续监控,确保证书始终保持最新状态。
证书应在到期前续订,建议在证书到期前30天内进行续订操作。Certbot的renew命令会自动检查证书的到期时间,只有在到期前30天内才会实际续订。
您可以手动测试证书续订过程而不实际执行(dry-run):
sudo certbot renew --dry-run此命令会模拟续订过程,验证配置是否正确,但不会实际请求新证书。如果测试成功,您可以手动执行续订:
sudo certbot renewrenew命令会自动检查/etc/letsencrypt/renewal/目录中的所有证书配置,并为即将到期的证书执行续订。
为了确保证书不会意外过期,最佳实践是配置自动续订。通过系统的cron作业或systemd定时器可以实现这一点。
使用Cron配置自动续订:
sudo crontab -e添加以下行以实现每天凌晨2点检查并续订证书,续订成功后重启Nginx:
0 2 * * * /usr/bin/certbot renew --renew-hook "systemctl restart nginx" --quiet或者,更精细的控制可以设置为每周一凌晨4:30执行:
30 4 * * 1 /usr/bin/certbot renew --renew-hook "systemctl restart nginx" --quiet > /dev/null 2>&1使用Systemd定时器:
创建systemd服务单元文件/etc/systemd/system/certbot-renew.service:
[Unit]
Description=Certbot Renewal
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --renew-hook "systemctl reload nginx"创建systemd定时器单元文件/etc/systemd/system/certbot-renew.timer:
[Unit]
Description=Timer for Certbot Renewal
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target启用并启动定时器:
sudo systemctl enable certbot-renew.timer
sudo systemctl start certbot-renew.timer查看已安装的证书:
sudo certbot certificates此命令会列出所有已安装的证书,包括它们的到期日期和存储路径。
撤销证书:
如果私钥泄露或不再需要证书,可以将其撤销:
sudo certbot revoke --cert-path /etc/letsencrypt/live/yourdomain.com/cert.pem删除证书:
完全删除证书及其相关文件:
sudo certbot delete --cert-name yourdomain.com获得SSL证书后,需要正确配置Web服务器以提供最佳的安全性。以下是一些重要的安全配置:
Nginx SSL配置优化:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# 启用会话恢复以减少Round Trip Time (RTT)
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# 现代加密配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# 启用OCSP装订以提高性能
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# 添加安全相关的HTTP头
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
# 其他配置...
}Apache SSL配置优化:
<VirtualHost *:443>
ServerName yourdomain.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/yourdomain.com/chain.pem
# 启用HTTP/2
Protocols h2 http/1.1
# 现代加密配置
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLSessionTickets off
# 添加安全相关的HTTP头
Header always set Strict-Transport-Security "max-age=63072000"
Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options DENY
Header always set X-XSS-Protection "1; mode=block"
# 其他配置...
</VirtualHost>SSL/TLS加密会增加服务器的CPU负载,以下是一些性能优化建议:
Let's Encrypt支持通配符证书,可以保护一个域名及其所有子域名。通配符证书只能通过DNS-01挑战方式获取。
获取通配符证书:
sudo certbot certonly \
--manual \
--preferred-challenges=dns \
--email your-email@example.com \
--agree-tos \
-d "*.yourdomain.com" \
-d yourdomain.com此命令会提示您在DNS中添加特定的TXT记录以验证域名所有权。验证通过后,将颁发通配符证书。
自动化DNS挑战:
对于需要频繁更新证书的环境,可以使用DNS提供商API自动化DNS挑战过程。不同DNS提供商有相应的Certbot插件,如certbot-dns-cloudflare、certbot-dns-route53等。
端口绑定错误:
Problem binding to port 443: Could not bind to IPv4 or IPv6.. Skipping解决方案:确保没有其他服务(如Apache、Nginx)占用80和443端口,必要时停止这些服务。
证书续订失败:
Attempting to renew cert from /etc/letsencrypt/renewal/yourdomain.com.conf produced an unexpected error解决方案:检查/etc/letsencrypt/renewal/yourdomain.com.conf配置文件是否正确,确认域名解析正常。
权限问题:
Failed to deploy certificate(s) for yourdomain.com (error: /etc/letsencrypt/live/yourdomain.com/fullchain.pem: Permission denied)解决方案:确保证书文件的权限正确,通常应为root所有,其他用户只读。
--verbose参数获取详细日志--test-cert参数从Let's Encrypt测试环境获取证书/var/log/letsencrypt/目录中的日志文件设置监控以跟踪证书状态和网站可用性:
证书到期监控:
#!/bin/bash
# 检查证书到期日期
openssl x509 -in /etc/letsencrypt/live/yourdomain.com/cert.pem -noout -enddate
# 或使用Certbot检查
certbot certificates可以设置定期检查脚本,并在证书即将到期时发送警报。
Let's Encrypt支持在一个证书中包含多个域名(SAN证书)。在获取证书时指定多个-d参数即可:
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com -d api.yourdomain.com -d shop.yourdomain.com这将在单个证书中包含所有指定的域名,简化证书管理。
HAProxy是常用的负载均衡器,也可以配置使用Let's Encrypt证书。由于HAProxy需要将证书和私钥合并为一个文件,需要执行以下步骤:
准备HAProxy证书文件:
sudo cat /etc/letsencrypt/live/yourdomain.com/fullchain.pem /etc/letsencrypt/live/yourdomain.com/privkey.pem > /etc/haproxy/ssl/yourdomain.com.pem配置HAProxy使用SSL证书:
frontend https_frontend
bind *:443 ssl crt /etc/haproxy/ssl/yourdomain.com.pem
mode http
default_backend web_servers
frontend http_frontend
bind *:80
mode http
redirect scheme https code 301 if !{ ssl_fc }设置自动证书更新脚本:
创建脚本/etc/haproxy/renewLetsEncryptCertificates.sh:
#!/bin/bash
certbot renew --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 --post-hook "/etc/haproxy/prepareLetsEncryptCertificates.sh && systemctl reload haproxy" --quiet创建证书准备脚本/etc/haproxy/prepareLetsEncryptCertificates.sh:
#!/bin/bash
for CERTIFICATE in `find /etc/letsencrypt/live/* -type d`; do
CERTIFICATE=`basename $CERTIFICATE`
cat /etc/letsencrypt/live/$CERTIFICATE/fullchain.pem /etc/letsencrypt/live/$CERTIFICATE/privkey.pem > /etc/haproxy/ssl/$CERTIFICATE.pem
doneLet's Encrypt证书也可以用于加密邮件服务器(如Postfix、Dovecot)的通信:
获取证书:
sudo certbot certonly --standalone -d mail.yourdomain.com -d yourdomain.com配置Postfix使用TLS:
# main.cf
smtpd_tls_cert_file = /etc/letsencrypt/live/yourdomain.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/yourdomain.com/privkey.pem
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache配置Dovecot使用TLS:
# dovecot.conf
ssl_cert = </etc/letsencrypt/live/yourdomain.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/yourdomain.com/privkey.pem
ssl_min_protocol = TLSv1.2在Docker化环境中,可以使用Docker版本的Certbot,或通过挂载卷的方式共享证书:
使用Docker Certbot:
sudo docker run -it --rm --name certbot \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
-p 80:80 \
certbot/certbot certonly --standalone -d yourdomain.com在Docker容器间共享证书:
创建Docker卷用于存储证书:
docker volume create ssl_certs将证书复制到卷中:
docker run --rm -v ssl_certs:/ssl -v /etc/letsencrypt:/letsencrypt alpine \
cp -r /letsencrypt/live/yourdomain.com /ssl/其他容器可以通过挂载该卷访问证书。
Let's Encrypt极大地降低了部署HTTPS的门槛,推动了全网加密的进程。通过本文的介绍,您应该已经掌握了在Ubuntu Server上使用Let's Encrypt部署和管理SSL证书的全面知识。
从基础的单域名证书部署,到复杂的多域名、通配符证书管理,再到在负载均衡器和邮件服务器中的应用,Let's Encrypt都能提供可靠的解决方案。结合自动化续订和监控,可以构建既安全又可靠的HTTPS基础设施。
随着互联网安全要求的不断提高,HTTPS已从"好有"变为"必需"。借助Let's Encrypt和Ubuntu Server,您可以以零成本为您的网站和服务提供企业级的加密保护,为用户数据安全保驾护航。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。