OSI七层 tcp 四层
SSL的加密层 起到安装全的作用
tcp握手(3) 建立连接的过程 建立连接之后就可以进行数据通讯了
用户在浏览器里输入一个https网址,然后连接到server的443端口。
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。这套证书其实就是一对公钥和私钥。如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值。然后用证书对该随机值进行加密。就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥(随机值)通过某种算法混合在一起,这样除非知道私钥(随机值),不然无法获取内容,而正好客户端和服务端都知道这个私钥(随机值),所以只要加密算法够彪悍,私钥(随机值)够复杂,数据就够安全。
这部分信息是服务端用私钥(随机值)加密后的信息,可以在客户端被还原
客户端用之前生成的私钥(随机值)解密服务端传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策
https是为了防止通讯被监听,使用户的数据更加安全
搭建https,需要申请证书,测试可以申请一个免费的,申请的前提必须有一个可以解析的域名。
https://jingyan.baidu.com/article/c14654138cfd930bfdfc4c10.html
Nginx文件夹内获得
SSL证书文件 1_www.domain.com_bundle.crt
私钥文件 2_www.domain.com.key
1_www.domain.com_bundle.crt 文件包括两段证书代码
“-----BEGINCERTIFICATE-----”和“-----END CERTIFICATE-----”,
2_www.domain.com.key 文件包括一段私钥代码“-----BEGIN RSA PRIVATE
KEY-----”和“-----END RSA PRIVATE KEY-----”。
将域名 www.domain.com 的
证书文件1_www.domain.com_bundle.crt
私钥文件2_www.domain.com.key
保存到同一个目录,例如/usr/local/nginx/conf目录下
更新Nginx根目录下 conf/nginx.conf 文件如下:
server {
listen 443;
server_name www.domain.com; #填写绑定证书的域名
ssl on;
ssl_certificate 1_www.domain.com_bundle.crt;
ssl_certificate_key 2_www.domain.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
location / {
root html; #站点目录
index index.html index.htm;
}
}
配置完成后,先用bin/nginx –t来测试下配置是否有误,正确无误的话,重启nginx。就可以使 https://www.domain.com 来访问了
注:
配置文件参数 | 说明 |
---|---|
listen 443 | SSL访问端口号为443 |
ssl on | 启用SSL功能 |
ssl_certificate | 证书文件 |
ssl_certificate_key | 私钥文件 |
ssl_protocols | 使用的协议 |
ssl_ciphers | 配置加密套件,写法遵循openssl标准 |
对于用户不知道网站可以进行https访问的情况下,让服务器自动把http的请求重定向到https。
在服务器这边的话配置的话,可以在页面里加js脚本,也可以在后端程序里写重定向,当然也可以在web服务器来实现跳转。Nginx是支持rewrite的(只要在编译的时候没有去掉pcre)
在http的server里增加rewrite \^(.*) https://$host$1 permanent;
这样就可以实现80进来的请求,重定向为https了
具体配置参考下发的nginx.conf配置文件
注意:
把证书对应的域名本机hosts到对应服务器的IP地址
最终部署效果实现