nginx搭建https服务器
搭建https服务器一般需要向ca机构申请证书,内网测试的话可以自签证书,访问的时候忽略浏览器警告即可。
自签证书
- 创建独立站点使用有密码的网站证书私钥文件的自签证书:
openssl genrsa -aes256 -passout pass:111111 -out /usr/local/nginx/ssl/hexo_test_com.key 2048
openssl req -new -x509 -nodes -out /usr/local/nginx/ssl/hexo_dicfin_com.pem -passin pass:111111 -key /usr/local/nginx/ssl/hexo_test_com.key -days 3650
# 根据提示依次填写:CN、Anhui、Hefei、test、devops、test.com、test@test.com
- 保存私钥密码:
echo "111111" >> /usr/local/nginx/ssl/hexo_test_com.pass
- 创建自签客户端证书
openssl req -new -x509 -nodes -out /usr/local/nginx/ssl/client.pem -keyout /usr/local/nginx/ssl/client.key -days 3650
# 根据提示依次填写:CN、Anhui、Hefei、test、devops、test.com、test@test.com
- 转换客户端证书为可被浏览器导入的pkcs12格式
openssl pkcs12 -export -clcerts -in /usr/local/nginx/ssl/client.pem -inkey /usr/local/nginx/ssl/client.key -out /usr/local/nginx/ssl/client.p12
# 提示输密码,可填写“111111”
阿里云申请证书
自行查看阿里云控制台的操作手册。
配置https站点
server {
listen 443 ssl;
server_name hexo.test.com
tcp_nodelay on;
gzip_static always;
gunzip on;
gunzip_buffers 16 8k;
gzip_proxied expired no-cache no-store private auth;
gzip on;
gzip_min_length 1k;
gzip_comp_level 3;
gzip_types text/plain application/x-javascript
text/css application/xml text/javascript
application/x-httpd-php image/jpeg
image/gif image/png;
gzip_vary on;
charset utf-8;
root /home/nodejs/public/;
index index.html;
ssl_certificate ../ssl/hexo_test_com.pem;
ssl_certificate_key ../ssl/hexo_test_com.key;
ssl_password_file ../ssl/hexo_test_com.pass;
}
- 测试:
nginx -t
- 重加载:
nginx -s reload
- 打开浏览器访问
https://hexo.test.com
配置密钥交换算法
使用自签证书存在一个问题,如果私钥文件泄露可能会导致中间人攻击,所以需要配置密钥交换算法,保证通信双方可以安全地交换密钥,即便密钥泄露,第三方也无法推算出会话密钥。
- 生成DH参数文件:
openssl dhparam -out /usr/local/nginx/ssl/dhparam.pem 2048
- 编辑配置文件:
ssl_certificate ../ssl/hexo_test_com.pem;
ssl_certificate_key ../ssl/hexo_test_com.key;
ssl_password_file ../ssl/hexo_test_com.pass;
ssl_dhparam ../ssl/dhparam.pem;
ssl_ecdh_curve auto;
https会话缓存
建立https连接会占用一定资源,为加快HTTPS建立连接的速度,TLS协议使用了会话缓存机制。
会话缓存机制可以使已经断开连接的HTTPS会话重用之前的协商会话继续HTTPS数据传输。
会话缓存机制有两种实现方式:会话编号和会话凭证。下面以会话凭证的方式作为示例。
- 生成会话凭证密钥文件:
openssl rand 80 > /usr/local/nginx/ssl/session_ticket.key
- 编辑配置文件:
# 会话缓存存储大小为10MB
ssl_session_cache shared:SSL:10m;
# 以会话凭证机制实现会话缓存
ssl_session_tickets off;
# 会话缓存超时时间为10分钟
ssl_session_timeout 10m;
# 会话缓存密钥文件
ssl_session_ticket_key ../ssl/session_ticket.key;
配置示例
server {
listen 80;
server_name hexo.test.com;
# 强制使用https
rewrite ^(.*)$ https://$host$1? permanent;
}
server {
listen 443 ssl;
server_name hexo.test.com
# nodelay置为on时,数据包立即发送,适用于延时敏感的场景。置为off时,数据在缓冲中达到一定的量才会发送。
tcp_nodelay on;
gzip_static always;
gunzip on;
gunzip_buffers 16 8k;
gzip_proxied expired no-cache no-store private auth;
gzip on;
gzip_min_length 1k;
gzip_comp_level 3;
gzip_types text/plain application/x-javascript
text/css application/xml text/javascript
application/x-httpd-php image/jpeg
image/gif image/png;
gzip_vary on;
charset utf-8;
root /home/nodejs/public/;
index index.html;
ssl_certificate ../ssl/hexo_test_com.pem;
ssl_certificate_key ../ssl/hexo_test_com.key;
ssl_password_file ../ssl/hexo_test_com.pass;
ssl_dhparam ../ssl/dhparam.pem;
ssl_ecdh_curve auto;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_session_timeout 10m;
ssl_session_ticket_key ../ssl/session_ticket.key;
# 启用HSTS
add_header Strict-Transport-Security "max-age=6307200; includeSubDomains; preload";
# 禁止被嵌入框架
add_header X-Frame-Options DENY;
# XSS跨站防护
add_header X-XSS-Protection "1; mode=block";
# 防止在浏览器中的MIME类型混淆攻击
add_header X-Content-Type-Options nosniff;
}
本文来自博客园,作者:花酒锄作田,转载请注明原文链接:https://www.cnblogs.com/XY-Heruo/p/15157677.html