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 证书并实现网站可信

HTTPS 自签发 CA 证书

遇到 iOS 13 与 macOS 10.15 不支持自签证书

新版自签名 CA 证书生成

一键生成自签证书和私钥

 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会要求客户端把这个证书发给自己验证,如果没有这个证书就拒绝访问。

Published under  on .

Last updated on .

pipihua

我是皮皮花,一个前后端通吃的前端攻城狮,如果感觉不错欢迎点击小心心♥(ˆ◡ˆԅ) star on GitHub!