Nginx配置HTTPS安全证书

1、先说说Nginx-HTTPS加密技术

超文本传输安全协议(HTTPS)是以安全为目标的HTTP通道,简单来说就是HTTP安全版。https由两个部分组成:HTTP+SSL/TLS,在http基础上加上了一层加密信息模块,服务端和客户端的信息插损胡都会通过TLS进行加密,传输的数据都是加密后的数据。

为了解决HTTP协议的这些缺陷,需要使用另一种协议:HTTPS。为了数据传输的安全性,HTTPS在http的基础上加了SSL协议,SSL依靠证书验证身份,并为浏览器和服务器之间通信加密。

SSL证书是一种数字证书,使用Secure Socket Layer协议在浏览器和web服务器之间建立一条安全通道,从而实现数据信息在客户端和服务器之间的加密传输,保证双方传递信息的安全性,不可被第三方窃听,而且用户可以通过服务器证书验证所访问网站是否真实可靠。

加密的HTTPS和HTTP的区别:超文本传输协议HTTP协议被用于在web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的加密数据,如果攻击者截取了web浏览器和网站服务器之间的传输报文,就可以直接读取其中信息,因此,http协议不适合传输一些铭感信息。

HTTPS加密,解密,验证完成过程如图所示:
Nginx配置HTTPS安全证书_第1张图片
首先客户端发送请求,服务端接受到请求之后并申请生成公私秘钥,同时将公钥证书发送给客户端,客户端收到之后并通过TLS进行解析验证,如果证书没有问题就会在客户端生成一个加密随机值,将随机值发送给服务端,服务端接收到之后,用自己的私钥解密,从而得到这个随机值,然后通过这个随机值对内容进行对称加密。服务端将用私钥加密后的信息发送给客户端,最后,客户端用之前生成的私钥来解密服务器端发过来的信息,获取解密后的内容。

1)客户端向服务端发起HTTPS请求,用户在浏览器输入https网址,然后连接到Nginx server的443端口2)服务端采用https协议有一套数字证书,该证书可以自行配置,也可以向证书管理组织去申请,该证书其本质是公钥和私钥3)将公钥传送给客户端,证书包含了很多信息,例如,证书的颁发机构,过期时间等等4)客户端解析证书,由客户端的TLS完成,首先会验证公钥是否有效,比如颁发的机构,过期时间等,如果发生异常,则会弹出警告信息,提示证书存在问题,如果证书没有问题,就会随机生成数值,然后用证书对该随机数值进行加密5)将证书加密后的随机值传送到服务器,让服务器获取该随机值,后续客户端和服务端可以通过该随机值来进行加密解密6)服务端用私钥解密后,得到了客户端传过来的随机值,然后把内容通过该值进行了对称加密7)服务端将私钥加密后的信息发给客户端8)客户端用之前生成的私钥来解密服务端发送过来的信息,获取解密后的内容。

2、关于SSL证书

互联网的安全通信,是建立在SSL/TLS协议之上,SSL/TLS协议的基本思路是采用公钥加密法,也就是,客户端先向服务器端索取公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。通过这种加解密机制,可以保障所有信息都是加密传播,无法窃听,同时,传输具有校验机制,一旦信息被篡改,可以立刻发现,最后,通过身份证书机制,可以防止身份被冒充。由此可知,SSL证书主要有两个功能:加密和身份认证。
目前市面上的SSL证书都是通过第三方SSL证书机构颁发的,常见可靠的第三方 SSL证书颁发机构有DigiCert、GeoTrust、GlobalSign、Comodo等。

根据不同使用环境,SSL证书可分为如下几种:

企业级别:EV(Extended Validation)、OV(Organization Validation) ,个人级别:IV(Identity Validation)、DV(Domain Validation)。

其中 EV、OV、IV 需要付费,企业用户推荐使用EV或OV证书,个人用户推荐使用IV证书,DV证书虽有免费的可用,但它是最低端的SSL证书。它不显示单位名称,也不能证明网站的真实身份,只能验证域名所有权,仅起到加密传输信息的作用,适合个人网站或非电商网站。

3、使用OpenSSL生成私钥文件和CSR文件

Nginx配置HTTPS并不复杂,主要有两个步骤:签署第三方可信任的 SSL证书和配置 HTTPS,下面依次介绍。

要配置HTTPS需要用到一个私钥文件(以.key结尾)和一个证书文件(以.crt结尾) ,而证书文件是由第三方证书颁发机构签发的,要让第三方证书颁发机构签发证书文件,还需要给他们提供一个证书签署请求文件(以.csr结尾)。下面简单介绍下私钥文件和csr文件。

