Skip to content

网站部署(四):最简单的 SSL 配置

约 1606 字大约 5 分钟

SSL证书Apache配置HTTPSWeb

2025-05-20

统计数据加载中...

前言

在上一篇文章中,我们详细讨论了如何修复现有SSL证书的配置问题。本文将介绍一种更简便、完全免费且自动续期的SSL证书解决方案 - Let's Encrypt。这是我最新部署的mask.alcmaple.cn网站采用的方案,整个过程几乎可以一键完成,非常适合个人网站和小型项目。

这是每个人所向往的最理想、最简单的证书方案

Let's Encrypt

Let's Encrypt是一个免费、开放、自动化的证书颁发机构,由非营利组织互联网安全研究组(ISRG)运营。它提供的SSL证书具有以下优势:

  • 完全免费:无需支付任何费用
  • 自动化:可通过脚本自动获取和更新
  • 自动续期:证书有效期90天,但会自动续期
  • 易于配置:使用Certbot工具可以自动完成大部分配置工作
  • 广泛受信任:被所有主流浏览器信任

前置条件

在开始前,请确保您满足以下条件:

  • 已经部署好Apache服务器
  • 域名已正确解析到服务器IP
  • 有root或sudo权限
  • HTTP网站已正常访问

常用命令参考

以下是本文将使用的部分命令讲解:

which certbot              # 检查是否已安装certbot,用于apt install的东西
sudo apt update            # 更新软件源
sudo apt install certbot   # 安装certbot
sudo certbot --apache -d mask.alcmaple.cn # 自动获取Let's Encrypt证书、更新 apache 配置、自动续期
sudo a2enmod ssl           # 启用Apache的SSL模块
sudo a2enmod headers       # 启用headers模块
sudo a2enmod rewrite       # 启用URL重写模块
sudo apache2ctl configtest # 检查Apache配置文件语法是否正确
sudo systemctl restart apache2 # 重启Apache服务器(有些配置重启才能生效)
sudo a2enmod proxy # 启用Apache的代理模块,这样请求转发才能到前端和后端(前后端分离架构及其重要
sudo a2enmod proxy_http # 处理HTTP/HTTPS协议的代理请求
sudo a2ensite mask.alcmaple.cn.conf # 启用该网站的配置文件(上线网站的时候会手动创建这个)
sudo certbot --apache --force-renewal -d mask.alcmaple.cn # 重新运行certbot
sudo nano /etc/apache2/sites-available/mask.alcmaple.cn.conf # 编辑mask.alcmaple.cn网站的 apache 配置

添加SSL证书

1. 安装Certbot工具

首先,我们需要安装Certbot工具及其Apache插件:

# 检查是否已安装certbot
which certbot

# 如果未安装,运行以下命令安装
sudo apt update
sudo apt install certbot
sudo apt install python3-certbot-apache

2. 自动获取并配置证书

这是最简单也是最核心的一步,只需一条命令:

sudo certbot --apache -d mask.alcmaple.cn

执行此命令后,Certbot会:

  • 验证您对域名的所有权
  • 自动申请SSL证书
  • 配置Apache服务器使用该证书
  • 设置定时任务自动续期证书

在执行过程中,您会看到类似以下选项:

1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access.

强烈建议选择选项“2”,这会自动将所有HTTP请求重定向到HTTPS(用户访问 http 或者 https 都会去到 https)

成功后,您会看到类似以下消息:

Congratulations! You have successfully enabled https://mask.alcmaple.cn

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=mask.alcmaple.cn

这表明证书已成功配置!此时,Certbot已经:

  • 保存了证书文件到/etc/letsencrypt/live/mask.alcmaple.cn/目录
  • 创建了新的SSL虚拟主机配置mask.alcmaple.cn-le-ssl.conf
  • 修改了HTTP配置实现自动重定向

3. 启用必要的Apache模块

尽管Certbot可能已经自动启用了一些模块,但我们最好手动确认一下关键模块是否都已启用:

sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2ensite mask.alcmaple.cn.conf

对于前后端分离的项目,启用proxy相关模块尤为重要,这样Apache才能正确代理后端API请求。

4. 检查配置并重启Apache

sudo apache2ctl configtest
sudo systemctl restart apache2

完成上述步骤后,您应该可以通过HTTPS访问您的网站了。但有时可能仍然会看到"不安全"警告

5. 增强SSL配置

如果您的网站在启用HTTPS后仍显示"不安全",通常是因为缺少必要的安全头或存在混合内容。我们需要修改配置文件添加安全头:

sudo nano /etc/apache2/sites-available/mask.alcmaple.cn-le-ssl.conf
# 或者可能是:
sudo nano /etc/apache2/sites-available/mask.alcmaple.cn.conf

添加安全头,完整代码如下:

# HTTP 配置 - 重定向到HTTPS
<VirtualHost *:80>
    ServerName mask.alcmaple.cn
    
    # 重定向所有HTTP请求到HTTPS
    RewriteEngine On
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
    
    ErrorLog ${APACHE_LOG_DIR}/mask.alcmaple.cn-http-error.log
    CustomLog ${APACHE_LOG_DIR}/mask.alcmaple.cn-http-access.log combined
</VirtualHost>

# HTTPS 配置
<VirtualHost *:443>
    ServerName mask.alcmaple.cn
    DocumentRoot /var/www/mask.alcmaple.cn
    
    # SSL配置
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/mask.alcmaple.cn/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/mask.alcmaple.cn/privkey.pem
    
    # 安全头配置
    <IfModule mod_headers.c>
        Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
        Header always set X-Content-Type-Options "nosniff"
        Header always set X-Frame-Options "SAMEORIGIN"
        Header always set X-XSS-Protection "1; mode=block"
        Header always set Content-Security-Policy "upgrade-insecure-requests;"
    </IfModule>
    
    # 前端静态文件
    <Directory /var/www/mask.alcmaple.cn>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
        
        # 对于单页应用(SPA),可能需要以下重写规则
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteBase /
            RewriteRule ^index\.html$ - [L]
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteCond %{REQUEST_URI} !^/api/
            RewriteRule . /index.html [L]
        </IfModule>
    </Directory>
    
    # 后端API - 使用Location块
    <Location /api/>
        ProxyPass http://127.0.0.1:5002/api/
        ProxyPassReverse http://127.0.0.1:5002/api/
        # 添加这些行以确保请求被正确处理
        RequestHeader set X-Forwarded-Proto "https"
        RequestHeader set X-Forwarded-Port "443"
    </Location>
    
    # 日志配置
    ErrorLog ${APACHE_LOG_DIR}/mask.alcmaple.cn-error.log
    CustomLog ${APACHE_LOG_DIR}/mask.alcmaple.cn-access.log combined
    
    # SSL协议设置
    SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
    SSLHonorCipherOrder on
    SSLCompression off
    SSLSessionTickets off
</VirtualHost>

然后启用headers和rewrite模块并重启Apache:

sudo a2enmod ssl # 以防万一
sudo a2enmod proxy # 以防万一
sudo a2enmod proxy_http # 以防万一
sudo a2enmod headers
sudo a2enmod rewrite
sudo systemctl restart apache2
  • 现在再次访问应该https会显示安全了,如果还是显示不安全可能是因为cookie、缓存什么没清理,你可以打开无痕模式来确认

总结

通过使用Let's Encrypt和Certbot,我们只需几条命令就能为网站配置专业级别的SSL证书,整个过程简单快捷。与传统的SSL证书相比,Let's Encrypt不仅免费,而且自动续期

这种方案特别适合个人开发者、小型网站和项目,比如我的mask.alcmaple.cn网站现在已经顺利启用了HTTPS,即使是前后端分离架构也能正常工作。


如果您在配置过程中遇到任何问题,欢迎在评论区留言讨论。

暂无评论

暂无评论,来添加第一条评论吧!