Nginx配置并兼容HTTP实现代码解析


Posted in Servers onMarch 31, 2021

使用 OpenSSL 生成 SSL Key 和 CSR 文件

配置 HTTPS 要用到私钥 example.key 文件和 example.crt 证书文件,申请证书文件的时候要用到 example.csr 文件,OpenSSL 命令可以生成 example.key 文件和 example.csr 证书文件。

CSR:Cerificate Signing Request,证书签署请求文件,里面包含申请者的 DN(Distinguished Name,标识名)和公钥信息,在第三方证书颁发机构签署证书的时候需要提供。证书颁发机构拿到 CSR 后使用其根证书私钥对证书进行加密并生成 CRT 证书文件,里面包含证书加密信息以及申请者的 DN 及公钥信息

Key:证书申请者私钥文件,和证书里面的公钥配对使用,在 HTTPS 『握手』通讯过程需要使用私钥去解密客?舳朔?淼木??な楣?考用艿乃婊??畔ⅲ? HTTPS 加密通讯过程非常重要的文件,在配置 HTTPS 的?r候要用到

使用 OpenSSl命令可以在系统当前目录生成 example.key 和 example.csr 文件:

openssl req -new -newkey rsa:2048 -sha256 -nodes -out example_com.csr -keyout example_com.key -subj "/C=CN/ST=ShenZhen/L=ShenZhen/O=Example Inc./OU=Web Security/CN=example.com"

下面是上述命令相关字段含义:

  • C:Country ,单位所在国家,为两位数的国家缩写,如: CN 就是中国
  • ST 字段: State/Province ,单位所在州或省
  • L 字段: Locality ,单位所在城市 / 或县区
  • O 字段: Organization ,此网站的单位名称;
  • OU 字段: Organization Unit,下属部门名称;也常常用于显示其他证书相关信息,如证书类型,证书产品名称或身份验证类型或验证内容等;
  • CN 字段: Common Name ,网站的域名;

生成 csr 文件后,提供给 CA 机构,签署成功后,就会得到一?? example.crt 证书文件,SSL 证书文件获得后,就可以在 Nginx 配置文件里配置 HTTPS 了。

配置 HTTPS

基础配置

要开启 HTTPS 服务,在配置文件信息块(server block),必须使用监听命令 listen 的 ssl 参数和定义服务器证书文件和私钥文件,如下所示:

server {
  #ssl参数
  listen       443 ssl;
  server_name     example.com;
  #证书文件
  ssl_certificate   example.com.crt;
  #私钥文件
  ssl_certificate_key example.com.key;
  ssl_protocols    TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers     HIGH:!aNULL:!MD5;
  #...
}

证书文件会作为公用实体?送到每台连接到服务器的客?舳耍?皆课募?魑?踩?堤澹?Ω帽淮娣旁诰哂幸欢ㄈㄏ尴拗频哪柯嘉募??⒈V Nginx 主进程有存取权限。

私钥文件也有可能会和证书文件同放在一??文件中,如下面情?r:

ssl_certificate www.example.com.cert;
ssl_certificate_key www.example.com.cert;

这种情?r下,证书文件的的读取权限也应该加以限制,仅管证书和私钥存放在同一个文件里,但是只有证书会被发送到客?舳?/p>

命令 ssl_protocols 和 ssl_ciphers 可以用来限制连接只包含 SSL/TLS 的加??版本和算法,默认值如下:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;

由于这两个命令的默认值已经好几次发生了改变,因此不建议显性定义,除非有需要额外定义的值,如定义 D-H 算法:

#使用DH文件
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#定义算法
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
#...

HTTP强制转HTTPS

另外配置一个server块,监听80端口,再加上rewrite。

server { 
  listen 80;
  server_name 服务器ip;   
  rewrite ^(.*)$ https://$host$1 permanent; #http强制转https
}

server配置参考

