Nginx配置https原理及实现过程详解


Posted in Servers onMarch 31, 2021

使用linux实用工具certbot来生成https证书

这个工具是生成Let's Encrypt证书,

Let's Encrypt数字证书认证机构,Let's Encrypt 是由互联网安全研究小组(ISRG,一个公益组织)提供的服务

提供免费的SSL/TLS证书

2015年12月3日,该服务进入公测阶段,正式面向公众。

2016年4月12日,该项目正式离开Beta阶段。

到2016年9月9日,Let's Encrypt 已经发放 1000 万张证书。

因此对于大部分中小型网站来说,是一个值得考虑的选择。

https配置的步骤

1打开 https://certbot.eff.org/ 选择对应操作系统与 Web 服务器

这里我选择nginx服务器,CentOS7服务器上

2执行命令,并根据需要修改相应域名参数。

certbot要通过yum安装,certbot被打包到epel源中,

所以安装启动epel库,安装epel源查看链接

https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F

启动epel源,可以使用手动自己启动epel,也可以借助yum-config-manager命令来启动

安装yum-config-manager

yum -y install yum-utils

启动epel

yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional

3安装certbot

sudo yum install certbot python2-certbot-nginx

获取证书的两种方式:身份验证器和安装程序

使用webRoot插件进行安装,这个要求你的服务器80端口能够正常被访问到(这个域名是属于你的)

webRoot插件通过certonly和--webroot(或者-w)在命令行上执行命令

certbot certonly -w /var/www/example -d www.example.com

certbot certonly -w 可以被http访问到的webroot目录 -d 要配置https的域名名称

上面的 /var/www/example表示的是在nginx配置文件中root根节点所指向的根路径

webroot插件的工作原理是为每个请求的域创建一个临时文件${webroot-path}/.well-known/acme-challenge。

然后,Let的加密验证服务器发出HTTP请求,以验证每个请求的域的DNS是否解析为运行certbot的服务器。

访问请求如下

66.133.109.36 - - [05/Jan/2016:20:11:24 -0500] "GET /.well-known/acme-challenge/HGr8U1IeTW4kY_Z6UIyaakzOkyQgPr_7ArlLgtZE8SX HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"

所以我们服务器需要放通.well-known/acme-challenge这个访问路径

例如,

server
  {
    listen 80;
    server_name www.example.com; 
    index index.html ;
    root /var/www/example;
  
    。。。
  
    location ~ /.well-known {
      allow all;
    }
  }

具体的http配置文件

server
  {
    listen 80;
    server_name www.example.com; 
    index index.html ;
    root /var/www/www.example.com;


    location / {
      proxy_redirect off;
      proxy_pass http://localhost:8080;
      proxy_set_header Host $host;
      proxy_set_header  X-real-ip $remote_addr;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    #error_page  404  /404.html;

    location /nginx_status
    {
      #stub_status on;
      #access_log  off;
    }

    location ~ /.well-known {
      allow all;
    }

    location ~ /\.
    {
      deny all;
    }
access_log /data/log/nginx//var/www/www.example.com/-access.log;
    error_log /data/log/nginx//var/www/www.example.com/-error.log;
}

执行完命令后,https证书就会生成在/etc/letsencrypt/live目录下

certbot certonly -w /var/www/example -d www.example.com

比如上面的命令会生成证书/etc/letsencrypt/live/www.example.com/fullchain.pem

生成证书密钥文件/etc/letsencrypt/live/www.example.com/privkey.pem

然后我们只需要为该域名加上https配置,我们nginx就配置完成https

https对应443端口

具体https配置文件

server
  {
    listen 443 ssl http2;
    #listen [::]:443 ssl http2;
    server_name www.example.com;
    index index.html index.htm index.php default.html default.htm default.php;
    root /var/www/www.example.com/;
    
    ssl on;
    ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
    
   location / {
      proxy_redirect off;
      proxy_pass http://localhost:8080;
      proxy_set_header Host $host;
      proxy_set_header  X-real-ip $remote_addr;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    #error_page  404  /404.html;

    include enable-php-pathinfo.conf;

    location ~ /.well-known {
      allow all;
    }

    location ~ /\.
    {
      deny all;
    }

    access_log /data/log/nginx/www.example.com-ssl-access.log;
    error_log /data/log/nginx/www.example.com-ssl-error.logs;  
}

查看生产的证书

tree /etc/letsencrypt/live/

证书续签

Let's Encrypt 生成的免费证书为3个月时间,但是我们可以无限次续签证书

certbot renew

使用定时器来自动重新生成证书

0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew

centos6使用

1获取certbot客户端

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

2停止nginx

service nginx stop

3生成证书

./certbot-auto certonly --standalone --email `你的邮箱地址` -d `你的域名地址`

当前网站有多个域名时需在后面增加,例如

./certbot-auto certonly --standalone --email `你的邮箱地址` -d `你的域名1` -d `你的域名2`

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

Servers 相关文章推荐
Apache站点配置SSL强制跳转443
Mar 09 Servers
Nginx解决403 forbidden的完整步骤
Apr 01 Servers
Nginx 根据URL带的参数转发的实现
Apr 01 Servers
Nginx下SSL证书安装部署步骤介绍
Dec 06 Servers
nginx负载功能+nfs服务器功能解析
Feb 28 Servers
Windows Server 2008 修改远程登录端口以及配置防火墙
Apr 28 Servers
KVM基础命令详解
Apr 30 Servers
tomcat下部署jenkins的方法
May 06 Servers
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
Jun 01 Servers
基于docker安装zabbix的详细教程
Jun 05 Servers
CentOS7环境下MySQL8常用命令小结
Jun 10 Servers
码云(gitee)通过git自动同步到阿里云服务器
Dec 24 Servers
如何在centos上使用yum安装rabbitmq-server
Mar 31 #Servers
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
阿里云Nginx配置https实现域名访问项目(图文教程)
详解Nginx 工作原理
fastdfs+nginx集群搭建的实现
Nginx域名转发https访问的实现
Mar 31 #Servers
Nginx本地目录映射实现代码实例
Mar 31 #Servers
You might like
谈谈PHP的输入输出流
2007/02/14 PHP
php array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
PHP 中文处理技巧
2010/04/25 PHP
php数字游戏 计算24算法
2012/06/10 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
Gambit vs CL BO3 第三场 2.13
2021/03/10 DOTA
JS URL传中文参数引发的乱码问题
2009/09/02 Javascript
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
js数组去重的常用方法总结
2014/01/24 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
全面了解JavaScript对象进阶
2016/07/19 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
2016/08/11 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
基于代数方程库Algebra.js解二元一次方程功能示例
2017/06/09 Javascript
原生JS实现自定义滚动条效果
2020/10/27 Javascript
AngularJS实现图片上传和预览功能的方法分析
2017/11/08 Javascript
基于vue中对鼠标划过事件的处理方式详解
2018/08/22 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
Python重新引入被覆盖的自带function
2014/07/16 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
对python:threading.Thread类的使用方法详解
2019/01/31 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
python输出pdf文档的实例
2020/02/13 Python
Python3.x+pyqtgraph实现数据可视化教程
2020/03/14 Python
python中round函数如何使用
2020/06/19 Python
PyQt中使用QtSql连接MySql数据库的方法
2020/07/28 Python
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
英文版餐饮业求职信
2013/10/18 职场文书
网络工程专业自荐信范文
2014/03/16 职场文书
校长师德表现自我评价
2015/03/04 职场文书
2016年春节问候语
2015/11/11 职场文书