今天倒腾了下OpenSSL自制证书,这里做个记录。
我是使用的Mac OS,系统自带OpenSSL,OpenSSL使用的默认配置/System/Library/OpenSSL/openssl.cnf。
首先由于是默认配置,先按照默认配置的要求建立目录结构:
mkdir -p ./demoCA/{private,newcerts} touch ./demoCA/index.txt echo 01 > ./demoCA/serial
其中serail存放下一个证书的序列号,index.txt存放证书信息数据库。
然后生成CA证书的RSA密钥对:
openssl genrsa -des3 -out ./demoCA/private/cakey.pem 2048
参数解释:
genrsa:用于生成 RSA 密钥对的 OpenSSL 命令。
-des3:使用3-DES对称加密算法加密密钥对,该参数需要用户在密钥生成过程中输入一个口令用于加密。今后使用该密钥对时,需要输入相应的口令。如果不加该选项,则不对密钥进行加密。
-out ./demoCA/private/cakey.pem:令生成的密钥对保存到文件./demoCA/private/cakey.pem。
2048:RSA模数位数,在一定程度上表征了密钥强度。
接着生成CA证书请求:
为了获取一个 CA 根证书,我们需要先制作一份证书请求。先前生成的CA密钥对被用于对证书请求签名。
openssl req -new -days 365 -key ./demoCA/private/cakey.pem -out careq.pem
参数解释:
req:用于生成证书请求的OpenSSL命令。
-new:生成一个新的证书请求。该参数将令OpenSSL在证书请求生成过程中要求用户填写一些相应的字段。
-days 365:从生成之时算起,证书时效为365天。
-key ./demoCA/private/cakey.pem:指定./demoCA/private/cakey.pem为证书所使用的密钥对文件。
-out careq.pem:令生成的证书请求保存到文件 careq.pem。
最后通过对CA证书请求进行签名得到CA的证书:
在实际应用中,用户可以通过向知名CA递交证书请求来申请证书。但是在这里,我们需要建立的是一个根CA ,只能由我们自己来对证书请求进行签名。
openssl ca -selfsign -in careq.pem -out ./demoCA/cacert.pem
ca:用于执行CA相关操作的OpenSSL命令。
-selfsign:使用对证书请求进行签名的密钥对来签发证书,即自签名。
-in careq.pem:指定careq.pem为证书请求文件。
-out ./demoCA/cacert.pem:指定./demoCA/cacert.pem为输出的证书。
至此,我们已经生成了一个根证书./demoCA/cacert.pem以及其对应的RSA密钥对的私钥./demoCA/private/cakey.pem,接下来无论是FTPS、HTTPS还是其它什么需要使用证书的地方,都是可以直接使用这个证书的。
除了直接使用根证书,我们也可以选择用根证书签发新的证书来使用。
首先是生成新证书的RSA密钥对:
openssl genrsa -out newkey.pem 2048
此处因为我们架设HTTPS服务器需要使用其私钥,所以这里没有使用3-DES加密。
然后是生成新证书请求:
openssl req -new -days 365 -key newkey.pem -out newreq.pem
新证书请求使用先前生成的新密钥进行签名。
最后使用CA对新证书请求进行签名得到新证书:
openssl ca -in newreq.pem -out newcert.pem
注意此处由于签名需要使用的CA的私钥,而CA的私钥我们使用了3-DES加密,所以我们需要输入CA的私钥来完成此操作。
自此,我们就用我们自制的根证书签发了一个新的证书,通过这样的方式,我们还可以继续用根证书签发的二级证书再签发三级证书,完成证书的管理。
最后在写几个可能需要是用的命令:
查看证书:
openssl x509 -noout -text -in cert.pem
验证证书:
openssl verify -CAfile ./demoCA/cacert.pem hostcert.pem
对加密的私钥进行解密(Apache需要解密后的私钥):
openssl rsa -in encrypted_key.pem -out decrypted_key.pem
一步生成同时包含私钥和证书的文件:
openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
这个文件中由于已经包含了私钥,所以在使用的时候,可以只指定证书文件为此文件,而不用再同时指定私钥文件。