文章目录
- [Linux自建证书并配置Nginx HTTPS](#Linux自建证书并配置Nginx HTTPS)
-
- [1. 准备工作](#1. 准备工作)
- [2. 安装必要的工具](#2. 安装必要的工具)
- [3. 自建证书脚本](#3. 自建证书脚本)
-
- [3.1 创建CA根证书(可选,用于自签名证书链)](#3.1 创建CA根证书(可选,用于自签名证书链))
- [3.2 创建服务器证书脚本](#3.2 创建服务器证书脚本)
- [4. 证书文件说明](#4. 证书文件说明)
- [5. 配置Nginx使用HTTPS](#5. 配置Nginx使用HTTPS)
-
- [5.1 创建证书存放目录](#5.1 创建证书存放目录)
- [5.2 配置Nginx站点](#5.2 配置Nginx站点)
- [5.3 启用站点配置](#5.3 启用站点配置)
- [5.4 测试Nginx配置](#5.4 测试Nginx配置)
- [6. 客户端安装CA证书(可选)](#6. 客户端安装CA证书(可选))
- [7. 验证HTTPS配置](#7. 验证HTTPS配置)
- [8. 自动续期脚本(可选)](#8. 自动续期脚本(可选))
- [9. 常见问题解决](#9. 常见问题解决)
-
- [9.1 浏览器不信任证书](#9.1 浏览器不信任证书)
- [9.2 Nginx启动失败](#9.2 Nginx启动失败)
- [9.3 混合内容警告](#9.3 混合内容警告)
- [10. 安全建议](#10. 安全建议)
Linux自建证书并配置Nginx HTTPS
1. 准备工作
在开始之前,请确保:
- 已安装Linux服务器(本指南以Ubuntu/Debian为例)
- 已安装Nginx
- 拥有root或sudo权限
- 服务器已开放443端口(HTTPS默认端口)
2. 安装必要的工具
bash
sudo apt update
sudo apt install -y nginx openssl
3. 自建证书脚本
3.1 创建CA根证书(可选,用于自签名证书链)
bash
#!/bin/bash
# 创建CA私钥
openssl genrsa -out ca.key 2048
# 创建CA根证书
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=YourOrg/OU=IT/CN=YourOrg Root CA"
3.2 创建服务器证书脚本
bash
#!/bin/bash
DOMAIN="yourdomain.com" # 替换为你的域名
EMAIL="admin@yourdomain.com" # 替换为你的邮箱
# 创建私钥
openssl genrsa -out $DOMAIN.key 2048
# 创建证书签名请求(CSR)
openssl req -new -key $DOMAIN.key -out $DOMAIN.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=YourOrg/OU=IT/CN=$DOMAIN"
# 创建扩展配置文件
cat > $DOMAIN.ext << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = $DOMAIN
DNS.2 = www.$DOMAIN
EOF
# 使用CA签发证书(如果是自签名,使用下面的命令)
openssl x509 -req -in $DOMAIN.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out $DOMAIN.crt -days 365 -sha256 -extfile $DOMAIN.ext
# 如果是完全自签名证书(没有CA),使用这个命令替代上面的
# openssl x509 -req -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt -days 365 -sha256 -extfile $DOMAIN.ext
将上述脚本保存为create_cert.sh
,然后执行:
bash
chmod +x create_cert.sh
./create_cert.sh
4. 证书文件说明
执行完成后,你会得到以下文件:
ca.key
- CA私钥(如果创建了CA)ca.crt
- CA根证书(如果创建了CA)yourdomain.com.key
- 服务器私钥yourdomain.com.csr
- 证书签名请求(可删除)yourdomain.com.crt
- 服务器证书yourdomain.com.ext
- 扩展配置文件(可删除)
5. 配置Nginx使用HTTPS
5.1 创建证书存放目录
bash
sudo mkdir -p /etc/nginx/ssl
sudo cp yourdomain.com.crt /etc/nginx/ssl/
sudo cp yourdomain.com.key /etc/nginx/ssl/
sudo chmod 600 /etc/nginx/ssl/*
5.2 配置Nginx站点
编辑或创建Nginx配置文件:
bash
sudo nano /etc/nginx/sites-available/yourdomain.com
添加以下内容:
nginx
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
# SSL配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 启用HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 其他配置
root /var/www/yourdomain.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 其他location配置...
}
5.3 启用站点配置
bash
sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
5.4 测试Nginx配置
bash
sudo nginx -t
如果没有错误,重新加载Nginx:
bash
sudo systemctl reload nginx
6. 客户端安装CA证书(可选)
如果你使用了自建的CA根证书,需要在客户端安装ca.crt
以信任你的自签名证书:
Windows:
- 双击
ca.crt
文件 - 选择"安装证书"
- 选择"本地计算机"
- 选择"将所有证书放入下列存储",浏览选择"受信任的根证书颁发机构"
- 完成安装
Linux:
bash
sudo cp ca.crt /usr/local/share/ca-certificates/yourorg-ca.crt
sudo update-ca-certificates
macOS:
- 双击
ca.crt
文件 - 在钥匙串访问中,找到该证书
- 右键选择"获取信息"
- 在"信任"部分,将"使用此证书时"设置为"始终信任"
7. 验证HTTPS配置
-
使用浏览器访问
https://yourdomain.com
,检查是否能够正常访问(可能会有安全警告,因为使用的是自签名证书) -
使用命令行验证:
bashcurl -vI https://yourdomain.com
8. 自动续期脚本(可选)
由于自签名证书通常有效期较短,可以设置一个自动续期脚本:
bash
#!/bin/bash
# 续期证书脚本
DOMAIN="yourdomain.com"
CERT_DIR="/etc/nginx/ssl"
SCRIPT_DIR="/path/to/your/script"
# 备份旧证书
cp $CERT_DIR/$DOMAIN.crt $CERT_DIR/$DOMAIN.crt.bak
cp $CERT_DIR/$DOMAIN.key $CERT_DIR/$DOMAIN.key.bak
# 生成新证书
cd $SCRIPT_DIR
./create_cert.sh
# 复制新证书
cp $DOMAIN.crt $CERT_DIR/
cp $DOMAIN.key $CERT_DIR/
# 重新加载Nginx
systemctl reload nginx
# 记录日志
echo "$(date): Certificate renewed for $DOMAIN" >> /var/log/cert_renewal.log
然后添加到crontab中每月执行一次:
bash
sudo crontab -e
添加以下行:
0 0 1 * * /path/to/renew_cert.sh
9. 常见问题解决
9.1 浏览器不信任证书
- 确保已安装CA根证书(如果使用了CA)
- 检查证书是否过期
- 确保证书中的域名与访问的域名完全匹配
9.2 Nginx启动失败
- 使用
sudo nginx -t
检查配置语法 - 检查证书文件路径是否正确
- 确保证书文件权限正确(nginx用户可读)
9.3 混合内容警告
- 确保网页中所有资源(图片、CSS、JS等)都使用HTTPS链接
- 可以使用内容安全策略(CSP)来强制HTTPS
10. 安全建议
- 定期更换私钥和证书(建议每3-6个月)
- 保持私钥的机密性(权限设置为600)
- 考虑使用Let's Encrypt等免费CA获取浏览器信任的证书
- 启用OCSP Stapling以提高性能和安全
- 定期检查SSL配置的安全性(可以使用SSL Labs测试)
通过以上步骤,你已经成功在Linux服务器上创建了自签名证书,并为Nginx配置了HTTPS。对于生产环境,建议考虑使用受信任的CA颁发的证书(如Let's Encrypt)以获得更好的兼容性。