server { 
  listen 80;
  server_name 服务器ip;   
  rewrite ^(.*)$ https://$host$1 permanent; #http强制转https
}
server {
  charset utf-8;       #服务器编码
  listen 443 ssl;      #监听地址
  server_name 服务器ip;  #证书绑定的网站域名
  server_tokens off;     #隐藏nginx版本号
  
  #ssl配置
  ssl_certificate  /etc/ssl/certs/nginx-selfsigned.crt; #证书公钥
  ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;  #证书私钥
  ssl_session_timeout 5m;
  ssl_ciphers SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers off;
  ssl_dhparam /etc/nginx/dhparams.pem;  

  #请求头
  add_header Strict?Transport?Security max?age=63072000;
  add_header X-Frame-Options SAMEORIGIN;
  add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
  add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block";
  add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
  add_header Set-Cookie "HttpOnly";
  add_header Set-Cookie "Secure";
  
  #请求方法限制
  ## Only allow these request methods ##
   if ($request_method !~ ^(GET|POST|DELETE|PUT|PATCH)$ ) {
     return 444;
   }
  
  #访问路径匹配
  location / {
    root /usr/share/nginx/html; #站点目录
      index index.html index.htm;
  }
  location /test/ {
     proxy_pass http://127.0.0.1:8100/; #转发本地端口8100
  }
 
  #禁止访问路径
  # location /dirdeny {
  #   deny all;
  #   return 403;
  #}

  #错误页面配置
  error_page  502 503 504 /error502.html;
    location = /error502.html{
    root /usr/share/nginx/html;
  }
  error_page  500 /error.html;
   location = /error.html{
      root /usr/share/nginx/html;
    }
  error_page  404 /notfind.html;
   location = /notfind.html{
      root /usr/share/nginx/html;
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Servers 相关文章推荐
nginx如何将http访问的网站改成https访问
Mar 31 Servers
win10安装配置nginx的过程
Mar 31 Servers
zabbix自定义监控nginx状态实现过程
Nov 01 Servers
CentOS7和8下安装Maven3.8.4
Apr 07 Servers
Mac电脑OS系统下安装Nginx的详细教程
Apr 14 Servers
详解Nginx的超时keeplive_timeout配置步骤
May 25 Servers
超越Nginx的Web服务器caddy优雅用法
Jun 21 Servers
服务器SVN搭建图文安装过程
Jun 21 Servers
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
Jun 25 Servers
腾讯云服务器部署前后分离项目之前端部署
Jun 28 Servers
vscode远程免密登入Linux服务器的配置方法
Jun 28 Servers
windows10 家庭版下FTP服务器搭建教程
Aug 05 Servers
基于Nginx实现限制某IP短时间访问次数
Mar 31 #Servers
Nginx tp3.2.3 404问题解决方案
Mar 31 #Servers
解决Nginx 配置 proxy_pass 后 返回404问题
nginx配置ssl实现https的方法示例
Mar 31 #Servers
Nginx解决前端访问资源跨域问题的方法详解
Mar 31 #Servers
nginx实现发布静态资源的方法
Nginx中break与last的区别详析
You might like
PHP 裁剪图片成固定大小代码方法
2009/09/09 PHP
php下保存远程图片到本地的办法
2010/08/08 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
摘自启点的main.js
2008/04/20 Javascript
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
jQuery版Tab标签切换
2011/03/16 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
全面解析node 表单的图片上传
2016/11/21 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
2019/05/12 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
Python程序中使用SQLAlchemy时出现乱码的解决方案
2015/04/24 Python
Python检测字符串中是否包含某字符集合中的字符
2015/05/21 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
解决python3中cv2读取中文路径的问题
2018/12/05 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
Pandas之Fillna填充缺失数据的方法
2019/06/25 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
Python内置函数locals和globals对比
2020/04/28 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
二手书店创业计划书
2014/01/16 职场文书
七年级历史教学反思
2014/02/05 职场文书
《小小竹排画中游》教学反思
2014/02/26 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
商业房地产广告语
2014/03/13 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
三八妇女节标语
2014/10/09 职场文书
安阳殷墟导游词
2015/02/10 职场文书
教师党员自我评价2015
2015/03/04 职场文书
2014年终个人总结报告
2015/03/09 职场文书
68句权威创业名言
2019/08/26 职场文书
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python