Ubuntu Apache2 SSL 证书安装方法

ubuntu apache2 安装 ssl 证书的方法

你好,honeymoose!

在 Ubuntu 上为 Apache2 安装 SSL 证书是一个非常常见的需求,这能让你的网站启用 HTTPS,从而加密用户与服务器之间的通信,提升网站的安全性和信誉。

这里我为你提供两种最主流的方法:

  1. 方法一 (推荐):使用 Let’s Encrypt 的 Certbot 自动安装(免费、自动化)
    这是最简单、最快捷的方法,适合绝大多数个人项目和中小型网站。Certbot 会自动获取证书、配置 Apache,并设置自动续期。

  2. 方法二:手动安装商业或其他来源的 SSL 证书
    如果你已经从其他证书颁发机构(CA)如 GoDaddy, DigiCert 等购买了证书,或者有其他特殊来源的证书文件,你需要手动配置。


准备工作 (两种方法都需要)

在开始之前,请确保你已经准备好以下几项:

  1. 一台运行 Ubuntu 的服务器,并且你拥有 sudo 权限。
  2. Apache2 已经安装并正在运行
  3. 一个有效的域名,并且该域名的 A 记录已经正确指向你服务器的公网 IP 地址。例如,your-domain.com 必须能解析到你的服务器。
  4. 防火墙已开启 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.comwww.your-domain.com 替换成你自己的域名。
  • 如果你只有一个域名,可以只写 -d your-domain.com

在执行过程中,Certbot 会问你几个问题:

  1. 输入你的邮箱地址:用于接收续期提醒和安全通知。
  2. 同意服务条款:选择 A (Agree)。
  3. 是否愿意分享你的邮箱:可选,选择 YN
  4. 选择是否将所有 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.crtcertificate.crt: 你的域名证书文件。
  • private.key: 你的私钥文件(这个文件在生成 CSR 时就已经在你服务器上了)。
  • ca_bundle.crtchain.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 配置文件。

  1. 找到你的网站配置文件,通常在 /etc/apache2/sites-available/ 目录下,例如 your-domain.com.conf
  2. 编辑这个文件,或者创建一个新的 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

希望这份详细的指南能帮到你!祝你配置顺利!

最重要的是在这里准备证书文件。