HTTPS原理
Http和https区别
HTTPS(安全的HTTP通道) | HTTP(超文本传输协议) |
---|---|
HTTP over SecureSocket Layer | Hyper Text Transfer Protocol |
HTTP+SSL/ TLS =HTTPS |
HTTP over TCP/IP |
https经过ssl、tls算法加密,比http超文本传输协议更安全 |
HTTPS | HTTP |
---|---|
安全性:高 |
安全性:低 |
加密传输 (SSL/TSL),混合加密方式 |
明文传输 |
第三方机构认证的证书进行身份认证 | 身份冒充 |
保证完整性 | 传输过程可能被篡改 |
不可否认、抵赖 | 无法保证事务真实性 |
加密方式分对称加密和非对称加密,https是把这两种都用上了称之为混合加密
HTTPS | HTTP |
---|---|
端口:443 | 端口:80 |
灵活性:低 | 灵活性:高 |
访问速度:慢 | 访问速度:快 |
经济适用度:收费 CA机构证书 | 经济适用度:免费 |
HTTPS工作流程
tls1.2版本过程 四次握手
client端发起请求从server端获取公钥证书
client端生成对称密钥,并通过公钥进行加密后发给server端
server端通过私钥进行解密,得到密钥
client端和server端都通过对称密钥:
- 加密明文并发送
- 解密密文并得到明文
tls1.3版本过程 三次握手
client携带公钥发起请求(端口443)
server计算出对称密钥,用client的公钥加密服务端参数并返回
client验证身份,用私钥解密服务端参数(对称密钥)
c/s双方使用对称密钥
client发送给server时黑客可以拦截获取密钥和公钥,所以tls1.3这做了改进
https实现原理:机密性
混合加密:非对称加密+对称加密
非对称加密:公钥 & 私钥
安全传输对称密钥
常见算法:RSA
、ECC
速度慢
对称加密: 密钥
使用对称密钥,加密、解密数据
常见算法:AES
、ChaCha20
速度快
https实现原理:完整性
https实现原理:身份认证和不可否认
https应用
Https应用流程
OpenSSL证书生成
安装OpenSSL工具
OpenSSL中包含生成证书的工具和各类加密算法。
下载OpenSSL
Windows:http://slproweb.com/products/Win32OpenSSL.html
Linux:https://www.openssl.org/source/
安装OpenSSL
Windows安装:
双击运行,安装到指定目录即可。
Linux安装(从1.0.x升级):
1.查看版本命令
bash
openssl version
openssl version -a
2.下载指定版本的 openssl 软件,两种方式
bash
https://www.openssl.org/source/
wget https://www.openssl.org/source/openssl-1.1.1o.tar.gz
3.解压压缩包
bash
tar -zxvf openssl-1.1.1o.tar.gz
4.进入解压后的文件夹执行以下命令编译安装
./config shared zlib
make && make install
5.备份原来的软链接
bash
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak
find / -name openssl
6.重新建立软链接
bash
ln -s /usr/local/bin/openssl /usr/bin/openssl
ln -s /usr/local/include/openssl /usr/include/openssl
echo "/usr/local/lib64/" >> /etc/ld.so.conf
ldconfig
// 验证安装
openssl version -a
02.生成服务端证书
在Windows系统中生成服务端证书,然后再把相关文件上传到服务器。
查看Win系统已存证书
certmgr.msc
证书中的信息
- Country Name (2 letter code) [XX]:CN #请求签署人的信息
- State or Province Name (full name) []: #请求签署人的省份名字
- Locality Name (eg, city) [Default City]:# 请求签署人的城市名字
- Organization Name (eg, company) [Default Company Ltd]:#请求签署人的公司名字
- Organizational Unit Name (eg, section) []:#请求签署人的部门名字
- Common Name (eg, your name or your server's hostname) []:#这里一般填写请求人的服务器域名
key:私钥
csr:证书签名请求文件,即待签名证书
crt:证书
在Win下生成证书
1.生成私钥:.key
找到OpenSSL安装目录下的/bin目录中的OpenSSL.exe
执行命令(注意目录的访问权限,下同)
bash
openssl genrsa -des3 -out c:/dev/server.key
生成私钥,需要提供一个至少4位,最多1023位的密码
2.由私钥创建待签名证书:.csr
bash
openssl.exe req -new -key c:/dev/server.key -out c:/dev/pub.csr
需要依次输入国家,地区,城市,组织,组织单位,Common Name和Email。其中Common Name,可以写自己的名字或者域名,如果要支持https,Common Name应该与域名保持一致,否则会引起浏览器警告。
3.查看证书中的内容
bash
openssl.exe req -text -in c:/dev/pub.csr -noout
生成内容清单:
server.key:服务器私钥
pub.csr:服务器待签名证书
自建CA
操作系统(windows, linux, unix ,android, ios等)都预置了很多信任的根证书,比如我的windows中就包含VeriSign的根证书,那么浏览器访问服务器比如支付宝www.alipay.com时,SSL协议握手时服务器就会把它的服务器证书发给用户浏览器,而这本服务器证书又是比如VeriSign颁发的,自然就验证通过了。
由于费用的原因,我们需要自建CA机构,来给我们自己的证书进行签名。所谓"CA机构"的本质,其实也是一套证书,只不过这套证书具有"公信力",可以用来给别人签名。
1.创建CA私钥
bash
openssl.exe genrsa -out c:/dev/myca.key 2048
2.生成CA待签名证书
bash
openssl.exe req -new -key c:/dev/myca.key -out c:/dev/myca.csr
3.生成CA根证书
bash
openssl.exe x509 -req -in c:/dev/myca.csr -extensions v3_ca -signkey c:/dev/myca.key -out c:/dev/myca.crt
4.对服务器证书签名
对上一个环节生成的服务端 待签名证书(.csr)
进行签名,需要用到本CA机构的 私钥(.key)
和证书(.crt)
作为参数:
bash
openssl x509 -days 365 -req -in c:/dev/pub.csr -extensions v3_req -CAkey c:/dev/myca.key -CA c:/dev/myca.crt -CAcreateserial -out c:/dev/server.crt
生成内容清单:
myca.key:ca机构私钥
myca.csr:ca机构待签名证书
myca.crt:ca机构证书,即根证书
server.crt:服务器证书,被ca机构签名过的证书
Nginx配置Https
将生成好的服务端证书上传到服务器指定目录,并在Nignx中进行配置
bash
## 新建server
server {
listen 443 ssl;
server_name aa.abc.com; #域名
ssl_certificate /data/cert/server.crt; #服务器证书
ssl_certificate_key /data/cert/server.key; #私钥
}
添加信任
在当前系统中安装证书