Nginx配置https及证书

Nginx配置https及证书

  • 1 证书
  • 2 nginx配置
  • 3 参数
  • 4 自定义证书
  • 5 nginx配置参数详解
  • 6 https工作流程
  • 7 https协议
  • 8 实现https的算法种类
  • 9 https简易工作流程
  • 10 什么是数字签名
    • 11 什么是CA
    • 12 什么是数字证书
    • 13 从CA方面签发证书的过程
    • 14 防止中间人攻击
    • 15 SSL证书类型

1 证书

之前我们使用的是自签名的SSL证书,对于浏览器来说是无效的。使用权威机构颁发的SSL证书浏览器才会认为是有效的,这里给大家推荐两种申请免费SSL证书的方法,一种是从阿里云申请,https://common-buy.aliyun.com/?spm=5176.2020520163.0.0.e8f856a74ReRXh&commodityCode=cas 链接地址
Nginx配置https及证书_第1张图片

另一种是从FreeSSL申请。
使用acme.sh自动申请证书
acme.sh脚本实现了acme协议, 可以从letsencrypt生成免费的证书。一般我们申请的证书有效期都是1年,过期就要重新申请了,使用acme.sh脚本可以实现到期自动申请,再也不用担心证书过期了!
Nginx配置https及证书_第2张图片

腾讯云申请
Nginx配置https及证书_第3张图片
Nginx配置https及证书_第4张图片
Nginx配置https及证书_第5张图片

2 nginx配置

server {
	 listen 80;
	 server_name www.domain.com ;
 	 rewrite ^(.*)$ https://$server_name$1 permanent;
 	 #rewrite ^(.*)$ https://$host$1; 
 	 # return 301 $scheme://$server_name$request_uri;
 	 #rewrite ^(.*)$ https://www.xxx.com$1;
	}

server {
        listen 443 ssl  http2;
        server_name www.domain.com;
        ssl_certificate /usr/local/key/1_www.domain.com_bundle.crt;  
        ssl_certificate_key /usr/local/key/2_www.domain.com.key;  
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; 
        ssl_prefer_server_ciphers on;
        location / {
            root   html; 
            index  index.html index.htm;
        }
    }
 
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
                expires      30d;
  }

location ~ .*\.(js|css)?$ {
                expires      12h;
 }   

注意
Nginx 1.15.0以上版本请使用listen 443 ssl代替listen 443和ssl on

–with-http_ssl_module

3 参数

SSL常用命令
1)ssl
该指令用来指定服务器开启HTTPS,可以使用 listen 443 ssl,后面这种方式更通用些
配置格式:
server{
listen 443 ssl;
}

2)ssl_certificate
为当前这个虚拟主机指定一个带有PEM格式证书的证书

3) ssl_certificate_key
该指令用来指定PEM secret key文件的路径

4) ssl_session_cache
该指令用来配置用于SSL会话的缓存

5) off
禁用会话缓存,客户端不得重复使用会话

6) none
禁止使用会话缓存,客户端可以重复使用,但是并没有在缓存中存储会话参数

7) builtin
内置OpenSSL缓存,仅在一个工作进程中使用

8)shared
所有工作进程之间共享缓存,缓存的相关信息用name和size来指定

9)ssl_session_timeout
开启SSL会话功能后,设置客户端能够反复使用储存在缓存中的会话参数时间

  1. ssl_ciphers
    指出允许的密码,密码指定为OpenSSL支持的格式(可以使用openssl ciphers查看openssl支持的格式)

ssl_prefer_server_ciphers
该指令指定是否服务器密码优先客户端密码

4 自定义证书

mkdir /root/cert
cd /root/cert
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Nginx配置https及证书_第6张图片
Nginx配置https及证书_第7张图片
Nginx配置https及证书_第8张图片

Nginx配置https及证书_第9张图片