私钥文件:以.key结尾的一个文件,由证书申请者生成,它是证书申请者的私钥文件,和证书里面的公钥配对使用,在 HTTPS 握手通讯过程中需要使用私钥去解密客戶端发來的经过证书公钥加密的随机数信息,它是HTTPS加密通讯过程非常重要的文件,在配置HTTPS的時候要用到。CSR文件:CSR全称是Cerificate Signing Request,即证书签署请求文件,此文件里面包含申请者的DN(Distinguished Name,标识名)和公钥信息,此文件由证书申请者生成,同时需要提供给第三方证书颁发机构。证书颁发机构拿到CSR文件后,使用其根证书私钥对证书进行加密并生成CRT证书文件,CRT文件里面包含证书加密信息以及申请者的DN及公钥信息,最后,第三方证书颁发机构会将CRT文件发给证书申请者,这样就完成了证书文件的申请过程。

在申请SSL证书之前,证书申请者需要先生成一个私钥文件和一个CSR文件,可通过openssl命令来生成这两个文件,操作如下:

[root@iZ23sl33esbZ ~]# openssl req -new -newkey rsa:2048 -sha256 -nodes -out iivey.csr -keyout iivey.key -subj "/C=CN/ST=beijing/L=beijing/O=iivey Inc./OU=Web Security/CN=iivey.com"

上面这个命令会生成一个CRS文件iivey.csr和私钥文件iivey.key。其中,相关字段含义如下:

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

接着,将生成的CSR文件提供给CA机构,签署成功后,CA机构就会发给我们一个CRT证书文件,假定这个文件是iivey.crt,在获得SSL证书文件后,就可以在Nginx配置文件里配置HTTPS了。

4、Nginx下配置SSL证书

要开启HTTPS服务,其实就是在Nginx上开启一个443监听端口,下面是HTTPS服务在Nginx下的配置方式,这里仅列出了server段的配置:

server 
 { 
 listen 443; 
 server_name www.iivey.com; 
 index index.php index.html; 
 root /data/webhtdocs/iivey; 
 ssl                        on; 
 ssl_certificate                iivey.crt; 
 ssl_certificate_key            iivey.key; 
 ssl_prefer_server_ciphers  on; 
 ssl_protocols              TLSv1 TLSv1.1 TLSv1.2; 
 ssl_ciphers                HIGH:!aNULL:!MD5; 
 add_header X-Frame-Options DENY; 
 add_header X-Content-Type-Options nosniff; 
 add_header X-Xss-Protection 1; 
 }

简单介绍下上面每个配置选项的含义:

ssl_protocols:此指令用于启动特定的加密协议,这里设置为“TLSv1 TLSv1.1 TLSv1.2”,TLSv1.1与TLSv1.2要确保openssl版本大于等于openssl1.0.1 ,SSLv3也可以使用,但是有不少被攻击的漏洞,所以现在很少使用了。

5、验证HTTPS功能

Nginx的https配置完成后,需要测试下配置是否正常,这里提供两种方式,第一种方式是直接通过浏览器访问https服务,这里使用火狐浏览器进行测试,如果https配置正常的话,应该会直接打开页面,而不会出现如下界面:
Nginx配置HTTPS安全证书_第2张图片
出现这个界面,说明https没有配置成功,需要检查https配置是否正确。而在打开https页面后,可能还会出现一种情况,如下图所示:
Nginx配置HTTPS安全证书_第3张图片
这个现象是能够打开https界面,但是浏览器地址栏左边的小锁是灰色,并且有个黄色的感叹号,这说明这个网站的页面中可能引用了第三方网站的图片、js、css等资源文件,https认为页面有引用第三方网站资源的情况是不安全的,所以才出现了警告提示。解决这个问题很简单,将页面上所有引用第三方网站的资源文件下载到本地,然后通过本地路径进行引用即可。

修改所有资源文件到本地服务器后,再次通过https方式进行访问,浏览器地址栏左边的小锁自动变成绿色,并且感叹号消失,如下图所示:
Nginx配置HTTPS安全证书Nginx配置HTTPS安全证书
Nginx配置HTTPS安全证书_第4张图片
至此,nginx下配置https服务已经正常运行。

在浏览器下可以查看证书信息(证书厂商、证书机构、证书有效期等),点击浏览器地址栏的绿锁,选择查看证书,即可查看证书详细信息,如下图所示:
Nginx配置HTTPS安全证书_第5张图片
验证SSL证书状态还有另外一个方法,那就是通过提供的在线网站进行验证,读者可以通过https://myssl.com/网站或https://www.ssllabs.com/ssltest/网站进行在线测试,这些网站可以更详细的测试SSL证书的状态、安全性、兼容性等各方面的状态。

