https基础知识
HTTPS 协议是由HTTP 加上TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。
SSL v1.0 、V2.0、V3.0是较早期使用的,TLS是现在使用的,是由SSL发展而来的。由于协议版本漏洞的原因,现在主要是使用TLS v1.1、TLS v1.2版本进行加密。TLS v1.3由于改动比较大,使用的还教少。

HTTPS协议握手
开启wireshark进行抓包后,命令行执行 curl https://www.baidu.com
(使用curl可以避免产生多余的数据包,也可使用浏览器访问,但是会加载许多资源)。
第一步:TCP三次握手。
第二步:客户端发送Client Hello。
第三步:服务端发送 Server Hello。
第三步:服务端发送证书 Certificate、Server Key Exchange、Server Hello Done。
第四步:客户端发送 Client Key Exchage、Change Cipher Spec、Encrypted Handshake Message。
第五步: 服务端发送 New Session Ticket、Change Cipher Spec、Encrypted Handshake Message。
第六步:完成秘钥协商,开始发送数据。
第七步:完成数据发送,4次TCP挥手。(此处的 Encrypted Alert / ACK 为SSL/TLS的挥手)
使用openssl s_client -connect IP:port
命令可查看连接网站的证书详情。


证书生成
第一步:生成ca证书ca_cert.crt 。
openssl req -newkey rsa:2048 -nodes -keyout ca_key.key -x509 -days 365 -out ca_cert.crt -subj "/C=CN/ST=GD/L=SZ/O=test/OU=dev/CN=ca.com/emailAddress=ca@ca.com"
-newkey rsa:2048 -nodes -keyout:表示生成不加密的私钥;
CN值为域名。
第二步:生成服务端私钥server_key.key和证书server.crt。
//生成私钥。 openssl genrsa -out server_key.key 2048 //生成请求文件。 openssl req -new -key server_key.key -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=test/OU=dev/CN=server.com/emailAddress=server@server.com" //生成证书文件。 openssl x509 -req -days 3650 -in server.csr -CA ca_cert.crt -CAkey ca_key.key -CAcreateserial -out server.crt
第三步:生成客户端私钥client_key.key和证书client.crt。
//生成私钥。 openssl genrsa -out client_key.key 2048 //生成请求文件。 openssl req -new -key client_key.key -out client.csr -subj "/C=CN/ST=GD/L=SZ/O=test/OU=dev/CN=client.com/emailAddress=client@client.com" //生成证书文件。 openssl x509 -req -days 3650 -in client.csr -CA ca_cert.crt -CAkey ca_key.key -CAcreateserial -out client.crt
单向证书认证
此处使用phpstudy中的nginx进行证书配置。打开nginx目录下的nginx.conf配置。

然后本地点击ca_cert.crt证书进行本地安装即可。

本地使用HTTPS协议访问成功。

双向证书认证
nginx开启双向认证配置。

此时浏览器访问出现400,显示未发送证书。此时需要携带客户端证书。
需要把client.crt与client_key.key转化为.p12格式的证书再导入浏览器中。
//此处需要输入密码对证书进行加密,后续导入浏览器中需要使用此密码
openssl pkcs12 -export -in client.crt -inkey client_key.key -out client.p12
将client.p12证书导入浏览器中即可。

此时重新访问时选择导入的证书访问即可成功。

也可使用curl命令进行访问。
//此处的server.com为证书生成时服务端的CN域名值。
//需要本地配置C:\Windows\System32\drivers\etc\hosts文件。
curl --cert client.crt --key client_key.key --cacert ca_cert.crt https://server.com