5 nginx配置参数详解

 server{
        listen  443 ssl;                                      
        server_name ab.text.com ;              #指定域名(也可以是ip)多个域名用空格隔开

       ssl_certificate /opt/app/nginx/conf/cert/ngxdefault.crt;    #添加server.pem访问路劲(第一个证书文件路劲)        
        ssl_certificate_key /opt/app/nginx/conf/cert/ngxdefault.key;    #添加server.key访问路劲(第二个证书文件访问路劲)

        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";       #是一种加密算法
        ssl_protocols TLSv1.1 TLSv1.2;  #启用指定协议(使用哪种加密协议支持ssl版本)
        ssl_prefer_server_ciphers on;  #指定在使用SSLv3和TLS协议时,服务器密码应优先于客户端密码。)
        ssl_session_cache shared:SSL:10m;  #1m大约可以存储4000个TLS握手,当某个https连接在规定时间重连时,可以通过session_cahce重用TLS秘钥,也就是client只要发起一次http请求就可以再次进行连接。根据TLS通讯过程,如果你的https开启了session_cache,在第二步,server获取到client请求就会去读取session_cache文件,如果存在client的key就直接复用,进行数据传输。
                            设置存储会话参数的高速缓存的类型和大小。缓存可以是以下任何一种类型:
                            off
                            严禁使用会话缓存:nginx明确告诉客户端会话可能不会被重用。
                            none
                            会话缓存的使用被轻轻地禁止:nginx告诉客户端会话可能被重用,但实际上不会将会话参数存储在缓存中。


                            builtin
                            建立在OpenSSL中的缓存; 仅由一个工作进程使用。缓存大小在会话中指定。如果没有给出大小,则等于20480个会话。内置缓存的使用可能导致内存碎片。
                            shared
                            所有工作进程之间共享的缓存。缓存大小以字节为单位指定; 一兆字节可以存储大约4000个会话。每个共享缓存都应该有一个任意的名字。具有相同名称的缓存可以在多个虚拟服务器中使用。
                            两种缓存类型都可以同时使用,例如:
                            ssl_session_cache builtin:1000 shared:SSL:10m;
                            注意:但只使用没有内置缓存的共享缓存应该更有效率。
                            
        ssi on;    #服务器嵌套,主要是实现网站的内容更新,时间和日期的动态显示,以及执行shell和CGI脚本程序等复杂的功能。
        ssi_silent_errors on; #默认是off,开启后在处理SSI文件出错时不输出错误提示:”[an error occurred while processing the directive] ”
        #ssi_types #默认是支持ssi_types text/html 如果需要shtml支持,则需要设置:ssi_types text/shtml
        #适用于http,server,location等模块 
   }

6 https工作流程

Nginx配置https及证书_第10张图片

7 https协议

HTTP协议是由HTTP协议和SSL/TLS协议共同组建提供加密传输及身份验证的网络协议,信息传输是通过HTTP协议来完成,身份加密及验证是通过TLS协议来完成,其中对称加密及非对称加密都是属于TLS协议的算法。
目前主流TLS协议版本是TLS1.2,主推版本是TLS1.3,反正是TLS1.1,TLS1.2,TLS1.3共存。
TLS 1.3 是时隔九年对 TLS 1.2 等之前版本的新升级,也是迄今为止改动最大的一次。针对目前已知的安全威胁,IETF 正在制定 TLS 1.3 的新标准,使其有望成为有史以来最安全,但也最复杂的 TLS 协议。
简单来说TLS1.3无论在安全加密,数据传输方面完虐TLS1.2,不过现在还处于草案阶段,虽然被很多浏览器支持,但是不建议部署在生产服务上。

TLS的通讯过程
Nginx配置https及证书_第11张图片

8 实现https的算法种类

什么是对称加密?
    client 通过算法F根据秘钥A对数据进行加密,那么server端就可以通过算法F根据秘钥A对数据进行解密,整个加密解密过程都是使用一个私钥,所以被称为对称加密。
    根据算法规则,client跟server都是使用通过一个秘钥进行解密加密,如果秘钥被截取很容易造成数据泄露。
    同时如果服务端每次都针对不同的客户端存储一个私聊,当客户端数量庞大时,光服务器的存储的私钥都能造成server成本剧增。

什么是非对称加密?
    client向server请求公钥,对数据进行加密,在将加密的数据发送给server,然后server通过秘钥进行解密,得到原始数据,但是是加密是通过公钥,解密是通过私钥,整个加密解密过程,秘钥是不同的,熟称非对称加密。
    在整个非对称加密过程中,公钥及私钥都是server端的,基本保证数据由client传输到server是安全的,但是由server发向client的数据就不能使用公钥进行加密,所以这部分数据传输是不安全的。

 从对称加密及非对称加密的原理来看,单独的其中一个都没法满足要求,那么就结合2者的优势。

9 https简易工作流程

    总的思路:利用非对称加密的方式,使celient与server协商一个临时key,然后通过对称加密的方式将协商的key进行数据传输。
 
    1.client利用非对称加密的方式向server端获取公钥,并且server端会返回它公钥    #此时 server 存在一个公钥及私钥 client 存在 公钥
   
    2.client随机将数据A通过公钥进行加密为D1发给sever端
    3.server端通过私钥对D1进行解密得到数据A,并且与client进行协商,以A作为临时key进行数据传输。
    4.当整个数据传输完成,临时Key A 将被从服务器里删除。
 
    通过https的流程可以看出只要有公钥及私钥就可以实现安全传输,从原理上分析是没有问题的,
