https的原理和基础就是非对称加密。而非对称加密除了加密之外主要有以下功能
- 确定消息来源:对方公钥解密
- 发消息给特定目标:对方公钥加密
有了这些,我们就可以安全的通信了。但问题来了:如何传输我们的公钥信息。证书就是为了解决问题。我对证书的理解是:
-
“证书”是由“证书”认证的“证书认证请求”
-
“证书认证请求”是一些需要认证信息的集合,其中包括公钥
证书是递归的,在最顶端的叫做根证书,直接安装在客户端。客户端信任这些根证书,也信任所有根证书的子孙。这也是需要去ca申请证书的原因,因为ca掌握了根证书。获取证书的一般流程是这样的:
- 生成一对密钥
- 由公钥和一些必要信息生成“证书认证请求”
- ca验证你证书认证请求里面所有内容的真实性
- ca用私钥签名生成证书
“签名”是对“证书认证请求”的所有内容进行hash之后用私钥对hash进行加密得到的字符串,可以确保内容完整的被密钥持有者授权。
如果是测试用途或者只需要加密,可以不问ca申请证书,直接由自己签名自己,就是自签名证书,自签名证书可以对流量进行加密,但是客户端无法认证服务端身份。我觉得这种证书也可以一用,总比http安全一些。但是浏览器普遍会有安全提示,这点会让人误以为这比普通http站点还不安全。
下面演示一下最简单的自签名
openssl genrsa > ssl.key #生成一对密钥(包括公钥和密钥)
openssl req -new -key ssl.key > ssl.csr #使用公钥生成请求
openssl x509 -req -in ssl.csr -signkey ssl.key > ssl.crt #使用私钥进行签名