nginx配置https及nginx安全配置
nginx 的主要配置
转发 http 请求到 https
server {
listen 80 default_server;
listen [::]:80 default_server;
# 配置访问80http重定向到443的https,如果想开放80可以不配置
rewrite ^(.*)$ https://$host$1 permanent;
}
nginx 配置 https 单向认证
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
# SSL configuration
# 服务器证书的绝对路径
ssl_certificate /etc/nginx/certs/server.crt;
# 服务器私钥的绝对路径
ssl_certificate_key /etc/nginx/certs/server.key;
# enable session resumption to improve https performance
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;
}
没钱的打工人只能自签证书
以下步骤需要自行安装 openssl 工具
HTTPS 自签发 CA 证书并实现网站可信
遇到 iOS 13 与 macOS 10.15 不支持自签证书
一键生成自签证书和私钥
openssl req -out cert.crt -new -newkey rsa:2048 -nodes -keyout cert.key -x509 -days 3650 -subj "/C=[国家或地区]/ST=[省/市/自治区]/L=[所在地]/O=[组织]/OU=[组织单位]/CN=[常用名称]"
自签证书缺点是浏览器不认识该证书,所以会显示网站不安全,想解决此问题,就到 OA 机构签发证书,比如Let's Encrypt
nginx 的安全配置
参考:最安全的 nginx 配置 在 http 或者 server 模块添加就可
# 防止BEAST攻击
ssl_prefer_server_ciphers on;
# 开启HSTS(HTTP Strict Transport Security),强制https跳转
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
# 不要在错误页面和服务器头中发送nginx版本号
server_tokens off;
# 不允许浏览器在框架或iframe中呈现页面,防止点击劫持
add_header X-Frame-Options SAMEORIGIN;
# 防止content-type嗅探
add_header X-Content-Type-Options nosniff;
# xss过滤
add_header X-XSS-Protection "1; mode=block";
# 内容安全策略CSP
add_header Content-Security-Policy "default-src 'self';";
openssl 生成证书和私钥的脚本
domain=$1
echo "domain: $1"
if [ -z "$1" ]; then
echo "domain empty, exiting..."
exit 1
fi
filename=${domain/\*/[]}
if [ ! -f "ca.key" ]; then
echo "CA not exist, ready to create..."
# ca.key私钥
openssl genrsa -out ca.key 2048
# ca.csr生成签发请求
openssl req -new -key ca.key -out ca.csr -sha256 -subj "/C=CN/ST=BeiJing/L=BeiJing/O=CA/OU=CA/CN=$domain"
# ca.crt根证书
echo "basicConstraints=CA:TRUE">ca.ext
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt -extfile ca.ext -sha256 -days 825
fi
echo "generating server cert..."
# 制作服务端、客户端私钥
openssl genrsa -out server.pem 2048
openssl rsa -in server.pem -out server.key
openssl genrsa -out client.pem 2048
openssl rsa -in client.pem -out client.key
# ca生成签发请求
openssl req -new -key server.pem -out server.csr -sha256 -subj "/C=CN/ST=BeiJing/L=BeiJing/O=SEserverLF/OU=server/CN=$domain"
openssl req -new -key client.pem -out client.csr -sha256 -subj "/C=CN/ST=BeiJing/L=BeiJing/O=client/OU=client/CN=$domain"
echo "authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage=serverAuth,OCSPSigning
subjectAltName=@alt_names
[alt_names]
DNS.1=$domain
DNS.2=*.$domain">server.ext
# 签发证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -extfile server.ext -sha256 -days 824
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -sha256 -days 824
echo "done"
使用方式,保存为 ca.sh,然后执行:
sh ca.sh test.com
# 使用浏览器访问时,需要生成p12格式的客户端证书
# 生成过程中需要自定义客户端证书的密码
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
文件描述
- ca.crt 根证书
- ca.key CA 私钥
- client.crt 客户端证书
- client.key 客户端私钥
- client.p12 使用浏览器访问时,需要生成 p12 格式的客户端证书
- server.crt 服务端证书
- server.crt 服务端私钥
- *.csr 签发请求
nginx 配置 https 双向认证
# 配置https双向认证的主要配置
listen 443 ssl;
server_name hostName;
server_tokens off;
ssl on;
ssl_certificate server.crt; # server证书公钥
ssl_certificate_key server.key; # server私钥
ssl_client_certificate ca.crt; # 根级证书公钥,用于验证各个二级client
ssl_verify_client on; # 开启客户端证书验证
https 双向认证测试
# 命令行Curl测试
curl --insecure --key client.key --cert client.crt hostName
# 收到网页信息则成功
# 浏览器访问测试
把client.p12导入到浏览器的https配置中,访问站点建立连接的时候nginx会要求客户端把这个证书发给自己验证,如果没有这个证书就拒绝访问。