HTTPS
HTTPS = HTTP + TLS/SSL
TLS/SSL
SSL:Secure Sockers Layer,安全套接层
TLS:标准化之后的SSL
TLS
提供隐私和数据两个通信实体之前的完整性
由两层组成:TLS记录协议(TLS Record)和TLS握手协议(TLS Handshake)
单向认证 vs 双向认证
SSL的核心在于提供安全可信的通讯
实际应用中,通常有单向认证和双向认证两种实现方式
SSL单向认证
1 客户端:发送客户端SSL版本信息等
2 服务端:返回SSL版本信息等及服务器公钥
3 客户端:校验证书是否合法
验证证书是否过期、CA是否可靠等
4 客户端:发送对称加密方案给服务端
5 服务端:选择加密方式
6 服务端:将加密方案明文发送给客户端
7 客户端:产生随机码,生成对称加密密钥,使用服务端公钥加密,发送服务端
8 服务端:使用私钥解密,获得对称加密密钥
9 握手结束,对称加密,安全通信
SSL双向认证
1 客户端:发送客户端SSL版本信息等
2 服务端:返回SSL版本信息等及服务器公钥
3 客户端:校验证书是否合法
4 客户端:将自己的证书和公钥发送至服务端
5 服务端:校验客户端证书,获得客户端公钥
6 客户端:发送对接加密方案给服务端
7 服务端:选择加密方式
8 服务端:将加密方案使用客户端公钥加密后发送给客户端
9 客户端:使用私钥解密,获得加密方式,产生随机码,生成对称加密密钥,使用服务端公钥加密后,发送给服务端
10 服务端:使用私钥解密,获得对称加密密钥
11 握手结束,对称加密,安全通信
SSL构建
SSL核心的概念:ca、私钥、公钥、证书
私钥
私钥默认格式为pkcs1,一个简化的私钥生成命令:
openssl genrsa -out private.pem 3072
java对私钥格式有要求,需要转换为pkcs8格式,转换命令:
openssl pkcs8 -topk8 -inform PEM -in private.pem -outform PEM -nocrypt -out private-pkcs8.pem
如何将pkcs8格式证书还原成pkcs1格式?
openssl rsa -in private-pkcs8.pem -out pkcs1.pem
CA
认证中心,第三方认证提供方,为证书提供可靠性认证
开发过程中一般使用自签发证书进行测试,再使用正式签发的证书
CA在使用时,主要是使用ca证书,ca证书由ca key签发而来
生成自签发的CA证书
要素: CA私钥、CA CSR、签发证书
- 生成CA私钥
openssl genrsa -out cakey.pem 3072
- 生成自签证书
openssl req -new -x509 -key cakey.pem -out cacert.pem
这一步也可以拆分为两步
1 生成CSR
openssl req -new -key cakey.pem -out client.csr
2 签发证书
openssl x509 -req -in client.csr -signkey cakey.pem -out client.crt
中间根据提示输入Country Name
、State or Province Name
等等
如何查看证书内容?
openssl x509 -text -in cacert.pem
生成自签 CA证书
组成:CA根证书、签发客户端证书
创建CA根证书
- 1 创建CA目录
mkdir -p ~/ssl/{certs, newcerts, crl, private}
cd ~/ssl
touch index.text
ehco "01" > serial
- 2 修改openssl.cnf文件
自定义证书的和证书申请中的一些属性和扩展
cp /etc/ssl/openssl.cnf ~/ssl/.
vi ~/ssl/openssl.cnf
- 3 生成CA根证书和密钥
openssl req -new -x509 -newkey rsa:4096 -keyout cakey.key -out cacert.crt -config openssl.cnf -days 365
使用 X.509 证书结构生成证书,X.509 证书的结构是用 ASN1(Abstract Syntax Notation One)进行描述数据结构, X.509 证书编码格式主要有两种: .PEM 和.DER。
.DER 是二进制编码,可包含所有私钥、公钥和证书,是大多数浏览器的缺省格式,常见于 Windows 系统中的证书格式。
.PEM 是明文格式的, 以 “-----BEGIN CERTIFICATE----- 开头,已 -----END CERTIFICATE----- 结尾”, 中间是经过 base64 编码的内容, Apache 和 NGINX 服务器偏向于使用这种编码格式,也是 openssl 默认采用的信息存放方式。PEM 其实就是把 DER 的内容进行了一次 base64 编码。
此处通过命令生成扩展名为.crt 的根证书文件和扩展名为.key 的公钥,生成的证书和公钥可能是.PEM 编码格式,也可能是.DER 编码格式。
- 4 查看证书,编码、转码
查看密钥
openssl rsa -noout -text -in cakey.key
查看证书
openssl x509 -noout -text -in cacert.crt
编码格式转换
PEM转DER:openssl x509 -in cacert.crt -outform der -out cacert.der
DER转PEM:openssl x509 -in cacert.crt -inform der -outform pem -out cacert.pem
签发客户端证书
使用 OpenSSL 创建客户端证书时,请注意
创建私钥时,请将长度指定为 4096
创建证书时,对于 -extensions 参数,指定 usr_cert
- 1 生成客户端密钥
openssl genrsa -out client.key 4096
- 2 生成csr
openssl req -new -key client.key -out client.csr -config openssl.cnf
- 3 使用CA根证书签发客户端签发证书
openssl ca -in client.csr -out client.crt -cert cacert.crt -keyfile cakey.key -config openssl.cnf
- 4 把客户端证书和密钥保存为.pem格式
cat client.crt client.key > client.pem
生成正式证书
生成私钥
openssl genrsa -out product.key 3072
生成证书签发请求
openssl req -new -key product.key -out product.csr
将证书签发请求发送至CA,签发证书,这一步一般无法感知,大概的意思就是执行下面的签发命令
openssl ca -in product.csr -out product.crt -days 365
上面这一条还是隐藏了很多细节,再看下面的
签名过程需要 CA 的证书和私钥参与,最终颁发一个带有 CA 签名的证书
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in product.csr -out product.crt
这个product.crt
就是正式可以使用的证书了
CA自身的crt的问题有点像“鸡”和“蛋”的问题,实际上初始的crt是自签发的
然后再以“合法”的形式,给其他的ca授权
这是个一本万利的可持续的生意
来个SSL证书认证的例子
生成认证私钥/公钥
- 生成服务器端私钥
openssl genrsa -out server.key 1024
- 生成服务器端公钥
openssl rsa -in server.key -pubout -out server.pem
- 生成客户端私钥
openssl genrsa -out client.key 1024
- 生成客户端公钥
openssl rsa -in client.key -pubout -out client.pem
生成自签发 CA 证书
- 生成 CA 私钥
openssl genrsa -out ca.key 1024
- 生成CSR
openssl req -new -key ca.key -out ca.csr
- 生成CA证书
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
使用上面的命令会提示输入
➜ keys openssl req -new -key ca.key -out ca.csr
You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Zhejiang
Locality Name (eg, city) []:Hangzhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My CA
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:
注意,这里的 Organization Name (eg, company) [Internet Widgits Pty Ltd]: 后面生成客户端和服务器端证书的时候也需要填写,不要写成一样的!!!可以随意写如:My CA, My Server, My Client。
Common Name (e.g. server FQDN or YOUR name) []: 这一项,是最后可以访问的域名,这里为了方便测试,写成 localhost
生成最终服务器端证书和客户端证书
- 生成证书
签名过程需要 CA 的证书和私钥参与,最终颁发一个带有 CA 签名的证书
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt
- 再转换一个pkcs8格式的证书
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in polyglot.key -out polyglot-pkcs8.key