本文已收录至我的个人网站:阿里云后台部署全过程-6-HTTPS原理及配置
简介
web应用的网络通信,一般是基于HTTP协议,HTTP协议处于应用层,基于TCP/IP协议,又在其之上。
HTTP协议的一个特性是明文传输,这就决定了基于它的通信,极易遭受劫持和窃听,所以为了解决它的通信安全问题,HTTPS应运而生。
HTTPS是HTTP Secure的简称,它实际上就是HTTP+SSL或者是HTTP+TSL,其实就是在TCP和HTTP之间又加了一层安全协议。

SSL(Secure Socket Layer)和TSL(Trasport Layer Security),这两个东西差不多,TSL1.0是基于SSL3.0开发的,一母同胞,换了波人开发而已。
两种加密方式
近代的加密算法是公开的,秘钥是保密的,只有通过秘钥才能解密。如果想在没有秘钥的情况下强行解密,从数学的角度来看,基本上是不可能的。
1、SSL采用非对称加密,也叫公开秘钥加密(Public-key cryptography)的加密方式,其中RSA是应用最广泛的加密算法。
这种方式有两把配对的秘钥,一把公钥,一把私钥,公钥用于加密,私钥用于解密。
公钥是公开的,任何人都可以拿到,而私钥是保密的,绝对不能让任何知道。
这种加密方式的特点是:A、不用担心私钥被人窃取。B、算法复杂,耗时较长。
2、与之相对的,有一种加密方式,叫对称加密,也叫共享秘钥加密,(Common key crypto system),它的加密、解密使用的是同一个秘钥,其中最流行的应该是AES加密算法。
这种加密方式只需要一把秘钥,所以必须将秘钥传递到通信双方的手中。
因此这种方式也有两个特点:A、秘钥在传输过程中可能被窃取。B、算法耗时较少。
混合加密&CA机构
为了博采众长,HTTPS采用了混合加密的方式,即交换秘钥阶段使用非对称加密方法,在建立通信交换报文阶段,则使用对称加密方式。
混合加密虽然解决了报文的安全性问题,但还是存在一个问题,即,如何确定通信的双方,就是双方预期的对象呢?怎么确保通信的对象不是别人伪装的呢?
这个问题产生的根源是,通信的双方,不能确保拿到手的对方公钥,即是对方真实的公钥,因为传输过程中,可能已经被篡改。
因此,第三方数字认证机构(CA, Certificate Authority),应运而生。
第三方机构的作用,简单来说就是,在与目标服务器B发起通信之前,你拿着B给你的公钥证书,通过CA的公钥,对证书签名进行验证,验证通过,说明B服务器的公钥是可靠的。
随后你就可以使用混合加密,安心通信了。
CA的可靠性
第三方机构成立前提是,它是绝对的可靠的,公钥的可靠性才能得以保证。
事实上,CA机构被黑客入侵,并不是没有的事情。
所以,根据CA机构的实力,一般可以分为大机构、中级机构和自认机构。
自认机构就是通过OpenSSL这套开源程序,自己给自己颁布证书,就相当于在互联网的世界中大喊:我就是我,所以基本没有信任度可言,因此浏览器一般不认可这种证书,会弹出提示:

因为一般浏览器只信任大机构,所以中级机构颁布的证书,有可能被视为自认机构,从而不被认可。
公钥认证流程
1、我们通过CA机构的公钥对B服务器证书签名进行验证时,必须先保证CA的公钥是可靠的,但目前无法保证在传输过程中CA的公钥不被篡改,因此目前的做法是直接将CA的公钥植入在浏览器之内。
2、CA机构的公钥之所以可以对B数字证书进行验证,是因为在此之前,B服务器的运维人员,会向CA机构提出认证申请,CA机构验明其身份后,会用自己的私钥对B服务器的公钥进行签名,然后把这个已签名公钥放入数字证书,最后把数字证书颁发给B服务器。
3、在与B服务器正式通信之前,会有一个握手阶段,B服务器会将CA证书发给客户端,客户端浏览器使用CA机构的公钥对证书中的签名进行验证,验证通过,则说明2个事情:A、证书是相关CA机构颁布的。B、B服务器的公钥是可靠的。
4、验证通过后,浏览器即可取出B服务器的公钥,然后进行下一步的混合加密通信。
客户端公钥
服务器存在公钥,与之相对,客户端也会有公钥机制,比如网银的客户端证书。但是客户端证书需要安装以及付费,即意味着每一个用户都需要知道如何安装,以及支付费用。所以客户端证书一般只在特殊场合使用。
HTTPS的配置
现在我们就是B服务器的运维人员,我们就需要走一遍公钥的认证流程,以及将整套HTTPS机制配置起来。
1、免费证书的获取。
参考:https://note.youdao.com/ynoteshare1/index.html?id=fe54152554a30614d861aa2576a56fae&type=note
2、从阿里云下载Nginx类型的证书,得到一个压缩包,解压后是2个文件,1个证书,1个秘钥。
3、把压缩包上传到服务器对应文件夹下。
4、根据阿里云教程,我做了如下操作:
--将阿里云建议的配置代码放到我们之前server配置段里面
--将监听端口改为443,即https默认端口
--变更server_name
--注释相对路径root html,因为路径映射我们下面做了
--变更cert后面的证书名和秘钥名
--删除location /配置段的内容,因为下面我们自己有写
--注释监听80端口
点击证书下载旁的帮助,即会出现阿里云教程

部分教程如下:

#以下属性中,以ssl开头的属性表示与证书配置有关。
server {
listen 443 ssl;
#配置HTTPS的默认访问端口为443。
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
#如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
server_name yourdomain.com; #需要将yourdomain.com替换成证书绑定的域名。
root html;
index index.html index.htm;
ssl_certificate cert/cert-file-name.pem; #需要将cert-file-name.pem替换成已上传的证书文件的名称。
ssl_certificate_key cert/cert-file-name.key; #需要将cert-file-name.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; #表示使用的TLS协议的类型。
ssl_prefer_server_ciphers on;
location / {
root html; #站点目录。
index index.html index.htm;
}
}

server {
listen 80;
server_name yourdomain.com; #需要将yourdomain.com替换成证书绑定的域名。
rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。
location / {
index index.html index.htm;
}
}

5、做了以上操作,重启Nginx,但是失败了,使用检查语句

发现我们的配置文件的目录下,应该只有文件类型,不能有目录类型,虽然阿里云的教程,好像是叫我们在同一个目录下创建目录和放置证书和秘钥。
6、把证书目录移到外面一层

7、同时把证书文件的路径改为绝对路径

8、打开阿里云控制台的安全配置规则,配置上443端口

9、在配置文件里新增一个配置段,用来实现http重定向到https,默认的location /{}配置段被我删除了。

10、重新测试和启动Nginx,OK了。

本文介绍HTTPS的基本概念,包括其在解决HTTP通信安全问题中的作用,以及混合加密方式的工作原理。此外,还详细介绍了如何在阿里云后台部署HTTPS,包括证书获取、配置Nginx等步骤。
423

被折叠的 条评论
为什么被折叠?



