# Ubuntu Apache2 SSL 证书安装方法

**URL:** <https://www.isharkfly.com/t/ubuntu-apache2-ssl/17522>\
**Category:** DevOps\
**Tags:** apache\
**Created:** [July 3, 2025, 6:10pm UTC](https://www.isharkfly.com/t/ubuntu-apache2-ssl/17522 "2025-07-03T18:10:27Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [July 3, 2025, 6:10pm UTC](https://www.isharkfly.com/t/ubuntu-apache2-ssl/17522/1 "2025-07-03T18:10:27Z")

</div>

ubuntu apache2 安装 ssl 证书的方法

---

<div class="post-metadata">

**Author:** ![hex](https://www.isharkfly.com/user_avatar/www.isharkfly.com/hex/32/21953_2.png) [@hex](https://www.isharkfly.com/u/hex)\
**Post date:** [July 3, 2025, 6:10pm UTC](https://www.isharkfly.com/t/ubuntu-apache2-ssl/17522/2 "2025-07-03T18:10:28Z")

</div>

你好，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 官方推荐的客户端，可以极大地简化安装过程。

```bash
# 更新软件包列表
sudo apt update

# 安装 Certbot 及其 Apache 插件
sudo apt install certbot python3-certbot-apache -y

```

#### **步骤 2: 获取并安装 SSL 证书**

运行以下命令，Certbot 会自动检测你的 Apache 配置文件中的域名，并引导你完成安装。

```bash
# --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 会问你几个问题：

1. **输入你的邮箱地址** ：用于接收续期提醒和安全通知。
2. **同意服务条款** ：选择 `A` (Agree)。
3. **是否愿意分享你的邮箱** ：可选，选择 `Y` 或 `N`。
4. **选择是否将所有 HTTP 流量重定向到 HTTPS** ：强烈建议选择 `2: Redirect`，这会自动为你配置好 301 重定向，是安全最佳实践。

完成后，Certbot 会告诉你证书已经成功安装，并显示证书文件的存放位置。你的 Apache 也会被自动重载，HTTPS 立刻生效！

#### **步骤 3: 验证自动续期**

Let’s Encrypt 证书有效期为 90 天，但 Certbot 在安装时已经为你创建了一个系统定时任务（cron job 或 systemd timer），会在证书过期前自动续期。

你可以通过以下命令模拟续期过程，来测试自动续期是否配置正确：

```bash
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/` 目录下。

```bash
# 创建一个专门存放你域名证书的目录
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 模块**

```bash
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>` 区块。下面是一个完整的示例：

```apacheconf
<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 站点配置**

```bash
# 启用你的 SSL 配置文件
sudo a2ensite your-domain.com-ssl.conf # 或者你现有的 .conf 文件名

# 测试 Apache 配置是否有语法错误
sudo apache2ctl configtest

```

如果输出 `Syntax OK`，说明配置没有问题。否则，请根据错误提示检查你的配置文件。

#### **步骤 5: 重启 Apache 使配置生效**

```bash
sudo systemctl restart apache2

```

现在，你应该可以通过 `https://your-domain.com` 访问你的网站了！

* * *

### **后续操作：强制 HTTP 跳转到 HTTPS**

无论使用哪种方法，都建议将所有 HTTP 请求强制重定向到 HTTPS。

如果你使用了 **Certbot** 并选择了重定向选项，这一步已经自动完成。

如果是 **手动配置** ，请在你网站的 Port 80 (`<VirtualHost *:80>`) 配置文件中加入以下规则：

```apacheconf
<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：

```bash
sudo a2enmod rewrite
sudo systemctl restart apache2

```

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

---

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [July 3, 2025, 6:16pm UTC](https://www.isharkfly.com/t/ubuntu-apache2-ssl/17522/3 "2025-07-03T18:16:28Z")

</div>



---

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [July 3, 2025, 9:31pm UTC](https://www.isharkfly.com/t/ubuntu-apache2-ssl/17522/4 "2025-07-03T21:31:19Z")

</div>

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

 ![2025-07-03_17-30-31](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/3X/2/3/2345855c262fcbfcd14264dd3d6fa6f1b1029ce4.jpeg)
