SSL证书签发

2022-02-28  本文已影响0人  visionarywind

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、签发证书

这一步也可以拆分为两步
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根证书
mkdir -p ~/ssl/{certs, newcerts, crl, private}
cd ~/ssl
touch index.text
ehco "01" > serial
cp /etc/ssl/openssl.cnf ~/ssl/.
vi ~/ssl/openssl.cnf

使用 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 编码格式。

签发客户端证书

使用 OpenSSL 创建客户端证书时,请注意
创建私钥时,请将长度指定为 4096
创建证书时,对于 -extensions 参数,指定 usr_cert

生成正式证书

生成私钥
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证书认证的例子

生成认证私钥/公钥
生成自签发 CA 证书

使用上面的命令会提示输入
➜ 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

生成最终服务器端证书和客户端证书

参考链接

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

上一篇 下一篇

猜你喜欢

热点阅读