网站部署(四):最简单的 SSL 配置
前言
在上一篇文章中,我们详细讨论了如何修复现有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-apache2. 自动获取并配置证书
这是最简单也是最核心的一步,只需一条命令:
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,即使是前后端分离架构也能正常工作。
如果您在配置过程中遇到任何问题,欢迎在评论区留言讨论。

暂无评论