目录
三、Nginx服务安装ssl模块和配置ssl证书(阿里云证书)
一、SSL概述
SSL(Security Socket Layer)是一个安全协议,为基于TCP(Transmission Control Protocol)的应用层协议提供安全连接,SSL介于TCP/IP协议栈第四层和第七层之间。主要提供私密性、完整性和身份验证;我们常见的就是 SSL为HTTP(Hypertext Transfer Protocol)协议提供安全连接。SSL协议是一种在两个机器之间提供安全通道的协议,它具有保护数据传输以及识别通信机器的功能。
1、SSL协议介绍
SSL(Secure Sockets Layer)安全套阶层
SSL是一个不依赖于平台和运用程序的协议,位于TCP/IP协议与各种应用层协议之间,为数据通信提高安全支持。
2、SSL的好处
SSL具有例如以下好处
提供较高的安全性保证。
SSL利用数据加密、身份验证和消息完整性验证机制。保证网络上传输数据的安全性。支持各种应用层协议。
尽管SSL设计的初衷是为了解决万维网安全性问题,可是因为SSL位于应用层和传输层之间。它能够为不论什么基于TCP等可靠连接的应用层协议提供安全性保证。部署简单。
眼下SSL已经成为网络中用来鉴别站点和网页浏览者身份,在浏览器使用者及Webserver之间进行加密通信的全球化标准。SSL协议已被集成到大部分的浏览器中,如IE、Netscape、Firefox等。这就意味着差点儿随意一台装有浏览器的计算机都支持SSL连接。不须要安装额外的client软件。
3、传输数据的机密性
网络上传输的数据非常容易被非法用户窃取,SSL采用在通信两方之间建立加密通道的方法保证传输数据的机密性。
加解密算法分为两类:
对称密钥算法:数据加密和解密时使用同样的密钥。
非对称密钥算法:数据加密和解密时使用不同的密钥,一个是公开的公钥,一个是由用户秘密保存的私钥。
4、SSL加密知名协议
HTTP over SSL
简写https,加密网页浏览是设计SSL的初衷,HTTP也是第一个使用SSL保障安全的应用层协议。
使用https://来标识HTTP over SSL,因此我常见的https的全称就是HTTP over SSL。后来HTTPS在RFC2818被标准化。HTTPS工作在443端口,而HTTP默认工作在80端口。
二、SSL工作原理
1、SSL协议结构
SSL位于应用层和传输层之间,它能够为不论什么基于TCP等可靠连接的应用层协议提供安全性保证。SSL协议本身分为两层:
- 上层为SSL握手协议(SSL handshake protocol)、SSLpassword变化协议(SSL change cipher spec protocol)和SSL警告协议(SSL alert protocol)。
- 底层为SSL记录协议(SSL record protocol)。
其中:
- SSL握手协议:是SSL协议很重要的组成部分。用来协商通信过程中使用的加密套件(加密算法、密钥交换算法和MAC算法等)、在server和client之间安全地交换密钥、实现server和client的身份验证。
SSLpassword(密码)变化协议:client和server端通过password变化协议通知对端。随后的报文都将使用新协商的加密套件和密钥进行保护和传输。
SSL警告协议:用来向通信对端报告告警信息,消息中包括告警的严重级别和描写叙述。
SSL记录协议:主要负责对上层的数据(SSL握手协议、SSLpassword变化协议、SSL警告协议和应用层协议报文)进行分块、计算并加入MAC值、加密。并把处理后的记录块传输给对端。
2、SSL握手协议
在用SSL进行通信之前,首先要使用SSL的Handshake协议在通信两端握手,协商数据传输中要用到的相关安全参数(如加密算法、共享密钥、产生密钥所要的材料等),并对对端的身份进行验证。
2.1、SSL握手的第一阶段
SSL建立第一阶段报文交换示意图
ClientHello
握手第一步是客户端向服务端发送 Client Hello 消息,这个消息里包含了一个客户端生成的随机数 Random1、客户端支持的加密套件(Support Ciphers)和 SSL Version 等信息。
ClientHello中涉及到的消息具体如下:
- 客户端版本
按优先级列出客户端支持的协议版本,首选客户端希望支持的最新协议版本。
客户端随机数Random
- 会话ID(Session id)
如果客户端第一次连接到服务器,那么这个字段就会保持为空。
如果该字段不为空,说明以前是与服务器有连接的,在此期间,服务器将使用Session ID映射对称密钥,并将Session ID存储在客户端浏览器中,为映射设置一个时间限
- 加密套件
客户端会给服务器发送自己已经知道的密码套件列表,这是由客户按优先级排列的,但完全由服务器来决定发送与否
ServerHello
收到客户端问候之后服务器必须发送服务器问候信息,服务器会检查指定诸如TLS版本和算法的客户端问候的条件,如果服务器接受并支持所有条件,它将发送其证书以及其他详细信息,否则,服务器将发送握手失败消息。
如果接受,第二步是服务端向客户端发送 Server Hello 消息,这个消息会从 Client Hello 传过来的 Support Ciphers 里确定一份加密套件,这个套件决定了后续加密和生成摘要时具体使用哪些算法,另外还会生成一份随机数 Random2。注意,至此客户端和服务端都拥有了两个随机数(Random1+ Random2),这两个随机数会在后续生成对称秘钥时用到。
ServerHello中涉及到的具体参数:
- 服务器版本Version
服务器会选择客户端支持的最新版本。
- 服务器随机数Random
服务器和客户端都会生成32字节的随机数。用来创建加密密钥。
- 加密套件
服务器会从客户端发送的加密套件列表中选出一个加密套件。
- 会话ID(Session ID)
服务器将约定的Session参数存储在TLS缓存中,并生成与其对应的Session id。它与Server Hello一起发送到客户端。客户端可以写入约定的参数到此Session id,并给定到期时间。客户端将在Client Hello中包含此id。如果客户端在此到期时间之前再次连接到服务器,则服务器可以检查与Session id对应的缓存参数,并重用它们而无需完全握手。
2.2、SSL握手的第二阶段
服务器向客户端发送消息。
SSL建立第二阶段报文交换示意图
服务器启动SSL握手第2阶段,是本阶段所有消息的唯一发送方,客户机是所有消息的唯一接收方。
- server将携带自己公钥信息的数字证书通过Certificate消息发送给SSLclient
- 服务器密钥交换(可选):这里视密钥交换算法而定
- 证书请求:服务端可能会要求客户自身进行验证。
- server发送Server Hello Done消息。通知SSLclient版本号和加密套件协商结束。开始进行密钥交换。
Certificate消息(可选)第一次建立必须要有证书
一般情况下,除了会话恢复时不需要发送该消息,在SSL握手的全流程中,都需要包含该消息。消息包含一个X.509证书,证书中包含公钥,发给客户端用来验证签名或在密钥交换的时候给消息加密。
这一步是服务端将自己的证书下发给客户端,让客户端验证自己的身份,客户端验证通过后取出证书中的公钥。
Server Key Exchange(可选)
根据之前在ClientHello消息中包含的CipherSuite信息,决定了密钥交换方式(例如RSA或者DH),因此在Server Key Exchange消息中便会包含完成密钥交换所需的一系列参数。
Certificate Request(可选)------可以是单向的身份认证,也可以双向认证
这一步是可选的,如果在对安全性要求高的常见可能用到。服务器用来验证客户端。服务器端发出Certificate Request消息,要求客户端发他自己的证书过来进行验证。该消息中包含服务器端支持的证书类型(RSA、DSA、ECDSA等)和服务器端所信任的所有证书发行机构的CA列表,客户端会用这些信息来筛选证书。
Server Hello Done
server发送Server Hello Done消息。通知SSLclient版本号和加密套件协商结束。开始进行密钥交换。
2.3、SSL握手的第三阶段
客户端收到服务器发送的一系列消息并解析后,将本端相应的消息发送给服务器。
SSL建立第三阶段报文交换示意图
Certificate(可选)
如果在第二阶段服务器端要求发送客户端证书,客户端便会在该阶段将自己的证书发送过去。服务器端在之前发送的Certificate Request消息中包含了服务器端所支持的证书类型和CA列表,因此客户端会在自己的证书中选择满足这两个条件的第一个证书发送过去。若客户端没有证书,则发送一个no_certificate警告。
Client Key exchange
根据之前从服务器端收到的随机数,按照不同的密钥交换算法,算出一个pre-master,发送给服务器,服务器端收到pre-master算出main master。而客户端当然也能自己通过pre-master算出main master。如此以来双方就算出了对称密钥。
如果是RSA算法,会生成一个48字节的随机数,然后用server的公钥加密后再放入报文中。如果是DH算法,这是发送的就是客户端的DH参数,之后服务器和客户端根据DH算法,各自计算出相同的pre-master secret.
Certificate verify(可选)
只有在客户端发送了自己证书到服务器端,这个消息才需要发送。其中包含一个签名,对从第一条消息以来的所有握手消息的HMAC值(用master_secret)进行签名。
2.4、SSL握手的第四阶段
完成握手协议,建立SSL连接。
SSL建立第四阶段报文交换示意图
建立起一个安全的连接,客户端发送一个Change Cipher Spec消息,并且把协商得到的CipherSuite拷贝到当前连接的状态之中。然后,客户端用新的算法、密钥参数发送一个Finished消息,这条消息可以检查密钥交换和认证过程是否已经成功。其中包括一个校验值,对客户端整个握手过程的消息进行校验。服务器同样发送Change Cipher Spec消息和Finished消息。握手过程完成,客户端和服务器可以交换应用层数据进行通信。
ChangeCipherSpec
编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送(ChangeCipherSpec是一个独立的协议,体现在数据包中就是一个字节的数据,用于告知服务端,客户端已经切换到之前协商好的加密套件(Cipher Suite)的状态,准备使用之前协商好的加密套件加密数据并传输了)。
client发送Change Cipher Spec消息,通知SSLserver兴许报文将采用协商好的密钥和加密套件进行加密和MAC计算。
Clinet Finished
客户端握手结束通知, 表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验(使用HMAC算法计算收到和发送的所有握手消息的摘要,然后通过RFC5246中定义的一个伪函数PRF计算出结果,加密后发送。此数据是为了在正式传输应用数据之前对刚刚握手建立起来的加解密通道进行验证。)
ChangeCipherSpec
相同地。SSLserver发送Change Cipher Spec消息,通知SSLclient兴许报文将采用协商好的密钥和加密套件进行加密和MAC计算。
serverFinished
服务端握手结束通知。
client接收到server发送的Finished消息后。假设解密成功,则能够推断SSLserver是数字证书的拥有者,即SSLserver身份验证成功,由于仅仅有拥有私钥的SSLserver从Client Key Exchange消息中解密得到premaster secret,从而间接地实现了SSLclient对SSLserver的身份验证。
服务端也会使用 Session Secret 加密一段 Finish 消息发送给客户端,以验证之前通过握手建立起来的加解密通道是否成功。
3、SSL记录协议
SSL记录协议主要用来实现对数据块的分块、加密解密、压缩与解压缩、完整性检查及封装各种高层协议。
每个SSL记录主要包含以下信息:
- 内容类型
- 协议版本号,目前有2.0和3.0版本
- 记录数据的长度
- 数据由载荷
- 散列算法计算消息认证代码
三、Nginx服务安装ssl模块和配置ssl证书(阿里云证书)
1、SSL证书概述
SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。
SSL 证书是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。
SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socket layer(SSL)安全协议
由于SSL技术已建立到所有主要的浏览器和WEB服务器程序中,因此,仅需安装服务器证书就可以激活该功能了),即通过它可以激活SSL协议,实现数据信息在客户端和服务器之间的加密传输,可以防止数据信息的泄露,保证了双方传递信息的安全性,而且用户可以通过服务器证书验证他所访问的网站是否是真实可靠。
2、Nginx安装SSL模块
2.1、查看安装模块情况
运行nginx -V命令查看已经安装的nginx模块
- with-http_ssl_module: ssl模块
2.2、如果没有,就安装
安装依赖包
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
进入nginx目录
编译SSL模块
[root@localhost nginx-1.20.2]# ./configure --with-http_ssl_module
编译执行make
备份原有已安装好的nginx
查看原本安装的nginx
[root@localhost nginx-1.20.2]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ls
nginx
备份原本的nginx
[root@localhost sbin]# cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
将刚刚编译好的nginx覆盖掉原有的nginx(需要先暂停nginx服务)
再次查看安装模块情况
运行nginx -V命令查看已经安装的nginx模块
3、配置ssl证书
各大服务器厂商均可注册证书,我这里使用的是阿里云。
先来到ssl证书控制台,下载证书
需要先填写申请
证书下载,选择nginx
下载完为一个文件夹
将这两个文件放到服务器nginx配置文件目录下
修改配置文件
将参考配置按照自己的情况添加到nginx.conf文件中
# HTTPS server
server {
listen 443 ssl; #SSL 访问端口号为 443
server_name www.yongbu.top; #填写绑定证书的域名
charset utf-8;
access_log /var/log/nginx/liy.com.access.log;
#证书文件名称
ssl_certificate /usr/local/nginx/conf/cert/7850872_www.yongbu.top.pem;
#私钥文件名称
ssl_certificate_key /usr/local/nginx/conf/cert/7850872_www.yongbu.top.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
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;
}
}
ssl模块
启用模块(根据自己情况修改)
修改好之后使用命令检查配置文件的问题 重启服务
4、将所有http请求通过rewrite重定向到https
#可选配置,配置http重定向到https
server
{
listen 80;
server_name 要设置的域名;
rewrite ^(.*)$ https://$host$1 permanent; #将所有http请求通过rewrite重定向到https。
location ~*^.+$ {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass 请按自身情况设置;
}
}
例:
https://blog.csdn.net/weixin_56270746/article/details/125012041?spm=1001.2014.3001.5502
四、SSL应用
1、HTTPS
- HTTPS是基于SSL安全连接的HTTP协议。HTTPS通过SSL提供的数据加密、身份验证和消息完整性验证等安全机制。为Web访问提供了安全性保证,广泛应用于网上银行、电子商务等领域。
- HTTPS在网上银行中的应用。为了方便客户,提供了网上银行业务,客户能够通过访问银行的Webserver进行帐户查询、转帐等。
- 通过在客户和银行的Webserver之间建立SSL连接,能够保证客户的信息不被非法窃取
2、SSL VPN
- SSL VPN是以SSL为基础的VPN技术。利用SSL提供的安全机制,为用户远程访问公司内部网络提供了安全保证。SSL VPN通过在远程接入用户和SSL VPN网关之间建立SSL安全连接,同意用户通过各种Web浏览器,各种网络接入方式,在不论什么地方远程访问企业网络资源。并可以保证企业网络的安全,保护企业内部信息不被窃取。
五、总结
SSL (安全套接层)。是由Netscape公司于1990年开发,用于保障Word Wide Web(WWW)通讯的安全。主要任务是提供私密性,信息完整性和身份认证。1994年改版为SSLv2,1995年改版为SSLv3.
TLS(Transport Layer Security)安全传输层协议,)用于在两个通信应用程序之间提供保密性和数据完整性。该标准协议是由IETF于1999年颁布,整体来说TLS非常类似SSLv3,只是对SSLv3做了些增加和修改。
原文链接:https://blog.csdn.net/weixin_56270746/article/details/125026347
此处评论已关闭