二 、部署支持 https 的 Nginx 服务

通过 Certbot 为 nginx 开启https支持。

环境

  • CentOS 7.1
  • python2.x(这玩意系统里本来就有)

安装Nginx

sudo yum install nginx -y顺手启动:sudo systemctl start nginx顺手设置开机启动:sudo systemctl enable nginx

嗯,就完成了。 至于配置文件,会在后面设置。

$ 配置https

此处我们使用 Let’s Encrypt 提供的证书。且为了方便设置,使用 Certbot 配置工具。

工具获得

  • 证书机构: Let’s Encrypt - https://letsencrypt.org
  • 配置工具: Certbot - https://certbot.eff.org/ 事实上,你根本用不到上面两个链接,我把它们写在这只是为了方便了解其他细节,顺便表示尊重。
    实际上我们可以直接通过包管理器获取 Certbot 工具。
首先需要安装 EPEL 源:
sudo yum install epel-release -y然后安装 Certbot :
sudo yum install python2-certbot-nginx -y

工具安装完成。

使用 Certbot

Certbot 使用命令行中的交互式配置,我们启动它,然后跟着指示一步一步完成就行。

一、 启动 Certbot

通过命令:
sudo certbot --nginx

二、 填写邮箱
在下述提示后,填写你的邮箱地址。Enter email address (used for urgent renewal and security notices) (Enter ‘c’ to cancel): [email protected]输入你的邮箱地址,回车确定。
三、 同意用户协议

下述提示提醒你阅读并同意用户协议之类的。Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf.
You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A输入字母 A 回车确定。

四、 请求分享你的邮箱

意思是他们会没事给你发发广告邮件。同意就是了 ╮(╯▽╰)╭Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y输入字母 Y 回车确定。

五、 指定域名

由于我们在安装nginx后没有配置站点,所以此处要求我们提供域名,配置工具会帮我们填写nginx的配置文件。No names were found in your configuration files. Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c' to cancel): www.xxxx.com xxx.xxxx.com输入你自己的域名(多个域名中间用空格隔开)回车确定。

六、 重定向

会询问你是不是要把所有http请求重定向到https。当然要了~Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1: No redirect - Make no further changes to the webserver configuration.2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. 
You can undo this change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2输入数字 2 回车确定。

七、 完成

此时配置已经完成。你可以在接下来的输出中找到如下段落:- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://www.xxxx.com and https://xxx.xxxx.comYou should test your configuration at:https://www.ssllabs.com/ssltest/analyze.html?d=www.xxxx.comhttps://www.ssllabs.com/ssltest/analyze.html?d=xxx.xxxx.com- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -意思就是你已经成功配置了 www.xxxx.com xxx.xxxx.com 两个域名(就是在 步骤五 输入的那两个,当然,你输入了多少个这里就会显示多少个)。并且你可以在 https://www.ssllabs.com/ 这个网站上测试域名的状态。

八、 证书过期

由于 Let’s Encrypt 的免费证书有效期是90天,所以你需要每80几天重新申请一次。

Certbot 可以通过简单的命令完成这个工作:

certbot renew

如果你还是觉得麻烦,可以把这个操作设为定时任务,每80几天运行一次,就可以高枕无忧了。

其他

支持https的nginx已经完全配置完成。

接下来把你的站点放在nginx的目录下就行,一般是 /usr/share/nginx/html 如果不是这里,你可以在nginx的配置文件里找到,配置文件位于 /etc/nginx/nginx.conf 。
在浏览器中打开站点,就能看到地址栏上的小绿锁了~

来源:http://www.cnblogs.com/heioray/p/9403246.html

在Linux Nginx配置HTTPS

一、公钥和私钥的获取
可以购买,可以自己生成,本文假设你已经有了公钥和私钥。
Nginx配置HTTPS安全证书_第6张图片
二、把SSL证书中的公钥和私钥放到服务器中的Nginx中
找到你需要配合HTTPS的服务器中的Nginx安装目录,把公钥和私钥文件放入到nginx/ssl中。
使用Mac时的命令如下:

scp -P 22 /Users/huangtao/Documents/temp/yimian.cer root@服务器IP:/usr/local/nginx/conf/ssl/
scp -P 22 /Users/huangtao/Documents/temp/yimian.key root@服务器IP:/usr/local/nginx/conf/ssl/

正常放入之后,服务器中的目录如下:

root@iZbp119shkcx0jsks7pb8nZ:/usr/local/nginx/conf# tree
.
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params
├── fastcgi_params.default
├── koi-utf
├── koi-win
├── mime.types
├── mime.types.default
├── nginx.conf
├── nginx.conf.default
├── scgi_params
├── scgi_params.default
├── ssl
│   ├── yimian.cer
│   └── yimian.key
├── uwsgi_params
├── uwsgi_params.default
└── win-utf