但是存在个问题,如果在中间插入第三者A,那么对于client而言,A就是server,那么怎么能最大限度的避免这个问题了?
    那就需要引入数字签名的概念了。

10 什么是数字签名

    B1现在手上有2把要是,分别是公钥及私钥。然后分别把公钥送给了B2,B3,B4。
 
    现在B2决定给B1写一份私密性,并且使用公钥进行加密,这个时候,也只有B1通过私钥进行解密才能得到信的内容。
 
    B1看到信的内容后,决定在回一封信,但是需保证B2拿到的信是完整的,那就对信的摘要进行哈希运算,
得带一个值 就是 "数字签名",然后将这个值(签名)使用私钥进行加密,最后将数字签名,信一起发给B2.
 
    B2收到B1的信后,获取信件及数字签名。然后使用公钥对信的摘要进行解密,在进行哈希运算,
如果跟B1发送的一样,则信没有被修改,是完整的,在通过协商的私钥对信的内容进行解密,得到信的内容。
 
   在B1给信使用哈希运算及使用私钥加密的过程就叫数字签名。

11 什么是CA

CA是颁发证书的权威机构,主要功能是负责证书签发,证书认证,证书管理。

12 什么是数字证书

    数字证书主要是用来认证公钥持有者的身份合法的电子文档,已防止第三方冒充。
    数字证书是由CA机构颁发的证书,包含证书颁发机构名称,有效期限,证书的公钥,证书的主题,签名所使用的算
    法,准确来说是由PKI体系规范了证书内容。
    当然一般的数字证书都是要钱的,同时在阿里云,腾讯云也可以申请单域名的数字证书,这个是免费的,名额有限。

13 从CA方面签发证书的过程

    签发过程:
    (CA)
        1.服务机构向CA申请ssl证书,需提供一些相关证书验证信息,申请的证书级别不同需要验证的证书信息就不同,费用也不同,比如
        在腾讯云申请免费的ssl证书,只需提供域名及对应的邮箱。
        2.CA机构对你的提供的信息进行验证,验证成功过后,生成ssl证书。当前证书只包含你申请的一些信息,例如:证书签发人,签发地
        址,签发时间,有效期,证书持有者基本信息
        3.CA使用hash算法对证书进行计算,得到一个hash值,称呼为 数字摘要(也叫数字指纹),这个hash算法也叫指纹算法。
        4.CA机构通过自己的私钥对数字摘要,指纹算法进行加密,形成数字签名。
        5.CA机构将数字签名+数字证书+元数据组合一起,形成一个 有签名的数字证书
        5.然后将数字证书+服务机构私钥+CSR文件打包发送给服务机构。

    验证证书:
    (client)
        1.当client向server端发起https请求时,server会将CA机构颁布的证书文件+数字签名发送给client。
        2.客服端通过内置信任的CA机构公钥对数字前面进行解密
        3.然后采取同样的算法对证书进行哈希运算,得到哈希值,如果与发过来的摘要一样,代表证书是可信的,只要证书的任意值被修改,
        hash值就会变化。
        4.验证通过后,client就可以跟server进行正常的https请求流程了。
    注:在整个过程中,CA的公钥是内置在浏览器或者操作系统的,主要用来解密数字签名。而服务器的公钥是存在ssl证书里的,主要用于
    秘钥协商。

14 防止中间人攻击

    那就得靠这个CA签发的数字签名,因为CA机构的私钥就只有他自己,而别人没有的,如果中间人对证书传输的证书进行修改,在进行
    加密,client就算利用中间人的公钥进行解密,也会发现数字签名的哈希值不对等,因此判定证书被修改。
    hash算法可以保证值的唯一性,不可修改性,只要文件的一个字符出现变化,hash值也会随之出现变化,当然也不是绝地安全的,根据
    hash算法的不同,可以定义不同安全的级别。

15 SSL证书类型

一般来说SSL证书分为3类,分别是域名型(DV)SSL证书,企业型(OV)SSL证书,增强型(EV)SSL证书。

域名型SLL证书又称DV 证书,安全等级一般,证书颁布机构只要验证网站的真实性即可颁布此证书保护网站,进行网站重要信息加密,一般用于软件下载站。

企业型SSL证书又称OV 证书,安全等级高于DV证书,申请者需要填写一些组织机构资料提交于证书颁布机构,经过通过证书颁布机构严格审核,方可颁布。在整个过程中,证书机构不仅要确定网站的真实性,还要对您提交资料信息的准确性进行多方查验,均没问题方可通过,适合用于电商类型网站。

增强型SSL证书又称EV证书,安全等级最高,申请条件更复杂,验证流程更多,并且使用增强型SSL证书的网站,在网址前端会变成绿色,很好辨认,一般用于银行证券等机构。

你可能感兴趣的:(中间件,nginx)