OpenSSL创建带SAN扩展的证书并进行CA自签
什么是 SAN
SAN(Subject Alternative Name) 是 SSL 标准 x509 中定义的一个扩展。使用了 SAN 字段的 SSL 证书,可以扩展此证书支持的域名,使得一个证书可以支持多个不同域名的解析。
来看看百度的证书,百度证书的扩展域名有这么多,其中还有了*.hao123.com,那我们再看看www.hao123.com的证书
发现的确是用的前面的百度证书
所以SAN带来的好处就可以看出来了,一个证书可以用在各种不同的域名下,不需要一个域名买一个证书了。
利用OpenSSL创建证书
因为是本地环境,直接用OpenSSL给自己颁发一个CA根证书用于后面给服务器做CA签署。
1. 生成CA密钥
openssl genrsa -des3 -out ca.key 2048
1
生成CA根证书
openssl req -sha256 -new -x509 -days 365 -key ca.key -out ca.crt \
-subj "/C=CN/ST=GD/L=SZ/O=lee/OU=study/CN=testRoot"
1
2
生成服务器密钥
openssl genrsa -des3 -out server.key 2048
1
生成服务器证书请求文件
openssl req -new \
-sha256 \
-key server.key \
-subj "/C=CN/ST=GD/L=SZ/O=lee/OU=study/CN=bdstatic.com" \
-reqexts SAN \
-config <(cat /etc/pki/tls/openssl.cnf \
<(printf "[SAN]\nsubjectAltName=DNS:*.bdstatic.com,DNS:*.baidu.com")) \
-out server.csr
1
2
3
4
5
6
7
8
5.CA签署服务器证书
openssl ca -in server.csr \
-md sha256 \
-keyfile ca.key \
-cert ca.crt \
-extensions SAN \
-config <(cat /etc/pki/tls/openssl.cnf \
<(printf "[SAN]\nsubjectAltName=DNS:*.bdstatic.com,DNS:*.baidu.com")) \
-out server.crt
1
2
3
4
5
6
7
8
之后把生成好的服务器证书和服务器密钥在服务器(ngnix,tomcat)里配置好,并且把ca.crt证书导入到浏览器的受信任的根证书颁发机构里,在浏览器访问就不会有红叉叉了。
注意事项
-subj “/C=CN/ST=GD/L=SZ/O=lee/OU=study/CN=testRoot”这行可以不要,会有命令交互填写相关信息。
2. 哈希算法不要使用sha1,因为Chrome浏览器下会提示不安全,上面都是用的sha256。
3. /etc/pki/tls/openssl.cnf文件是缺省的OpenSSL配置文件,可能环境不同路径也不同。
4. 服务器证书请求文件的国家,省,市要和CA证书一致,这个在openssl.cnf默认配置中指定了,可以修改。
1. 关于私钥的加密格式,因为笔者是在netty里使用的ssl协议,而netty仅支持PKCS8格式的私钥(见http://netty.io/wiki/sslcontextbuilder-and-private-key.html),需要对密钥格式进行转换
//私钥转成PKCS8格式
openssl pkcs8 -topk8 -nocrypt -in server.key -out server_pri.pem
1
2
代码如下
SslContext serverSslCtx = SslContextBuilder.forServer(new File("E:/server.crt"),new File("E:/server_pri.pem")).build();
1
附录
PKCS1与PKCS8格式互转
//默认生成PKCS1格式PEM编码私钥
openssl genrsa -out ca.key 2048
//转换成PKCS8
openssl pkcs8 -topk8 -nocrypt -in ca.key -out ca_private.pem
//PKCS8转换成PKCS1
openssl rsa -in ca_private.pem -out ca.key
1
2
3
4
5
6
PEM与DER互转
//PEM转DER
openssl rsa -in ca.key -outform DER -out ca_private.der
openssl pkcs8 -topk8 -nocrypt -inform PEM -outform DER -in ca.key -out ca_private.der
//DER转PEM
openssl rsa -in ca_private.der -inform DER -outform PEM -out ca.key
1
2
3
4
5
PKCS7转PKCS12(tomcat证书)
//需加密码保护
openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -name tomcat -out server.p12
//springboot SSL配置
server.port= 8443 //端口
server.ssl.key-store=classpath:server.p12 //证书路径
server.ssl.key-store-password= 123456 //p12证书密码
---------------------
作者:liwei2633
来源:CSDN
原文:https://blog.csdn.net/dotalee/article/details/78041691
版权声明:本文为博主原创文章,转载请附上博文链接!