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搭建图片服务器的过程详解(root和alias的区别)
Mar 31 Servers
教你快速开启Apache SkyWalking的自监控
Apr 25 Servers
Apache Hudi数据布局黑科技降低一半查询时间
Mar 31 Servers
Minikube搭建Kubernetes集群
Mar 31 Servers
Kubernetes控制节点的部署
Apr 01 Servers
在Docker容器中部署SQL Server
Apr 11 Servers
CentOS安装Nginx并部署vue
Apr 12 Servers
Nginx反向代理、重定向
Apr 13 Servers
Windows Server 2012配置DNS服务器的方法
Apr 29 Servers
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
Apr 29 Servers
win server2012 r2服务器共享文件夹如何设置
Jun 21 Servers
使用 DataAnt 监控 Apache APISIX的原理解析
Jul 07 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
自己做矿石收音机
2021/03/02 无线电
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
2019/05/31 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
javascript 动态添加表格行
2006/06/22 Javascript
Jquery实现无刷新DropDownList联动实现代码
2010/03/08 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
2013/05/30 Javascript
jquery 淡入淡出效果的简单实现
2014/02/07 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
2015/06/01 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
2015/12/25 Javascript
两种方法解决javascript url post 特殊字符转义 + & #
2016/04/13 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
2016/11/16 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
微信小程序实现的五星评价功能示例
2019/04/25 Javascript
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
学习python处理python编码问题
2011/03/13 Python
python做量化投资系列之比特币初始配置
2018/01/23 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
python的dataframe和matrix的互换方法
2018/04/11 Python
python程序封装为win32服务的方法
2021/03/07 Python
Python 获取windows桌面路径的5种方法小结
2019/07/15 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
出纳岗位职责
2013/11/09 职场文书
运动会入场解说词300字
2014/01/25 职场文书
演讲稿的写法
2014/05/19 职场文书