一、https的相关知识
1.1 https的简介
HTTPS (全称:Hypertext Transfer Protocol Secure ),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯,例如交易支付等方面 。
1.2 HTTP 与 HTTPS 的区别
-
HTTP 是明文传输协议,HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。
-
HTTPS比HTTP更加安全,对搜索引擎更友好,利于SEO,谷歌、百度优先索引HTTPS网页;
-
HTTPS需要用到SSL证书,而HTTP不用【(HTTPS是安装SSL的服务器,HTTP是未安装SSL的服务器)】;
-
HTTPS标准端口443,HTTP标准端口80;
-
HTTPS基于传输层,HTTP基于应用层;
-
HTTPS在浏览器显示绿色安全锁,HTTP没有显示;
1.3 SSL的相关了解
SSL(Secure Socket Layer)安全套接层是Netscape公司率先采用的网络安全协议。它是在传输通信协议(TCP/IP)上实现的一种安全协议,采用公开密钥技术。SSL广泛支持各种类型的网络,同时提供三种基本的安全服务,它们都使用公开密钥技术。
1.3 SSL/TLS协议和证书的关系
为保证网络安全,我们需要给服务器颁发证书,这个证书可以自己生成,但是自己颁发证书是不安全的,可以被别人伪造,一般都是在第三方机构购买证书。实际上证书并不依赖于协议,和协议也并没有太大的关联,协议是由服务配置来决定的,而证书是配合着协议去使用。
1.4 https的单向认证流程
(1)服务端通过CA获取服务端的证书和私钥文件
(2)客户端通过https访问服务端的443号端口
(3) 服务端发送包括证书有效期、公钥、CA信息的证书给客户端
(4)客户端收到后会先通过本地的CA证书验证服务端证书的有效期,验证通过会随机生成一个会话密钥并通过服务端公钥加密然后发送给服务端,验证失败会提示告警。
(5)服务端收到后会利用自己的私钥解密后获得会话密钥,并将回复的报文通过会话密钥加密发送给给客户端
(6)客户端收到利用会话密钥解密获取恢复的数据,之后客户端和服务端就可以通过会话密钥进行密文传输
该过程中,服务端在获取到会话密钥时,证书中产生的公钥私钥进行会话密钥获取的方式为非对称密钥方式。之后客户端服务端建立起了会话私钥进行交流的方式为对称密钥方式。
1.5 https的双向认证流程
0)服务端和客户端会事先通过CA签发服务端证书和私钥文件
1)客户端发送https请求到服务端的443端口
2)服务端会先返回一个包含公钥、证书有效期、CA机构等信息的证书给客户端
3)客户端收到服务端发来的证书后,会先用本地的CA证书校验服务端证书的有效性,如果证书有效,再将包含公钥的客户端证书发送给服务端
4)服务端收到客户端证书后也会校验证书的有效性,客户端还会发送自己可支持的对称加密方案给服务端
5)服务端会选择加密程度最高的方案,并通过客户端证书里的公钥加密后发送给客户端
6)客户端使用私钥解密获取选择的加密方案,并使用此加密方案生成随机会话密钥,再通过服务端证书中的公钥进行加密,再发送给服务端
7)服务端会用私钥进行解密获取客户端发来的随机会话密钥,并使用这个会话密钥加密要返回的报文,再发送给客户端
8)客户端也是这个会话密钥进行解密获取服务端返回的数据,之后双方可继续这个会话密钥进行加密和解密来实现密文通信
1.6 客户端是如何验证证书是否有效
-
浏览器一般会预安装一些比较权威的第三方认证机构的公钥,比如VeriSign、Symantec以及GlobalSign等等。
-
验证数字签名的时候,会直接从本地拿到相应的第三方的公钥,对私钥加密后的数字签名进行解密得到真正的签名。
-
然后客户端利用签名生成规则进行签名生成,看两个签名是否匹配,如果匹配认证通过,不匹配则获取证书失败。
1.7 web网站并未全部采用https的原因
-
首先,很多人还是会觉得HTTPS实施有门槛,这个门槛在于需要权威CA颁发的SSL证书。从证书的选择、购买到部署,传统的模式下都会比较耗时耗力。
-
其次,HTTPS普遍认为性能消耗要大于HTTP,因为与纯文本通信相比,加密通信会消耗更多的CPU及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定也会随之减少。
-
除此之外,想要节约购买证书的开销也是原因之一。要进行HTTPS通信,证书是必不可少的。而使用的证书必须向认证机构(CA)购买。
-
最后是安全意识别。相比国内,国外互联网行业的安全意识和技术应用相对成熟,HTTPS部署趋势是由社会、企业、政府共同去推动的。
二、证书的获取方式
如何获取证书?
1)在阿里云、华为云、腾讯云等云服务商那里申请一年有效期的免费证书或者购买证书
2)在本地使用 openssl、mkcert、cfssl、certbot(Let's Encrypt)的工具生成本地私钥证书
2.1 阿里云证书获取
官方帮助文档:https://help.aliyun.com/document_detail/188316.htm?spm=5176.b657008.help.dexternal.40d51b48wYs5Xk
2.2 mkcert证书获取
cd ~
mkdir mkcertmv mkcert-v1.4.4-linux-amd64 mkcertmv mkcert /usr/local/bin/
chmod +x /usr/local/bin/mkcertmkcert cxk.com
2.3 openssl证书获取
(1)创建ca私钥
//首先创建一个存放目录
mkdir /openssl
cd /openssl///生成ca证书openssl genrsa -aes256 -out xhz.key 4096 #输入123123
----------------------------------------------------------------------------------------------------------
genrsa:使用RSA算法产生私钥
-aes256:使用256位密钥的AES算法对私钥进行加密,这样每次使用私钥文件都将输入密码,可省略
-out:输出文件的路径,若未指定输出文件,则为标准输出
4096:指定私钥长度,默认为1024。该项必须为命令行的最后一项参数
----------------------------------------------------------------------------------------------------------
(2)创建ca证书
openssl req -new -x509 -days 1000 -key xhz.key -sha256 -subj "/CN=*" -out ca.pem #输入123123
----------------------------------------------------------------------------------------------------------
req:执行证书签发命令
-new:新证书签发请求
-x509:生成x509格式证书,专用于创建私有CA时使用
-days:证书的有效时长,单位是天
-key:指定私钥路径
-sha256:证书摘要采用sha256算法
-subj:证书相关的用户信息(subject的缩写)
-out:输出文件的路径
----------------------------------------------------------------------------------------------------------
(3)创建服务器私钥
//用 ca 证书签发 server 端证书
openssl genrsa -out server-key.pem 4096
(4)生成证书签名请求文件(csr文件)
openssl req -new -key server.key -out server.csr
(5)使用ca 证书与私钥证书签发服务端签名证书
#该过程需要输入密码 123123,(需要签名请求文件,ca 证书,ca 密钥)openssl x509 -req -days 36500 -in server.csr -CA xhz.pem -CAkey xhz.key -CAcreateserial -out server.pem
----------------------------------------------------------------------------------------------------------
x509:生成x509格式证书
-req:输入csr文件
-in:要输入的csr文件
-CA:指定ca证书的路径
-CAkey:指定ca证书的私钥路径
-CAcreateserial:表示创建证书序列号文件,创建的序列号文件默认名称为ca.srl
----------------------------------------------------------------------------------------------------------
客户端的操作和服务端一样
(6)生成客户端私钥
//用ca证证书签发client端证书
openssl genrsa -out client-key.pem 4096
(7)生成证书签名请求文件
openssl req -new -key client-key.pem -out client.csr
(8)创建扩展配置文件,使秘钥适合客户端身份验证
echo extendedKeyUsage=clientAuth > extfile.cnf
(9)使用 ca 证书签发客户端签名证书
输入 123123,(需要签名请求文件,ca 证书,ca 密钥)
openssl x509 -req -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -extfile extfile.cnf -days 1000 -out client-cert.pem
三、nginx 支持 https
1)编译安装时需要添加 --with-http_ssl_module 模块
2)修改配置文件,添加 ssl 配置
http {
server {
listen 443 ssl; #SSL访问端口号为 443
server_name 域名; #指定绑定证书的域名ssl_certificate /usr/local/nginx/conf/cert/xxxxx.pem; #指定服务端证书文件路径
ssl_certificate_key /usr/local/nginx/conf/cert/xxxxx.key; #指定服务端私钥文件路径# ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #指定SSL服务器端支持的协议版本
ssl_prefer_server_ciphers on;location / {
root html;
index index.html index.htm;
}
}
}
yum -y install nginx
vim /etc/nginx/conf.d/default.confserver {#listen 80;listen 443 ssl;server_name clx.com;#access_log /var/log/nginx/host.access.log main;ssl_certificate /root/openssl/server.pem;ssl_certificate_key /root/openssl/server.key;ssl_session_timeout 5m;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_prefer_server_ciphers on;location / {root /usr/share/nginx/html;index index.html index.htm;}systemctl restart nginx