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 NameState 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
查看域名证书信息

openssl s_client -connect www.google.com.hk:443

参考链接

TLS单向认证和双向认证的区别

SSL证书的工作原理 (trustasia.com)

标签: none

添加新评论