持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情 今日,有个服务需要使用https访问,但是因为在内网,无法申请ssl证书,于是使用openssl自己签发一个证书临时使用,记录如下:
生成自签名证书
# 生成ca密钥
openssl genrsa -out ca.key 2048
# 生成csr 证书请求文件
openssl req -new -key ca.key -out ca.csr
# 生成根证书 CA证书
openssl req -new -x509 -key ca.key -out ca.crt -days 3650
# 生成服务端证书
openssl x509 -req -days 3650 -in ca.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
最终生成文件如下:
- ca.key 根证书密钥
- ca.csr 签发根证书请求文件
- ca.crt 根证书
- server.crt 服务端证书
- ca.srl 服务端证书序列号文件,使用根证书对服务端证书进行签名后生成.
https交互过程
简述https交互过程:
-
客户端访问https服务端,携带一个随机数
-
服务端将ssl证书发送给客户端,携带一个随机数, 客户端进行校验,是否非法证书,如果证书非法,会提示该连接非私密连接
-
客户端使用证书中的公钥加密一个随机数发送给服务端
服务端和客户端使用这三个随机数和相同的算法生成对称加密的密钥
之后的服务端和客户端的交互数据都使用这个密钥加密后进行传输.
总结
总结https交互过程及证书的作用:
证书的作用主要是保证服务端是真实可靠的服务端.举例说明:
我们在浏览器访问www.baidu.com的时候,如何确定返回的是真实的百度的服务器的内容? 如果我们使用的dns服务器被劫持,替换为一个虚假的服务,这种情况怎么处理?
使用证书就可以避免这个问题.
当浏览器访问www.baidu.com时,baidu.com会返回一个证书,浏览器拿到证书后根据证书内的信息去CA进行校验证书的有效性,如果有效则表示网站可靠,继续访问,这里面还有两种情况:
- 返回的证书被篡改:
-
- 证书里的签名信息是使用密钥加密过的,无法篡改
- 返回的证书是从服务端扒下来的,证书是真实的,怎么办?
-
- 证书里只有公钥,客户端还要使用公钥加密一个随机数发给服务端,服务端要用私钥解密后才能开始交互,而私钥只在真正的服务端才有,所以不存在这样的问题.