📢 HTTP 和 HTTPS
🌍 1. HTTP (超文本传输协议)
🎯 作用:
- 基础协议: HTTP 是互联网上用于传输网页(HTML 文件)和其他资源的基础协议。
⚙️ 特点:
-
明文传输: HTTP 传输的数据都是未加密的,任何人都可以抓取和查看传输的数据。
-
无状态: HTTP 协议本身不保留之前的请求信息,也就是说每次的请求都是独立的。
🏞 使用场景:
-
简单页面浏览: 对于不需要加密或身份验证的静态页面,HTTP 通常足够使用。
-
开始阶段的开发和测试: 在开发和测试的初始阶段,开发者可能会先使用 HTTP,待网站完善后再迁移到 HTTPS。
🔐 2. HTTPS (超文本传输安全协议)
🎯 作用:
-
安全传输: HTTPS 使用 SSL/TLS 协议对传输的数据进行加密,保护数据的隐私和完整性。
-
身份验证: HTTPS 还验证了网站的身份,这意味着用户可以确信他们与正确的网站服务器进行通信。
⚙️ 特点:
-
加密传输: 通过 SSL/TLS 加密,确保数据在传输过程中的机密性和完整性。
-
身份验证: 证书机构签发的证书验证了网站的身份,减少了中间人攻击的风险。
-
完整性校验: 确保数据在传输过程中没有被篡改。
-
性能开销: 由于加密和解密的需要,HTTPS 会带来一些性能开销,但随着现代技术的发展,这种开销已经大大减少。
🏞 使用场景:
-
电子商务网站: 用于处理付款和敏感用户信息。
-
登录页面: 任何要求用户输入用户名和密码的页面。
-
银行和金融机构: 在线银行、股票交易和其他金融服务。
-
政府和官方网站: 提供公民服务和处理敏感信息。
-
医疗服务: 处理患者数据和其他敏感健康信息。
-
任何关心隐私和数据完整性的网站。
🔍 3. HTTP 与 HTTPS 的主要区别
-
安全性: HTTP 是明文传输,HTTPS 提供了加密传输。
-
端口: 默认情况下,HTTP 使用端口 80,而 HTTPS 使用端口 443。
-
证书: HTTPS 需要使用 SSL 证书。
-
URL 前缀: HTTP 网址以
http://
开头,而 HTTPS 网址以https://
开头。 -
性能: 由于加密的开销,HTTPS 在早期被认为比 HTTP 慢。但随着技术的进步和现代服务器的优化,这种差异已经变得微不足道。
📌 总结: 虽然 HTTP 在某些不涉及敏感信息的场景中仍然有其适用之处,但鉴于现代对隐私和安全的关注,强烈建议尽可能使用 HTTPS。多数现代浏览器也都会为 HTTP 网站显示警告,提示用户其不安全性。
🌐 4. HTTPS vs SSL/TLS
当我们探讨网络安全时,HTTPS 和 SSL/TLS 经常被提及。这些技术都致力于确保网络连接的安全,但它们在实际应用中是如何互相作用的呢?
🔒 HTTPS (超文本传输安全协议)
-
📜 定义: HTTPS 是 HTTP 的安全版,通过 SSL/TLS 进行数据加密。
-
🛠️ 工作原理: 在客户端(如浏览器)与服务器之间建立 HTTPS 连接时,会进行一个“握手”过程,协商加密细节,确保连接的安全。
-
🌍 使用场景: 适用于所有涉及敏感信息的在线交互,如电子商务、网银、登录页面等。
-
🔗 URL 前缀: 以
https://
开头。
🔐 SSL/TLS (安全套接层/传输层安全)
-
📜 定义: SSL 和 TLS 是加密协议,保护网络数据的安全性和完整性。TLS 实际上是 SSL 的新版本,但由于历史原因,“SSL”这个名称仍然被广泛使用。
-
🛠️ 工作原理: 通过证书和密钥对数据进行加密。在“握手”过程中,它们会协商一个加密套件,确定连接的加密算法和密钥。
-
🌍 使用场景: 除 HTTPS 外,SSL/TLS 也用于其他协议和应用,如 SMTPS (安全的电子邮件)、FTPS (安全的文件传输) 等。
🔗 两者之间的联系:
-
HTTPS 实际上是在 HTTP 上加上了 SSL/TLS 的加密层,可以这么理解:HTTPS = HTTP + SSL/TLS。
-
SSL/TLS 为 HTTPS 提供了所需的加密和安全机制。
🔎 主要区别:
-
应用层次: HTTPS 是应用协议,而 SSL/TLS 是加密协议。HTTPS 在应用层工作,SSL/TLS 在传输层工作。
-
范围: HTTPS 主要用于加密 HTTP 连接,而 SSL/TLS 可用于多种协议。
-
证书: SSL/TLS 需要使用证书来验证服务器身份,这些证书常与 HTTPS 一起被提及,作为互联网上安全通信的标准方式。
📍 结论: 在网络安全中,HTTPS 和 SSL/TLS 是密切关联的。HTTPS 利用 SSL/TLS 来确保加密连接的安全,保护数据的隐私和完整性。
🛡️ 配置 Nginx SSL 连接
为了增强安全性并确保用户数据的隐私,您应确保 Nginx 服务与 SSL 连接一起使用。以下是为 Nginx 配置 SSL 连接的详细步骤:
📜 1. 获取 SSL 证书和私钥
您可以选择从认证机构 (CA) 购买证书,或使用如 Let’s Encrypt 的工具来免费生成证书。
特点 | CA 购买的证书 | Let’s Encrypt 的证书 |
---|---|---|
成本 | 根据证书类型和颁发机构的不同,价格可能会有很大差异。 | 完全免费。 |
验证级别 | 提供 DV、OV 和 EV 证书。 | 仅提供 DV 证书。 |
证书有效期 | 通常为 1-2 年。 | 90 天,需要定期续订。 |
支持和信誉 | 提供付费支持,可能因其历史和品牌而享有更高的信誉。 | 提供社区支持,但可能不提供传统的商业支持。 |
证书类型 | 提供通配符证书、多域名证书和 EV 证书。 | 支持通配符和多域名证书,但不支持 EV 证书。 |
管理和续订 | 通常需要手动管理和续订。 | 可以与 certbot 或其他自动化工具结合使用,自动续订。 |
适用场合 | 适合大型企业、需要 EV 证书的组织或需要特定的支持和服务等级的场合。 | 适用于个人网站、中小型项目或预算受限且不需要 EV 或特定 CA 品牌认证的项目。 |
-
尽管 Let’s Encrypt 证书是免费的,但您需要注意以下几点:
- 有效期:Let’s Encrypt 的证书有效期为 90 天,这意味着您需要每 90 天续订一次。虽然这可能听起来有些频繁,但这是为了提高安全性。
- 自动化:由于证书的有效期相对较短,建议使用自动化工具(如 certbot)进行自动续订,以确保证书始终是最新的。
- 限制:Let’s Encrypt 对其服务有一些使用限制,例如一定时间内可以颁发的证书数量和子域名数量等。这是为了防止滥用和确保服务的可靠性。
🔍 示例:
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
此命令会为您的域名自动生成证书和私钥,并将它们存储在 /etc/letsencrypt/live/yourdomain.com/
目录中。
🔧 2. 配置 Nginx
打开您的 Nginx 配置文件,这通常位于 /etc/nginx/sites-available/default
或 /etc/nginx/nginx.conf
:
🔍 示例:
在使用此配置文件之前,请确保已经为您的域名获取了 SSL 证书,并将证书和密钥的路径正确填写在配置文件中。此外,还需要确保 Nginx 有权访问证书、密钥和网站根目录。
# 用户和工作进程设置
user nginx;
worker_processes auto; # 根据可用的 CPU 核心自动设置
# 错误日志的路径和日志级别
error_log /var/log/nginx/error.log warn;
# pid 文件的路径
pid /var/run/nginx.pid;
# 事件模块设置
events {
worker_connections 1024; # 单个工作进程的最大连接数
}
# HTTP 服务器配置
http {
# MIME 类型设置
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式和访问日志路径
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
# 优化设置
sendfile on;
keepalive_timeout 65;
gzip on; # 启用 gzip 压缩
# 默认 HTTP 服务器配置块
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
# 将所有 HTTP 请求重定向到 HTTPS
location / {
return 301 https://$host$request_uri;
}
}
# HTTPS 服务器配置块
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
# SSL 证书和密钥设置
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# SSL 协议和加密套件设置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
# 网站根目录和默认文件设置
root /var/www/html;
index index.html index.htm;
# 默认 location 设置
location / {
try_files $uri $uri/ =404;
}
# 其他 location 设置,例如代理、API 路由等,可以在此添加
}
# 其他可能的 server 块或全局设置可以在此添加
}
🔄 3. 重启 Nginx
保存您的配置并重新启动 Nginx,以应用新的 SSL 设置。
🔍 示例:
sudo nginx -t
sudo systemctl restart nginx
🧪 4. 测试 SSL 配置
完成配置后,您应当测试 SSL 设置以确保一切正常:
-
🌐 使用浏览器访问
https://yourdomain.com
,检查是否出现绿色的锁标志来验证连接的安全性。 -
🔍 使用 SSL Labs 的 SSL 服务器测试 进行深度检查。只需输入您的域名,测试工具会为您提供关于 SSL 配置的详细信息和评分。
🛠️ 使用 HTTP 基本身份验证限制访问
📦 1. 安装必要的工具
首先,您需要一个工具来生成密码文件。apache2-utils
提供了这样的工具。
sudo apt-get install apache2-utils # 对于 Ubuntu/Debian
sudo yum install httpd-tools # 对于 CentOS
🔐 2. 创建密码文件
使用 htpasswd
工具来为用户生成一个密码并存储在文件中。
sudo htpasswd -c /etc/nginx/.htpasswd username
要为其他用户添加更多条目,请省略 -c
选项:
sudo htpasswd /etc/nginx/.htpasswd another_username
确保文件包含配对的用户名和加密密码:
$ cat /etc/apache2/.htpasswd
🖥 3. Nginx 配置
在您的 Nginx 配置中,指定需要身份验证的区域。
user nginx;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 访问和错误日志路径
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
# 这将帮助减少缓冲区溢出攻击的可能性
client_max_body_size 10M;
client_body_buffer_size 128k;
# 为客户端设置超时时间
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
# 压缩配置
gzip on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
gzip_disable "MSIE [1-6]\.";
server {
listen 80;
server_name yourdomain.com;
# 将所有请求记录到这个日志
access_log /var/log/nginx/yourdomain_access.log main;
# 定义文档根目录
root /var/www/yourdomain;
location / {
index index.html;
}
location /protected/ {
auth_basic "Admin Login"; # 这是身份验证提示
auth_basic_user_file /etc/nginx/.htpasswd; # 这是密码文件的位置
# 如果您有特定的处理或应用程序运行在这个路径下,您可以在这里添加
}
# 错误页面定义
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
/var/www/yourdomain
包含您的站点文件,包括一个名为index.html
的默认首页。/var/log/nginx/
路径存在,以便存储日志文件。- 如果您使用的不是默认的 Nginx 用户(通常为
nginx
或www-data
),请确保更新user
指令。 - 如果您使用的不是默认的 Nginx 配置文件路径,请确保正确地包含其他所需的配置文件或指令。
- 使用
sudo nginx -t
命令检查配置的正确性,并使用sudo systemctl reload nginx
或sudo service nginx reload
重新加载配置。
🔄 4. 重新加载 Nginx
应用配置更改需要重新加载 Nginx。
sudo systemctl reload nginx
🧪 5. 测试您的配置
-
🌐 使用浏览器访问:打开您的浏览器,然后导航至您的受密码保护的区域,例如
http://yourdomain.com/protected/
。 -
🔐 输入凭据:您应该看到一个身份验证对话框,提示您输入用户名和密码。使用之前在
.htpasswd
文件中定义的凭据登录。 -
🔍 检查访问:一旦您输入正确的凭据,您应该能够访问受保护的内容。如果您尝试使用错误的凭据,您将再次被提示输入。
-
📝 记录检查:为了进一步验证,您可以查看
/var/log/nginx/yourdomain_access.log
,以确保您的访问请求已被记录。
-
🚫 注意安全性
虽然 HTTP 基本认证为您的内容提供了一层保护,但请注意,此方法在传输中并不加密用户名和密码。攻击者可以在不安全的网络中轻松捕获这些凭据。
为了保证安全性:
-
🔒 始终使用 HTTPS:使用 SSL/TLS 为您的站点启用 HTTPS,确保所有传输的数据(包括认证凭据)都经过加密。
-
🔄 定期更新密码:定期更改存储在
.htpasswd
文件中的密码,以减少被破解的风险。 -
🚷 限制尝试次数:考虑使用其他 Nginx 模块或防火墙规则,限制连续失败的登录尝试,以防止暴力破解攻击。
-
🔒 使用 Nginx 防盗链
🛡️ 1. 修改 Nginx 配置
打开您的 Nginx 配置文件,通常位于 /etc/nginx/nginx.conf
或 /etc/nginx/sites-available/yourdomain.com
。
🖥️ 2. 定位 server 块
在 server
块内部,您可以为特定的资源类型(如图片、视频等)配置防盗链规则。
🔒 3. 添加防盗链配置
例如,为了防止图片被盗链,您可以使用以下配置:
location ~ \.(jpg|jpeg|png|gif)$ {
valid_referers none blocked yourdomain.com *.yourdomain.com;
if ($invalid_referer) {
return 403;
}
root /path/to/your/images;
}
解释:
location ~ \.(jpg|jpeg|png|gif)$
: 这会匹配所有.jpg
,.jpeg
,.png
, 和.gif
图片。valid_referers
: 这定义了哪些引用者是有效的。none
: 表示直接访问。blocked
: 表示没有发送引用头的访问。yourdomain.com
和*.yourdomain.com
: 仅允许来自这些域的请求。
♻️ 4. 保存并重启 Nginx
保存您的配置更改,然后重启 Nginx 以应用更改:
sudo nginx -s reload
🧪 5. 测试配置
测试方法:
-
直接访问: 直接访问一个图片 URL,确保您可以看到它。例如:
http://yourdomain.com/images/test.jpg
-
使用外部网站测试: 创建一个外部网站或在线 HTML 编辑器,尝试从该站点链接到您的图片。您应该得到一个 403 错误。
例如,在外部网站上,您可以尝试以下 HTML 代码:
<img src="http://yourdomain.com/images/test.jpg" alt="Test Image">
访问此外部网站,您应该无法看到从 yourdomain.com
链接的图片。
- 检查来自允许的域的链接: 在
yourdomain.com
或其子域上创建一个页面,链接到该图片。访问该页面,您应该能够正常查看图片。