1,过程
-
客户端使用https的url访问web服务器,要求与服务器建立ssl连接
-
证书校验
- web服务器收到客户端请求后, 会将网站的
证书(包含公钥)传送一份给客户端 - 客户端收到网站证书后会检查证书的
颁发机构ca以及过期时间
-
tcp 的三次握手建立连接
-
接着是非对称加密的握手过程
- client 发送随机数 random1 + 支持的加密算法集合
- server 收到信息,返回选择的一个加密算法+ 证书 (包含S_公钥) + random2
- client 验证证书有效性,并用 random1 + random2 生成 pre-master-secure,通过服务端公钥加密发送给 server
- server 收到 pre-master-secure,根据约定的算法使用S_私钥对 pre-master-secure 解密
- 这个时候,客户端和服务端都拥有 random1、random2、pre-master 以及约定的对称密钥生成方法,可以生成相同的master-secure(对称加密的密钥)进行加解密了。
- 最后,就可以使用 master-secure 进行真正的数据对称加密传输。
2,制作证书 原理
- 作为服务端的A,首先把自己的
公钥key1发给证书颁发机构,向证书颁发机构进行申请证书; - 证书颁发机构有一套自己的公私钥,CA通过自己的
私钥来加密key1,并且通过服务端网址等信息生成一个证书签名,证书签名同样使用机构的私钥进行加密; - 制作完成后,机构将证书发给A;
3,校验证书真伪 原理
- 当客户端B向服务端A发起请求通信的时候,A不再直接返回自己的公钥,而是返回一个
证书;
说明:各大浏览器和操作系统已经维护了所有的权威证书机构的名称和公钥。
B只需要知道是哪个权威机构发的证书,使用对应的机构公钥,就可以解密出证书签名;
- 浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发
- 取出颁发者CA 的公钥,然后对服务器发来的证书里面的签名进行解密;
- 浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名做对比
- 签名验证成功后,B就可以再次利用机构的公钥,解密出A的
公钥key1;
4,制作证书步骤
1. openssl 的下载请登录openssl 官网www.openssl.org/source/
openssl是目前最流行的SSL密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS协议的实现
2. 创建根证书私钥以及请求文件:
- rootkey.key
- rootreq.csr
openssl genrsa -out rootkey.key 1024
openssl req -new -out rootreq.csr -key rootkey.key
3. 自签名根证书:
- rootcert.cer
openssl x509 -req -in rootreq.csr -out rootcert.cer -signkey rootkey.key -CAcreateserial -days 3650
4. 服务端文件
serverkey.key- serverreq.csr
servercert.cer
生成服务端key
openssl genrsa -out serverkey.key 1024
生成服务端请求文件
openssl req -new -out serverreq.csr -key serverkey.key
生成服务器端证书:
openssl x509 -req -in serverreq.csr -out servercert.cer -signkey serverkey.key -CA rootcert.cer -CAkey rootkey.key -CAcreateserial -days 3650
5 . 客户端文件
需要外呼调用三方接口,在客户端向服务器端发送带证书的请求
- clientkey.key
- clientreq.csr
- clientcert.cer
- clientp12.p12
生成客户端key:
openssl genrsa -out clientkey.key 1024
生成客户端请求文件:
openssl req -new -out clientreq.csr -key clientkey.key
生成客户端证书:
openssl x509 -req -in clientreq.csr -out clientcert.cer -signkey clientkey.key -CA rootcert.cer -CAkey rootkey.key -CAcreateserial -days 3650
生成客户端p12证书:
openssl pkcs12 -export -clcerts -in clientcert.cer -inkey clientkey.key -out clientp12.p12
5,nginx配置
Nginx安装http_ssl_module模块
Nginx如果未开启SSL模块,配置Https时提示错误
nginx配置https
server {
listen 443 ssl;
server_name 你的域名;
ssl_certificate 服务端证书.crt;
ssl_certificate_key 服务端证书.key;
ssl_client_certificate 根证书
ssl_verify_depth 1;
ssl_verify_client on; #开启客户端验证
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}