如何使用openssl生成相关证书
(1)自签CA证书
#生成根证书私钥(pem文件)
openssl genrsa -out cakey.pem 2048
#生成根证书签发申请文件(csr文件)
openssl req -new -key cakey.pem -out ca.csr -subj “/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myCA”
#自签发根证书(cer文件)
openssl x509 -req -days 365 -sha1 -extensions v3_ca -signkey cakey.pem -in ca.csr -out cacert.pem
(2)服务端私钥和证书
#生成服务端私钥
openssl genrsa -out serverkey.pem 2048
#生成证书请求文件
openssl req -new -key serverkey.pem -out server.csr -subj “/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myServer”
#使用根证书签发服务端证书
openssl x509 -req -days 365 -sha1 -extensions v3_req -CA ./cacert.pem -CAkey ./cakey.pem -CAserial ca.srl -CAcreateserial -in server.csr -out servercert.pem
#使用CA证书验证server端证书
openssl verify -CAfile ./cacert.pem servercert.pem
(3)客户端私钥和证书
#生成客户端私钥
openssl genrsa -out clientkey.pem 2048
#生成证书请求文件
openssl req -new -key clientkey.pem -out client.csr -subj “/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myClient”
#使用根证书签发客户端证书
openssl x509 -req -days 365 -sha1 -extensions v3_req -CA ./cacert.pem -CAkey ./cakey.pem -CAserial ./ca.srl -in client.csr -out clientcert.pem
#使用CA证书验证客户端证书
openssl verify -CAfile ./cacert.pem clientcert.pem
将PEM转成CRT格式
openssl x509 -outform der -in ./quectel/cacert.pem -out ./quectel/cacert.crt
生成的文件如下图:
这些文件需要放到server端文件夹,其中ca_cert是双方都认可的ca公钥,在client端发起连接时,需要提前配置:ca_cert、client_cert(客户端公钥)、client_key(客户端私钥)。
server端需要配置:ca_cert、server_key(服务器私钥)、client_cert。
握手过程:
其中server_hello过程中,server端发送server_cert公钥信息给client端。用于client端在交换**时加密第三个随机数,然后server端可以利用自己的私钥解密,双方根据三个随机数生成相同的预主**。若服务器要求验证客户端证书,则会在serverhello之后发送certificate verify,client端会发送clent_cert,然后client端会在Client Key Exchange Message之后发送携带有前面所发消息用客户端证书私钥所做的签名-Certificate verify,服务器收到此信息可利用公钥验证;在握手的最后client发送的finished中含有前面发送的所有内容的hash值,用来供服务器校验。
自签署CA证书的用处:
使用openssl生成的自签署CA证书,它的私钥用于签名client端的公钥和server端的公钥,生成已签名文件client_cert、server_cert,在连接过程中client端和server端都配备了CA公钥cacert,可以解密得到相应的公钥信息,从而验证对方身份。