这里有一个插曲:
如果你是接手别人配置好的服务器,那么你首先需要找到服务器中的Nginx在哪。
通过find / -name "nginx"找出服务器中的nginx安装目录,有时候会发现有好几个地方有nginx,如下:
Nginx配置HTTPS安全证书_第7张图片
一般情况下是这样:
在/etc/nginx下的是通过yum或apt-get 安装的,其他目录下的应该是自己编译的nginx。我们需要确定的是目前服务器正在使用的是那个,不需要的最好是删除。
找到我们使用的Nginx目录,比如在/usr/local/nginx/,进入conf目录,把yimian.cer、yimian.key放入到ssl里面。

当然,如果服务器没有安装Nginx,那么直接安装下即可。

======安装nginx start=====
sudo apt-get update
sudo apt-get install nginx
======安装nginx end=====

三、配置Nginx中的nginx.conf文件
nginx.conf是nginx的主配置文件,我们可以在这个文件中添加配置(这个配置文件有大小限制),也可以新建一个配置文件,再在nginx.conf把新配置文件include进去。
例如,我们新建了一个配置文件yimian.conf,存放在/usr/local/nginx/sites-enabled/yimian.conf,那么在nginx.conf中就需要include进去,如下:

root@localhost:/usr/local/nginx/conf# cat nginx.conf 
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
    # multi_accept on;
}

http {
    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /usr/local/nginx/conf.d/*.conf;
    include /usr/local/nginx/sites-enabled/*;
}

注意最后的include /usr/local/nginx/sites-enabled/*;

回到我们要说的ssl配置,见yimian.conf配置文件:

root@localhost:/usr/local/nginx/sites-enabled# cat yimian.conf 
server {
    listen      80; 
    server_name  yimian.me www.yimian.me;  
    # if ( $scheme = http ){
    #     return 301 https://$server_name$request_uri;
    # } 
    access_log  /var/log/yimianme.access.log;
    error_log   /var/log/yimianme.error.log;  
    location / {  
        proxy_pass http://程序的服务器IP:程序的端口/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   
        proxy_set_header REMOTE_ADDR $remote_addr; 
        proxy_set_header RealIP $remote_addr; 
        proxy_set_header server_name $server_name;
        proxy_set_header host $host;
        proxy_set_header REQUEST_URI $request_uri;  
        proxy_http_version 1.1;
        proxy_read_timeout 600; 
        proxy_set_header Connection "";      
    } 
    error_page   500 502 503 504  /50x.html; 
    location = /50x.html {
        root   html;
    }
}
###################HTTPS##################
server {
    listen      443;
    server_name  yimian.me www.yimian.me;
    ssl on;
    ssl_certificate /usr/local/nginx/conf/ssl/yimian.cer;
    ssl_certificate_key /usr/local/nginx/conf/ssl/yimian.key;
    access_log  /var/log/yimianme.access.log;
    error_log   /var/log/yimianme.error.log;
    location / {
        proxy_pass http://程序的服务器IP:程序的端口/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE_ADDR $remote_addr;
        proxy_set_header RealIP $remote_addr;
        proxy_set_header server_name $server_name;
        proxy_set_header host $host;
        proxy_set_header REQUEST_URI $request_uri;
        proxy_http_version 1.1;
        proxy_read_timeout 600;
        proxy_set_header Connection "";
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

1、重点注意事项一
注释的内容是设置是否强制跳转到https

if ( $scheme = http ){
    return 301 https://$server_name$request_uri;
}

2、重点注意事项二
###################HTTPS##################中的内容是对应的公钥和私钥文件路径。

ssl_certificate /usr/local/nginx/conf/ssl/yimian.cer;
ssl_certificate_key /usr/local/nginx/conf/ssl/yimian.key;

3、重点注意事项三

proxy_pass对应的就是你这个域名真正要转发的IP地址。

proxy_pass http://程序的服务器IP:程序的端口/;

四、启动Nginx
至此,SSL已经配置完成,现在需要重启Nginx
重启

nginx -s reload

或Kill之后再启动

nginx -c /usr/local/nginx/conf/nginx.conf

检查启动结果

ps -ef | grep nginx

参考链接 :
部署支持 https 的 Nginx 服务 :https://mp.weixin.qq.com/s/a1XeMM-oSStTmv5mnbMsVA

Nginx配置HTTPS安全证书 :https://www.jianshu.com/p/a4c9cb42bcdb

在Linux Nginx配置HTTPS :https://www.jianshu.com/p/fdcf024717e1

你可能感兴趣的:(nginx)