openssls

Ling Yu
Ling Yu

自建 CA

生产根密钥

openssl genrsa -out ./private/cakey.pem 2048

生成 CA 证书

在 PKI 体系中,CA 的签名可以自签名或从父 CA 获取,这取决于设计的架构。在本例中,我们使用自签名的方式创建 CA 的根证书

生成证书请求

openssl req -new -sha256 -key  ./private/cakey.pem -out  ./private/cakey.csr -config openssl.cnf

生成自签名根证书

openssl x509 -req -sha256 -days 3650 -in ./private/cakey.csr -signkey ./private/cakey.pem -out cacert.crt 
# 有问题

或者直接一步

openssl req -new -x509 -days 3650 -key ./private/cakey.pem -out cacert.crt -config openssl.cnf

有了证书之后,我们可以使用下面的命令查看证书信息

openssl x509 -in cacert.crt -text | less

添加信任

# cat cacert.pem >> /etc/pki/tls/certs/ca-bundle.crt     //centos
# mv cacert.pem /usr/local/share/ca-certificates/cacert.pem && update-ca-certificates //ubuntu

初始化证书库

对于 CA 来说,需要记录其已经发放的证书,因此需要先初始化相关的文件,在 ubuntu 中,openssl 的配置文件在/usr/lib/ssl/openssl.cnf 中,内有一个属性 dir 是 CA 保存证书记录的地方,我们可以修改这个地址,之后执行下面的命令:

# 进入cnf中的dir文件夹,创建文件
cd `dir`
touch index.txt && touch serial && echo 01 > serial

客户端向 CA 请求证书

客户端相关的操作都在 client 目录中处理

生成密钥

openssl genrsa -out client.pem 2048

创建证书请求文件

根据私钥文件,生成证书请求文件 CSR,CSR 中一般会包含请求者的公钥,这里的请求者就是客户端,由于客户端的私钥文件可推导出公钥,再加上下面的命令执行时要求输入的组织信息,就可以生成 CSR 了。

openssl req -new -out client.csr -key client.pem -config openssl.cnf

查看 CSR 文件信息

openssl req -in client.csr -text | less

从 CA 获取证书

cd ../CA
openssl ca -in ../client/client.csr -out ../client/client.crt -days 365 -keyfile ./private/cakey.key -cert cacert.crt -config openssl.cnf

ca 命令可以用来发放证书,-in 指定了输入的 csr 文件,-out 是发放给客户端的证书 -keyfile 是 ca 的根证书私钥文件,-cert 是 CA 的根证书

校验证书

openssl verify -CAfile cacert.crt ../client/client.crt

如果返回 OK,说明证书校验成功。

生成pdf签名数字证书

接上步获取的client.crt和client.pem

openssl pkcs12 -export -in client.crt -inkey client.pem -out my.p12

安装证书,即可用来签名

文件签名

openssl genrsa -out privatekey.pem 2048 # 生成密钥
openssl dgst -sha256 -sign privatekey.pem -out t.txt.signature t.txt # 对t.txt进行签名,并将签名结果保存到t.txt.signature中
openssl rsa -in privatekey.pem -outform PEM -pubout -out publickey.pem # 导出公钥
openssl dgst -sha256 -verify publickey.pem -signature t.txt.signature t.txt # 验证签名