目录
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
...................
如果公司没有通用域名,那就有多少个域名,有多少套证书,配置方法跟上面的一样,配置文件指定不同的证书即可




