暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

03-Nginx ssl配置

运维之旅 2021-02-27
403

目录

  • Nginx  ssl配置

1.https功能

Web⽹站的登录⻚⾯都是使⽤https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三⽅获取,所以很多银⾏⽹站或电⼦邮箱等等安全级别较⾼的服务都会采⽤HTTPS协议,HTTPS其实是有两部分组成:HTTP + SSL TLS,也就是在HTTP上⼜加了⼀层处理加密信息的模块。服务端和客⼾端的信息传输都会通过TLS进⾏加密,所以传输的数据都是加密后的数据。

https 实现过程如下:

1.客⼾端发起HTTPS请求:客⼾端访问某个web端的https地址,⼀般都是443端⼝

2.服务端的配置:采⽤https协议的服务器必须要有⼀套证书,可以通过⼀些组织申请,也可以⾃⼰制作,⽬前国内很多⽹站都⾃⼰做的, 当你访问⼀个⽹站的时候提⽰证书不可信任就表⽰证书是⾃⼰做的,证书就是⼀个公钥和私钥匙,就像⼀把锁和钥匙,正常情况下只有你的钥匙可以打开你的锁,你可以把这个送给别⼈让他锁住⼀个箱⼦,⾥⾯放满了钱或秘密,别⼈不知道⾥⾯放了什么⽽且别⼈也打不开,只有你的钥匙是可以打开的。

3.传送证书:服务端给客⼾端传递证书,其实就是公钥,⾥⾯包含了很多信息,例如证书得到颁发机构、过期时间等等。

4.客⼾端解析证书:这部分⼯作是由客⼾端完成的,⾸先会验证公钥的有效性,⽐如颁发机构、过期时间等等,如果发现异常则会弹出⼀个警告框提⽰证书可能存在问题,如果证书没有问题就⽣成⼀个随机值,然后⽤证书对该随机值进⾏加密,就像2步骤所说把随机值锁起来,不让别⼈看到。

5.传送4步骤的加密数据:就是将⽤证书加密后的随机值传递给服务器,⽬的就是为了让服务器得到这个随机值,以后客⼾端和服务端的通信就可以通过这个随机值进⾏加密解密了。

6.服务端解密信息:服务端⽤私钥解密5步骤加密后的随机值之后,得到了客⼾端传过来的随机值(私钥),然后把内容通过该值进⾏对称加 密,对称加密就是将信息和私钥通过算法混合在⼀起,这样除⾮你知道私钥,不然是⽆法获取其内部的内容,⽽正好客⼾端和服务端都知道这个私钥,所以只要机密算法够复杂就可以保证数据的安全性。

7.传输加密后的信息: 服务端将⽤私钥加密后的数据传递给客⼾端,在客⼾端可以被还原出原数据内容。

8.客⼾端解密信息:客⼾端⽤之前⽣成的私钥获解密服务端传递过来的数据,由于数据⼀直是加密的,因此即使第三⽅获取到数据也⽆法知道其详细内容。

5.1.ssl 配置参数

nginx 的https 功能基于模块ngx_http_ssl_module实现,因此如果是编译安装的nginx要使⽤参数 ngx_http_ssl_module开启ssl功能,但是作为nginx的核⼼功能,yum安装的nginx默认就是开启的,编译安装的 nginx需要指定编译参数--with-http_ssl_module开启,

官⽅⽂档:https://nginx.org/en/docs/http/ngx_http_ssl_ module.html

配置参数如下:

ssl on | off;
listen 443 ssl;
#为指定的虚拟主机配置是否启⽤ssl功能,此功能在1.15.0废弃,使⽤listen [ssl]替代。

ssl_certificate /path/to/file;
#当前虚拟主机使⽤使⽤的公钥⽂件,⼀般是crt⽂件

ssl_certificate_key /path/to/file;
#当前虚拟主机使⽤的私钥⽂件,⼀般是key⽂件

ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
#⽀持ssl协议版本,早期为ssl,现在是TSL,默认为后三个

ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
#配置ssl缓存
off: 关闭缓存
none: 通知客⼾端⽀持ssl session cache,但实际不⽀持
builtin[:size]:使⽤OpenSSL内建缓存,为每worker进程私有
[shared:name:size]:在各worker之间使⽤⼀个共享的缓存,需要定义⼀个缓存名称和缓存空间⼤⼩,⼀兆
可以存储4000个会话信息,多个虚拟主机可以使⽤相同的缓存名称。

ssl_session_timeout time;
#客⼾端连接可以复⽤ssl session cache中缓存的有效时⻓,默认5m

一般来说,我们的证书都是从签发机构购买的

1.2.自签证书

