TLS初探(3)证书生成

      上一节讲了各种证书的格式,在此基础上本次来探究一下证书的生成。本次使用openssl进行相应的证书管理,具体openssl的安装说明等基本知识就不在此赘述。

       此次主要流程就是先生成一个自签名根证书,然后利用自签名根证书去签发一个服务器证书,具体步骤如下:


1.  生成根证书之前,首先需要进行私钥生成(以RSA为例)

openssl genrsa -out ca.key 1024

该密钥默认使用PKCS#1格式,并使用PEM编码输出文件,具体秘钥内容可通过以下命令查看:

openssl rsa -in ca.key -text

PEM格式私钥转为DER格式命令如下:

openssl rsa -in ca.key -outform der -out ca-der.key

查看DER格式的私钥文件,指定输入格式为der即可:

openssl rsa -inform der -in ca-der.key -text

如需将PKCS#1密钥转换为PKCS#8,则使用如下命令并设置“提取密码”:

openssl pkcs8 -topk8 -in ca.key -out ca-pkcs8.key

2. 生成自签名根证书

openssl req -new X509 -key ca.key -out ca.crt -days 3650

命令输入后会让你输入证书拥有方的DN信息(DN说明可见上一遍博文),完毕后即生成自签名根证书,可使用以下命令查看证书内容:

openssl x509 -in ca.crt -text

查看后可注意到Subject和Issuer中DN相同,即为自签名证书。


3. 生成服务器证书私钥

openssl genrsa -out server.key 1024

4. 生成签发请求文件(CSR)

openssl req -new -key server.key -out server.csr

此处需要输入申请方的DN信息,同时此处提供了server.key,但是私钥信息并不会包含在server.csr中,可以放心,此处仅仅是用于签名和公钥发送。同时,在输入信息的过程中,还会要求输入一个Challenge Password,这个需要和你的证书签发方事先协商好,从而用户证书签发方进行身份确认,此参数并不参与实际证书生成。

如果需要查看CSR,可使用如下命令:

openssl req -noout -text -in server.csr

5. 签发方使用CSR签发证书

openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key days 3650

具体签发的时候openssl如报找不到文件或文件夹之类的错误,可常见对应文件:

mkdir -p ./demoCA/newcerts
touch demoCA/index.txt
touch demoCA/index.txt.attr
touch demoCA/serial
echo 01>democA/serial

上述文件和文件夹主要是进行CA签发证书管理的,demoCA/serial文件用户CA签发证书时,证书的序列号管理,确保其不重复(具体可参照上一博文);index主要是记录签发的DN信息,确保不重复签发(也可通过配置设置为可重复签发,在此不赘述)。由此可看出,最好是每一个CA证书有单独的目录,同时在目录下建立demoCA文件夹,从而对每个CA签发的证书进行管理确认。

此外,签发的时候如果提示"The *** is different between",则需要调整openssl.cfg中的签发策略:

# For the CA policy
[ policy_match ]
countryName		= match
stateOrProvinceName	= optional
organizationName	= optional
organizationalUnitName	= optional
commonName		= supplied
emailAddress		= optional

如标为match则表示签发方与申请方的对应DN信息需要完全匹配方可签发,签发者可根据各自需要自行调整。


6. p12证书生成与提取

 将 pem 证书和私钥转 pkcs#12 证书(会要求输入提取密码和私钥加密密码)

openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12

同时,也可以将证书上次ca证书一并导入同一p12中,从而包含可信证书链

openssl pkcs12 -export -in server.crt -inkey server.key -chain -CAfile ca.crt -out server-all.p12

提取所有证书和私钥文件,可用如下命令(证书和私钥在同一文件中,PEM格式):

openssl pkcs12 -in server.p12 -out out/server.pem

如过想仅提取私钥或者证书,可在上述命令后添加“-nocerts”或"-nokeys"。

如果希望仅提取server证书,则使用如下命令:

openssl pkcs12 -in server-all.p12 -nokeys -clcerts -out out/cert.pem

如果希望提取CA证书,则使用如下命令:

openssl pkcs12 -in server-all.p12 -nokeys -cacerts -out out/cacert.pem

7. jks证书

jks证书后续预计在研究Android证书时将进一步说明,本次仅说明以下与p12证书之间的相互转换,注意此处使用为JDK的keytool工具。

p12 --> jks

keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore server.jks

jks --> p12

keytool -importkeystore -srckeystore server.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore server.p12
发布了42 篇原创文章 · 获赞 9 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/jjxojm/article/details/81277107