HTTPS功能
多数公司 都在使用https 功能
因为http 传输数据的时候是明文传输的 容易被截获,明文传输容易泄露
所以我们使用https,我们访问的主流的网站都是https
比如我们访问51cto论坛 我们直接输入 blog.51cto.com
我们也没有输入https 他自动给我们切换https ,就算给他加上http
他也会默认给你跳转到https,主流的网站都这样
他是怎么做的呢?
事实上80和443 都是开着的 但是你去访问的时候 他会默认的 把80跳转到 443 上面去
https 通讯过程
HTTPS
就是我们发起了一次https 的请求后 他事实上给我们经过了 很多步
首先
1-- 是我们客户端发起一个https 的请求
http 默认端口是80 https默认是443
这个不需要写
2- 服务端配置 采用https协议的 服务器 必须有一套证书 这套证书包括
一般公司的证书都是买的 去第三方机构 专门有那种颁发机构 去买 很贵
一般是两年 两年几万块钱 但是我们也可以自己做 但是自己做的 不受信任
能给我颁发 证书的机构 是交了 保护费的 人家交了钱 在很多浏览器 比如火狐 谷歌
360 他们都有一个信任列表 这个信任列表 信任的是 那些机构颁发的证书 是可以信任的 就类似于保护费 这套证书 通过一个组织申请 怎么申请呢 阿里云可以颁发
以前做安全 都可以 颁发证书 就瑞星杀毒 卡巴斯基 以前都是可以的
现在几乎都是360
一套证书很贵 一个web 界面去买套证书就一两万块钱 一天卖一个 证书很简单
搭一个ca 服务器 然后用这个服务器 生成一个密文的证书就ok了
很简单 根据你的域名 用ca 给你颁发一个证书 就这么简单 几万块钱
自己也可以做
一些小公司 不去买 自己做 或者 买一些小众的 不受信任的
然后浏览器 访问 就会提示你 不安全
当你访问一个网站的时候 提示你不安全的时候 那么他的证书 就是自己做的
证书下面是套锁 就是一把锁 加一把钥匙 我这个锁 正常情况只有你的钥匙可以打开你的锁 但是锁有很多把 你把锁丢给别人 别人拿到锁后 来找你开 钥匙只有一把 放到自己的目录下 服务端 采用这个证书 就是公钥和私钥 只有你自己的私钥 才能匹配到你自己的私钥上去
3- 传输证书 客户端一个请求过来了 服务端一看是https 的请求 那这个时候 服务端会给客户端传递证书 传递 公钥 公钥里面有 颁发机构是谁 这个证书的过期时间多少 你这个域名是多少 都会打到这个公钥里面 现在是客户端请求来了 后 第一步是把这个公钥传输给客户端
客户端 收到公钥后需要解析 解析里面包含什么东西 这一步 是由客户端完成的 一般是由浏览器完成 首先就是 验证公钥的有限性 比如颁发机构是谁 比如我们访问网站老是被提醒 那就是提醒验证机构的时候 没有通过 没通过就是没交钱呗 那颁发机构 验证一下 如果发生异常就会弹出警告信息 咱们自己做的话肯定会弹出验证信息
如果证书没有问题 验证通过了 就不弹出信息 就会产生一个随机值 然后用证书对随机值进行加密 我们不是传过来一个公钥信息来么 利用这个公钥对这个随机值进行加密 本来这个随机值就是随机的 然后再进行加密 这个加密 过程 就像上面说的 服务端产生证书似的 把随机值锁起来 我们不是有一个 钥匙和锁嘛 公钥是锁 私钥是钥匙 公钥很多 私钥就我有 (服务端) 随机值 到我来着里来了 我把随机值加密一下 就相当于我把随机值锁起来 把随机值锁起来
那把随机值锁起来 谁能打开 只有服务端 的私钥 可以打开
随机值加密后 那要传输 随机值
传输上一步加密好的随机值 传输给 服务器 传给访问的https 的服务器
就是让服务器得到这个随机值 以后就可以让客户端和服务端 用这个随机值 通过这个随机值 进行加密和解密 通过加密的方式传给服务端
这个传输的过程 别人有可能窃取的 但是窃取到 没用 因为加密了 打不开
这个时候 只有服务端 传给服务端 才能正常打开 因为服务端 有私钥
服务端能把加密完的随机值给解密出来 得到这个随机值
以后就可以用这个随机值 来进行客户端和服务端的通信 那服务端要解密 通过私钥来解密 然后 把内容通过对称加密 加密有对称加密 和非对称加密 对称加密的安全性要差一点 非堆成加密的安全性要更高 而且更加复杂更加消耗你的cpu 资源
https 本身就非常消耗资源 本来就比http 消耗资源 所以一个nginx 开启https 以后他的性能要减弱一部分
那这个时候 服务端收到这个随机值后 他把这个值解密出来以后 要用这个随机值 对我要返回给客户端的数据 那现在我客户端请求 的啥 比如我访问的图片 那么服务端就要返回给他图片 访问数据 网页 返回 数据网页 那传输的数据 就需要用这个随机值进行加密
这个随机值我客户端有 服务端也有 那现在就叫对称加密 加密和解密用的同一个东西
同一个 随机值 对称加密就是将信息和私钥 通过算法 合在一起 这个时候除非你知道私钥 那不然无法 知道里面内容 那正好客户端和服务端 都知道里面公钥 这个公钥就是那个随机值 我现在通过随机值把数据加密够 传给客户端 客户端收到后 通过随机值 来进行解密
7.传输加密后的信息: 服务端将用私钥加密后的数据传递给客户端,在客户端可以被还原出原数据内容。
8-客户端来解密 客户端怎么解密 信息 客户端之前生成的私钥获取 服务端数据
这个私钥说就是刚才生成的随机值
所以整个https 开启后 就八个过程
先是客户端发起https 请求 第二服务端和客户端配置一个公钥私钥 第三步 服务端把公钥传输给客户端 第四步客户端收到公钥后 会生成一个随机值 然后用公钥对随机值进行加密
然后传给服务端 服务端收到后用自己的私钥把整个解开 获取随机值 然后用随机值 对数据 进行对称加密 然后把数据传给客户端
客户端收到 使用随机值 把加密的文件解密出来 获取到信息
https 实现过程如下:
1.客户端发起HTTPS请求: 客户端访问某个web端的https地址,一般都是443端口
2.务端的配置: 采用https协议的服务器必须要有一套证书,可以通过一些组织申请,也可以自己制作,目前国内很多网站都自己做的, 当你访问一个网站的时候提示证书不可信任就表示证书是自己做的,证书就是一个公钥和私钥匙,就像一把锁和钥匙,正 常情况下只有你的钥匙可以打开你的锁,你可以把这个送给别人让他锁住一个箱子,里面放满了钱或秘密,别人不知道里 面放了什么而且别人也打不开,只有你的钥匙是可以打开的。
3.传送证书: 服务端给客户端传递证书,其实就是公钥,里面包含了很多信息,例如证书得到颁发机构、过期时间等等。
4.客户端解析证书: 这部分工作是有客户端完成的,首先回验证公钥的有效性,比如颁发机构、过期时间等等,如果发现异常则会弹出一个警 告框提示证书可能存在问题,如果证书没有问题就生成一个随机值,然后用证书对该随机值进行加密,就像2步骤所说把随 机值锁起来,不让别人看到。
5.传送4步骤的加密数据: 就是将用证书加密后的随机值传递给服务器,目的就是为了让服务器得到这个随机值,以后客户端和服务端的通信就可以 通过这个随机值进行加密解密了。
6.服务端解密信息: 服务端用私钥解密5步骤加密后的随机值之后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加 密,对称加密就是将信息和私钥通过算法混合在一起,这样除非你知道私钥,不然是无法获取其内部的内容,而正好客户 端和服务端都知道这个私钥,所以只要机密算法够复杂就可以保证数据的安全性。
7.传输加密后的信息: 服务端将用私钥加密后的数据传递给客户端,在客户端可以被还原出原数据内容。
8.客户端解密信息: 客户端用之前生成的私钥获解密服务端传递过来的数据,由于数据一直是加密的,因此即使第三方获取到数据也无法知道 其详细内容。
我们理解很简单 但是对于计算机来说 消耗了很多资源 以前http 协议 数据过来后啥也不用干 就是你给我要啥 我给你啥 也不要传输那么多 也不要加密
无形中 给我们增加了 时间消耗 和资源消耗,一般加密都是消耗cpu资源
开始配置一个 认证加密 和解密
mobile.fqc.com.conf
配置这个域名的
查看一下是否把hosts 文件加入进去了
开始ssl
最初完nginx 的时候 我们一般 80 和443 写两个server 里面
做一个虚拟主机 写两个server 里面 第一个server 写80 第二个写443
现在改了 写到一起
vim /apps/nginx/conf/vhost/mobile.fqc.com.conf
#在listen 80; 下面添加一行
listen 443 ssl;
# 就开启了htps 传输 但是 传输他没问题 但是提供一个证书 一个公钥和一个私钥
#下面两行也要加进去 第一行是 公钥所存放的目录 第二行是私钥所存放的目录
ssl_certificate ;
ssl_certificate_key ;
#如果这里提供的证书不对 那么就访问不了
#ssl 协议目前 支持TLSv1 TLSv1.1 TLS1.2 协议
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
TLS 是ssl 的加强版
TLS 比ssl 安全性更高
一共添加四行
一共添加四行
vim /apps/nginx/conf/vhost/mobile.fqc.com.conf
listen 443 ssl;
ssl_certificate ;
ssl_certificate_key ;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv3;
公钥和私钥现在没有 我们要自己创建
cd /apps/nginx/conf/
去这个目录下
通常我们会创建一个目录
mkdir certs
创建certs 看自己习惯
cd certs/
然后到这个目录生成 左公钥和私钥
我们生成公钥和私钥之前 要有一个步骤 要自己建一个ca 颁发机构
有一个机构 是专门给咱们颁发这个证书的 就是生成证书
我们模拟一下 自己给自己颁发
自建一个ca
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 3650 -out ca.crt
# -newkey 生成新的证书
# rsa 证书使用的加密算法
# 4096 加密长度
# -nodes
# sha 256 再加一个
# -keyout输出一个名字叫 ca.key
# -days 指定一个有效期为3650天 一般是两年730 时间久了反而不好 不安全
# -out 输出 输出到 ca.ctl
通常我们用openssl 这个命令
输入国家 中国代码 CN
输入省份 Shangdong
输入城市 dezhou
输入公司名字 比如fqc
然后你的部门是什么 niubi
给那个域名颁发证书 fqc
写上邮箱 fqc0112@163.com
然后就生成了
生成两个文件 一个叫ca.crt 一个叫ca.key
这个就是颁发机构有了 然后我们自制的ca key 自制证书
开始自制证书
openssl req -newkey rsa:4096 -nodes -sha256 -keyout mobile.fqc.com.key -out mobile.fqc.com.csr
# -keyout 输出私钥(写域名) mobile.fqc.com.key
# -out 输出一个公钥 mobile.fqc.com.csr
然后回车
又让写一边刚才填的国家 省份 等
要和刚才填写的一模一样 否则报错
然后到这一步 建立密码 我们不要建立密码 否则每次访问都要输入密码
直接回车 然后再回车 就ok了
然后会生成 .csr 和.key 文件 我们需要签发 我们自己生成了 csr和key了
但是没有签发 没有ca机构签呢
我们自己要签发证书
我们用ca 来自己做的csr 和key 签发证书
这个时候 就是生成公钥和私钥了
openssl x509 -req -days 3650 -in mobile.fqc.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out mobile.fqc.com.crt
# -days 时间3650
# -in 要用谁来签 mobile.fqc.com.csr
# -CA 指定ca文件和csr文件 ca文件是ca.key
# -CAkey指定CKaey文件 就是 ca.key
# -CAcreateserial 创建一个公钥 -out 公钥名叫mobile.fqc.com.crt
然后回车生成crt文件
生成pem文件
这时候我们验证一下到底好不好使
openssl x509 -in mobile.fqc.com.crt -noout -text
输入这串命令
出现下图这样就行了
上面就是生成的密文
这时候 就可以用了
我们要用的文件 是
mobile.fqc.com.key和mobile.fqc.com.crt
这两个文件就是我们详细的 公钥和私钥
/apps/nginx/conf/certs/mobile.fqc.com.crt
/apps/nginx/conf/certs/mobile.fqc.com.key
这两个文件的目录
加到配置文件里去
vim /apps/nginx/conf/vhost/mobile.fqc.com.conf
这样就相当于我们把https服务启用了
浏览器访问
显示不安全 因为证书是自己做的
这就是证书信息 颁发者是fqc
颁发给fqc
有效期十年
详细信息里面有 版本号
序列号
签名算法 sha256
哈希算法 sha256
颁发者 fqc
生产上不需要干这个 生产上 要干的就是
加这么几行内容
生产上我们一般 做到全站https
80 和443 都跳转到443上去
事实上我们就一个域名
moile.fqc.com
但是生产上会做多个域名
多个https 每个域名生成不同的证书
做法和前面一样
来个免交互式的生成证书方式
mkdir certs
#创建个证书
#创建ca证书私钥
openssl genrsa -out ca.key 4096
生成ca证书
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=guoguo.com" \
-key ca.key \
-out ca.crt
#创建私钥
openssl genrsa -out guoguo.com.key 4096
#创建证书请求文件
openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=guoguo.com" \
-key guoguo.com.key \
-out guoguo.com.csr
#生成x509 v3扩展名文件 签发
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=guoguo.com
DNS.2=guoguo
DNS.3=images.guoguo.com
EOF
#生成证书
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in guoguo.com.csr \
-out guoguo.com.crt
#就ok了
#这个域名是guoguo.com
极简版
openssl genrsa -out tls.key 2048
openssl req -new -x509 -key tls.key -out tls.cert -days 360 -subj /CN=*.guoguo.com