nginx系列基础(7)---SSL安全协议(https请求)
SSL/TLS通用模型
SSl(Secure Sockets layer)现在我们通常使用TLS(Transport Layer Security)

应用层是http协议,也是七层中的协议,而我们的SSL/TLS在表示层做的安全加密。在TCP没有感知的情况下完成了加密
TLS安全密码套件

密钥交换:是为了解决浏览器和服务器之间独立生成密码,并且最后生成的密钥是相同的。
身份验证:在密码生成的过程中,各自双方需要去验证双方的身份,而这个验证是需要一个算法的
对称加密算法、强度、分组模式:接下来我们需要数据加密、解密、通讯的时候,我们需要用到对称加密算法。AES表示,AES算法 128表示使用其中的128位的强度 GCM表示使用GCM分布模式,它可以提高多核心CUP下加密和解密的性能
签名hash算法:用来把不定长度的字符串生成固定长度的更短的一个摘要。
加密解读
-
对称加密

Bob和Alice两人共同持有一把密钥,Bob可以把原始文档通过这把密钥加密,生成密文文档,发送给Alice。
Alice拿到加密文档以后可以使用这把密钥把加密文档重新转换为原始文档。 -
非对称加密

Alice会先生成两把密钥,一把公钥,一把私钥。公钥提供给Bob,而私钥自己保留。
Bob向Alice发送加密文档是,使用Alice提供的公钥将原始文档进行加密,生成加密文档,发送给Alice。
Alice拿到文档后使用给Bob公钥所对应的那个私钥进行解密,就可以还原原始文档了。同样Alice可以使用私钥把原始文档加密,发送给Bob,Bob可以使用公钥把Alice加密的文件进行解密,还原为原始文档。
而这个通讯过程中存在一个问题,就是Alice必须确认传输的人就是Bob
SSL证书公信力(CA)

- 首先我们需要先申请一个证书,证书订阅人去申请一个证书,证书申请的时候我们需要登记一些必要的信息(名称、组织、地区等)
- 到了登记机构,登记机构将申请发送给CA,CA中心通过以后,把公钥和私钥发送给证书订阅人,公钥会在CA的证书库中保存着
- 证书订阅人拿到公钥和私钥之后,就会把公钥私钥部署到自己的web服务器上。
- 当浏览器访问web服务时,它会去请求我们的证书;而nginx这样的web服务器会把我们的公钥证书发送给浏览器。
- 浏览器会去CRL服务器或OCSP响应程序中验证证书是否合法,和是否过期。
- CRL和OCSP性能是比较差的,而nginx提供了一个OCSP的开关,打开这个开关,nginx会去OCSP响应程序去验证证书是否有效,这样浏览器就可以从web服务器直接验证了。
证书类型
- DV证书:域名验证证书 验证服务器或邮箱是否正确
- OV证书:组织验证证书 验证机构、企业名称是否有效
- EV证书:扩展验证证书
证书链
我们站点的证书都是由:根证书、二级证书、主证书三部分构成的
其中根证书的验证是非常谨慎的,像Windows、安卓、IOS系统基本上每一年才会去更新一次根证书库;而大部分浏览器都使用的是系统的根证书库。
我们的浏览器在验证证书的时候除了验证证书是否过期,最主要的还是验证根证书是不是有效的。
而我们的web服务器向浏览器发送证书的时候只是发送了两个证书,首先发送猪证书,然后发送二级证书。
TLS通讯过程

通讯过程中双方主要完成四个目的:验证对方的身份、对安全套件达成共识、传递并生成密钥、对数据进行加密通讯
-
第一步,由我们浏览器向服务器发送一个
client Hello的消息,主要的作用是告诉服务器我支持那些加密算法。 -
第二步,服务器(nginx)会在自己的加密算法列表中选择合适的算法,和加密套件,服务器发送
server Hello,告诉浏览器我们使用那个安全套件 -
第三步,nginx会将公钥证书发送给浏览器,其中也包括证书链。所以浏览器可以找到自己的根证书库去验证,证书是否有效。
-
第四部,服务器会发送
server hello done,但是我们之前协商的安全套件(如椭圆曲线算法),这时要做3-4步直接包参数发送给客户端 -
第五步,客户端需要根据椭圆曲线的公共参数,生成自己的私钥,再把公钥发送给服务器
-
第六步:服务器根据客户端公钥,和自己的私钥共同生成双方加密的密钥,服务器把自己的公钥发送给客户端。客户端根据自己的私钥和服务器的公钥也会生成双方共同的加密密钥。双方生成的密钥是相同的。是有非对称加密算法保证的
-
之后我们就可以使用密钥进行通讯了。
从中我们可以知道TLS通讯主要是在做两件事,一个是交互密钥,一个是加密数据。所以最消耗性能的也是这两点。
nginx握手性能
nginx在握手的时候主要看它的椭圆加密算法和RSA的非对称加密算法

这里我们可以看出,对于小文件,握手是主要影响它QPS性能的指标


当以小文件为主的时候,主要考验的是nginx的非对称加密的性能(RSA)
当我们主要处理大文件时,主要考验的是对称加密算法的性能(AES)
使用免费的SSL实现一个HTTPS站点
- 使用一台腾讯云服务器
域名是在腾讯云中注册的。使用了腾讯云默认的域名解析
# 安装nginx
yum -y install nginx
# 配置
cat nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
server {
listen 80;
server_name fengzhilaoling.xyz;
root /usr/share/nginx/html;
}
}
-
访问

-
安装工具
# 配置Let's Encrypt证书
# 安装一键配置工具
yum -y install python2-certbot-nginx
apt -y install python2-certbot-nginx
# 安装以后会提供一个certbot的命令
certbot
- 指定文件生成证书
certbot --nginx --nginx-server-root=/etc/nginx/ -d fengzhilaoling.xyz
# 解释
--nginx:为nginx生成证书
--nginx-server-root:指定配置文件路径
-d:指定申请证书的域名

- 配置文件变化
cat /etc/nginx/nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
server {
server_name fengzhilaoling.xyz;
root /usr/share/nginx/html;
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/fengzhilaoling.xyz/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/fengzhilaoling.xyz/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
# include /etc/nginx/conf.d/*.conf;
server {
if ($host = fengzhilaoling.xyz) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name fengzhilaoling.xyz;
return 404; # managed by Certbot
}}
-
使用https访问

-
配置文件更改解释
# 开启443端口,并开启ssl
listen 443 ssl; # managed by Certbot
# 公钥证书和私钥证书及相应的路径
ssl_certificate /etc/letsencrypt/live/fengzhilaoling.xyz/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/fengzhilaoling.xyz/privkey.pem; # managed by Certbot
# 将通用参数,通过include加入到了配置中
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
# 使用非对称加密时,使用的参数
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
- 看一下/etc/letsencrypt/options-ssl-nginx.conf中有哪些参数
# 为了降低握手的性能消耗,添加了session_cache,设置了大小为1M,大约是4千个
ssl_session_cache shared:le_nginx_SSL:10m;
# session超时时间1天,也就是1天内不用进行重新的握手操作
ssl_session_timeout 1440m;
# 也是一种验证方式,关闭就可以了,有兴趣的百度吧
ssl_session_tickets off;
# 表示nginx支持那些版本的TLS
ssl_protocols TLSv1.2 TLSv1.3;
# 是否由服务器决定采用哪种加密算法,TLS1.1可以设置为on,之后的版本以及不在采用此参数了
ssl_prefer_server_ciphers off;
# nginx支持的安全套件
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";

浙公网安备 33010602011771号