ubuntu apache2 安装 ssl 证书的方法
你好,honeymoose!
在 Ubuntu 上为 Apache2 安装 SSL 证书是一个非常常见的需求,这能让你的网站启用 HTTPS,从而加密用户与服务器之间的通信,提升网站的安全性和信誉。
这里我为你提供两种最主流的方法:
-
方法一 (推荐):使用 Let’s Encrypt 的 Certbot 自动安装(免费、自动化)
这是最简单、最快捷的方法,适合绝大多数个人项目和中小型网站。Certbot 会自动获取证书、配置 Apache,并设置自动续期。 -
方法二:手动安装商业或其他来源的 SSL 证书
如果你已经从其他证书颁发机构(CA)如 GoDaddy, DigiCert 等购买了证书,或者有其他特殊来源的证书文件,你需要手动配置。
准备工作 (两种方法都需要)
在开始之前,请确保你已经准备好以下几项:
- 一台运行 Ubuntu 的服务器,并且你拥有
sudo权限。 - Apache2 已经安装并正在运行。
- 一个有效的域名,并且该域名的 A 记录已经正确指向你服务器的公网 IP 地址。例如,
your-domain.com必须能解析到你的服务器。 - 防火墙已开启 443 端口。如果使用
ufw,可以运行sudo ufw allow 'Apache Full'来同时允许 HTTP (80) 和 HTTPS (443) 流量。
方法一:使用 Certbot 自动安装 Let’s Encrypt 证书 (推荐)
步骤 1: 安装 Certbot
Certbot 是 Let’s Encrypt 官方推荐的客户端,可以极大地简化安装过程。
# 更新软件包列表
sudo apt update
# 安装 Certbot 及其 Apache 插件
sudo apt install certbot python3-certbot-apache -y
步骤 2: 获取并安装 SSL 证书
运行以下命令,Certbot 会自动检测你的 Apache 配置文件中的域名,并引导你完成安装。
# --apache 插件会自动检测并配置 Apache
# -d 后面跟上你的域名,可以有多个
sudo certbot --apache -d your-domain.com -d www.your-domain.com
注意:
- 将
your-domain.com和www.your-domain.com替换成你自己的域名。- 如果你只有一个域名,可以只写
-d your-domain.com。
在执行过程中,Certbot 会问你几个问题:
- 输入你的邮箱地址:用于接收续期提醒和安全通知。
- 同意服务条款:选择
A(Agree)。 - 是否愿意分享你的邮箱:可选,选择
Y或N。 - 选择是否将所有 HTTP 流量重定向到 HTTPS:强烈建议选择
2: Redirect,这会自动为你配置好 301 重定向,是安全最佳实践。
完成后,Certbot 会告诉你证书已经成功安装,并显示证书文件的存放位置。你的 Apache 也会被自动重载,HTTPS 立刻生效!
步骤 3: 验证自动续期
Let’s Encrypt 证书有效期为 90 天,但 Certbot 在安装时已经为你创建了一个系统定时任务(cron job 或 systemd timer),会在证书过期前自动续期。
你可以通过以下命令模拟续期过程,来测试自动续期是否配置正确:
sudo certbot renew --dry-run
如果看到 “Congratulations, all renewals for this dry run succeeded.” 的消息,就说明一切正常。
方法二:手动安装商业或其他来源的 SSL 证书
如果你已经从证书颁发机构 (CA) 获得了证书文件,通常你会得到以下几个文件:
your_domain.crt或certificate.crt: 你的域名证书文件。private.key: 你的私钥文件(这个文件在生成 CSR 时就已经在你服务器上了)。ca_bundle.crt或chain.crt: 中级证书链文件,用于建立完整的信任链。
步骤 1: 将证书文件上传到服务器
为了安全和规范,建议将证书文件存放在 /etc/ssl/ 目录下。
# 创建一个专门存放你域名证书的目录
sudo mkdir -p /etc/ssl/certs/your-domain.com
# 将你的证书文件和私钥文件移动到安全的位置
# 假设你把文件上传到了用户主目录 (~)
sudo cp ~/your_domain.crt /etc/ssl/certs/your-domain.com/
sudo cp ~/ca_bundle.crt /etc/ssl/certs/your-domain.com/
sudo cp ~/private.key /etc/ssl/private/
# 设置严格的权限,特别是私钥,只有 root 用户可以读
sudo chmod 600 /etc/ssl/private/private.key
步骤 2: 启用 Apache SSL 模块
sudo a2enmod ssl
sudo systemctl restart apache2
步骤 3: 配置 Apache 的 SSL Virtual Host
你需要为你的网站创建一个监听 443 端口的虚拟主机配置文件。通常,最简单的方法是复制现有的 Port 80 配置文件。
- 找到你的网站配置文件,通常在
/etc/apache2/sites-available/目录下,例如your-domain.com.conf。 - 编辑这个文件,或者创建一个新的 SSL 配置文件,例如
your-domain.com-ssl.conf。
在你的配置文件中,添加一个新的 <VirtualHost *:443> 区块。下面是一个完整的示例:
<VirtualHost *:443>
ServerAdmin webmaster@localhost
ServerName your-domain.com
ServerAlias www.your-domain.com
DocumentRoot /var/www/html/your-domain
# 开启 SSL 引擎
SSLEngine on
# 指定证书文件的路径
SSLCertificateFile /etc/ssl/certs/your-domain.com/your_domain.crt
SSLCertificateKeyFile /etc/ssl/private/private.key
SSLCertificateChainFile /etc/ssl/certs/your-domain.com/ca_bundle.crt
# 日志文件
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# 其他 SSL 配置 (可选,但推荐)
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
重要提示:
- 确保
SSLCertificateFile,SSLCertificateKeyFile,SSLCertificateChainFile的路径与你步骤 1 中存放文件的路径完全一致。SSLCertificateChainFile指令对于某些旧版本的 Apache 可能不存在,如果遇到问题,可以尝试使用SSLCACertificateFile代替。
步骤 4: 启用新的 SSL 站点配置
# 启用你的 SSL 配置文件
sudo a2ensite your-domain.com-ssl.conf # 或者你现有的 .conf 文件名
# 测试 Apache 配置是否有语法错误
sudo apache2ctl configtest
如果输出 Syntax OK,说明配置没有问题。否则,请根据错误提示检查你的配置文件。
步骤 5: 重启 Apache 使配置生效
sudo systemctl restart apache2
现在,你应该可以通过 https://your-domain.com 访问你的网站了!
后续操作:强制 HTTP 跳转到 HTTPS
无论使用哪种方法,都建议将所有 HTTP 请求强制重定向到 HTTPS。
如果你使用了 Certbot 并选择了重定向选项,这一步已经自动完成。
如果是手动配置,请在你网站的 Port 80 (<VirtualHost *:80>) 配置文件中加入以下规则:
<VirtualHost *:80>
ServerName your-domain.com
ServerAlias www.your-domain.com
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>
然后不要忘记启用 rewrite 模块并重启 Apache:
sudo a2enmod rewrite
sudo systemctl restart apache2
希望这份详细的指南能帮到你!祝你配置顺利!