#1.⾃签名CA证书
[root@nginx ~]# cd /apps/nginx/
[root@nginx nginx]# mkdir certs
[root@nginx nginx]# cd certs/
[root@nginx nginx]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 3650 -out ca.crt        #⾃签名CA证书
Generating a 4096 bit RSA private key
.................++
.....
Country Name (2 letter code) [XX]:CN #国家代码,https://country-code.cl/
State or Province Name (full name) []:GuangZhou #省份
Locality Name (eg, city) [Default City]:GuangZhou #城市名称
Organization Name (eg, company) [Default Company Ltd]:hcf.Ltd #公司名称  (颁发者组织)
Organizational Unit Name (eg, section) []:yunwei #部⻔ (颁发者单位)
Common Name (eg, your name or your server's hostname) []:hcf.ca #通⽤名称(颁发者一般名称)
Email Address []:xxxxxxx@qq.com #邮箱

[root@nginx certs]# ll
total 8
-rw-r--r-- 1 root root 2106 Feb 19 18:26 ca.crt
-rw-r--r-- 1 root root 3272 Feb 19 18:26 ca.key

#
2.⾃制key和csr⽂件
[root@nginx certs]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout www.zwyw.com.key -out www.zwyw.com.csr 
Generating a 4096 bit RSA private key
........................................................................++
......
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:GuangZhou
Locality Name (eg, city) [Default City]:GuangZhou
Organization Name (eg, company) [Default Company Ltd]:hyzs.Ltd  # 颁发给组织
Organizational Unit Name (eg, section) []:zwyunwei   # 颁发给组织单位
Common Name (eg, your name or your server's hostname) []: mo  # 写域名www.zwyw.com
Email Address []:xxxxxx@qq.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:     # 不加密,空
An optional company name []: 
[root@s2 certs]# ll
total 16
-rw-r--r-- 1 root root 2106 Feb 19 18:26 ca.crt
-rw-r--r-- 1 root root 3272 Feb 19 18:26 ca.key
-rw-r--r-- 1 root root 1736 Feb 19 18:28 www.zwyw.com.csr
-rw-r--r-- 1 root root 3272 Feb 19 18:28 www.zwyw.com.key

#
 3.签发证书
[root@nginx certs]# openssl x509 -req -days 3650 -in www.zwyw.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out www.zwyw.com.crt
Signature ok
subject=/C=CN/ST=GuangZhou/L=GuangZhou/O=hyzs.Ltd/OU=zwyunwei/CN=mo/emailAddress=123@qq.com
Getting CA Private Key

#
 ll
total 24
-rw-r--r-- 1 root root 2106 Feb 19 18:26 ca.crt
-rw-r--r-- 1 root root 3272 Feb 19 18:26 ca.key
-rw-r--r-- 1 root root   17 Feb 19 18:28 ca.srl
-rw-r--r-- 1 root root 1980 Feb 19 18:28 www.zwyw.com.crt
-rw-r--r-- 1 root root 1736 Feb 19 18:28 www.zwyw.com.csr
-rw-r--r-- 1 root root 3272 Feb 19 18:28 www.zwyw.com.key

#验证证书内容
# openssl x509 -in www.zwyw.com.crt -noout -text
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            ac:91:af:b8:8f:92:ed:77
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=GuangZhou, L=GuangZhou, O=hcf.Ltd, OU=yunwei, CN=hcf.ca/emailAddress=xxxxxxx@qq.com
        Validity
            Not Before: Feb 19 10:28:44 2021 GMT
            Not After : Feb 17 10:28:44 2031 GMT
        Subject: C=CN, ST=GuangZhou, L=GuangZhou, O=hyzs.Ltd, OU=zwyunwei, CN=mo/emailAddress=123@qq.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)

1.3.Nginx证书配置

listen 80;
listen 443 ssl;
ssl_certificate /apps/nginx/certs/www.zwyw.com.crt;
ssl_certificate_key /apps/nginx/certs/www.zwyw.com.key;
ssl_session_cache shared:sslcache:20m;  # 可以不配置,1m可以存储4000个会话信息
ssl_session_timeout 10m;  # 可以不配置,默认5m

# 配置完成后,需要reload或者重启Nginx

1.4.实现多域名HTTPS


Nginx⽀持基于单个IP实现多域名的功能,并且还⽀持单IP多域名的基础之上实现HTTPS,其实是基于Nginx的
SNI(Server Name Indication)功能实现,SNI是为了解决⼀个Nginx服务器内使⽤⼀个IP绑定多个域名和证书的
功能,其具体功能是客⼾端在连接到服务器建⽴SSL链接之前先发送要访问站点的域名(Hostname),这样服务
器再根据这个域名返回给客⼾端⼀个合适的证书。  

一般情况下,公司会买通用域名,例如买一个*.zwyw.com的泛域名证书,所有配置文件都指定这套证书

无论我们域名怎样,都可以使用通用证书:

www.zwyw.com

wiki.zwyw.com

...................

如果公司没有通用域名,那就有多少个域名,有多少套证书,配置方法跟上面的一样,配置文件指定不同的证书即可


文章转载自运维之旅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论