以下操作版本为Ubuntu2004,文件位置可能略有不同
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.客户端解密信息:
客户端用之前生成的私钥获解密服务端传递过来的数据,由于数据一直是加密的,因此即使第三方获取到数据
也无法知道其详细内容。
htpps配置参数
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;
#为指定的虚拟主机配置是否启用ssl功能,此功能在1.15.0废弃,使用listen [ssl]替代
listen 443 ssl;
ssl_certificate /path/to/file;
#指向包含当前虚拟主机和CA的两个证书信息的文件,一般是crt文件
ssl_certificate_key /path/to/file;
#当前虚拟主机使用的私钥文件,一般是key文件
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
#支持ssl协议版本,早期为ssl现在是TLS,默认为后三个
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
自签名证书
包安装的配置文件路径为 /usr/lib/ssl/certs
在这个目录下还有一些其他文件,如果觉得不方便可以单独创建一个文件夹存放
mkdir /apps/nginx -p
自签名CA证书
root@ubuntu2004:/usr/lib/ssl/certs# openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 3650 -out ca.crt
Generating a RSA private key
................................................................................................................................................................................................................................................++++
........++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN #国家代码
State or Province Name (full name) [Some-State]:ZheJiang #省份
Locality Name (eg, city) []:HangZhou 城市名称
Organization Name (eg, company) [Internet Widgits Pty Ltd]:chinaunicom #公司
Organizational Unit Name (eg, section) []:chinacloud #部门
Common Name (e.g. server FQDN or YOUR name) []:ca.chinacloud.org #通用名称
Email Address []:15131416@163.com 邮箱
自制key和csr文件
root@ubuntu2004:/usr/lib/ssl/certs# openssl req -newkey rsa:4096 -nodes -sha256 -keyout chinacloud.key -out chinacloud.csr
Generating a RSA private key
.......................................................................++++
...............++++
writing new private key to 'chinacloud.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:ZheJiang
Locality Name (eg, city) []:HangZhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:chinaunicom
Organizational Unit Name (eg, section) []:chinacloud
Common Name (e.g. server FQDN or YOUR name) []:ca.chinacloud.org
Email Address []:15131416@163.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:123456
将生成的这4个文件移动到刚才创建的nginx目录下
mv ca.crt ca.key chinacloud.key chinacloud.csr /apps/nginx/
签发证书
移动完文件后,要到对应的目录下进行操作
最后的这个名称属于自定义名称,如果主机未设置域名,直接使用IP地址也是可以的
root@ubuntu2004:/apps/nginx# openssl x509 -req -days 3650 -in chinacloud.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out www.chinacloud.org
Signature ok
subject=C = CN, ST = ZheJiang, L = HangZhou, O = chinaunicom, OU = chinacloud, CN = ca.chinacloud.org, emailAddress = 15131416@163.com
Getting CA Private Key
合并CA和服务器证书成一个文件,注意服务器证书在前
root@ubuntu2004:/apps/nginx# ll
total 32
drwxr-xr-x 2 root root 4096 7月 3 17:23 ./
drwxr-xr-x 4 root root 4096 7月 3 17:06 ../
-rw-r--r-- 1 root root 2175 7月 3 17:10 ca.crt
-rw------- 1 root root 3272 7月 3 17:08 ca.key
-rw-r--r-- 1 root root 41 7月 3 17:23 ca.srl
-rw-r--r-- 1 root root 1830 7月 3 17:17 chinacloud.csr
-rw------- 1 root root 3272 7月 3 17:15 chinacloud.key
-rw-r--r-- 1 root root 2053 7月 3 17:23 www.chinacloud.org
root@ubuntu2004:/apps/nginx# cat www.chinacloud.org ca.crt > www.chinacloud.org.pem
https配置
server {
listen 80;
listen 443 ssl;
ssl_certificate /apps/nginx/www.chinacloud.org.pem;
ssl_certificate_key /apps/nginx/chinacloud.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 30m;
}
重启nginx并访问验证
访问成功