一、创建自签 CA 证书,主要分为两个部分: 创建CA 根证书及签发客户端证书。具体每个目录存储什么信息,可以查看 openssl 的配置文件:vi /etc/ssl/openssl.cnf
1、创建 CA 目录
mkdir -p ~/ssl/demoCA/{certs,newcerts,crl,private}
cd ~/ssl/demoCA
Touch index.txt
echo “01” > serial

2、修改 openssl.cnf 文件
建议拷贝 openssl.cnf 文件到自定义文件夹下,这样可以自定义证书和证书申请中的一些属性和扩展,如秘钥扩展等:
sudo cp /etc/ssl/openssl.cnf ~/ssl/openssl.cnf
vi ~/ssl/openssl.cnf

3、生成 CA 根证书及密钥
openssl req -new -x509 -newkey rsa:4096 -keyout cakey.key -out cacert.crt -config openssl.cnf -days 365

BTW:
使用 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、Linux 查看证书信息,编码,转码:
4.1、查看公钥的内容命令为:
openssl rsa -noout -text -in cakey.key

4.2、查看证书的内容命令为:
openssl x509 -noout -text -in cacert.crt

4.3、证书编码格式转换:
PEM 转为 DER:openssl x509 -in cacert.crt -outform der -out cacert.der
DER 转为 PEM:openssl x509 -in cert.crt -inform der -outform pem -out cacert.pem

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

1、生成 4096 bit 的客户端私钥
openssl genrsa -out client.key 4096

2、用该客户端私钥生成证书签名请求,扩展名.csr
openssl req -new -key client.key -out client.csr -config openssl.cnf

3、使用 CA 根证书签发客户端证书。(当使用 CA 签发客户端证书时,就会加上 usr_cert 的证书扩展项)
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

5、如需导出到windows供VPN客户端使用, 需把客户端证书转换成.pfx 格式
openssl pkcs12 -export -inkey client.key -in client.pem -out client.pfx