数字证书
一、 知识储备
- 编码方式
DER:无报头,二进制编码
PEM:有报头,报头用ASCII编码,内容用base64编码
DER 和 PEM 为文件编码方式!
- 文件格式
crt:证书文件,通常为PEM编码
cer:证书文件,通常为DER编码
key:秘钥文件,通常为PEM编码
csr:证书请求文件,通常为PEM编码
jks:java证书库
pfx/p12:Windows的IIS用,为DER编码,linux上通常密钥与证书分离,此格式文件将密钥与证书合在一起存放,提取信息需要密码,功能与jks类似
crl:证书吊销列表
二、常用命令
1. 创建数字证书
keytool 生成CA自签名证书
#先用keytool创建一个放入jks中的CA自签名证书
keytool -genkeypair -alias server -keypass changeit -storepass changeit -dname "C=CN,ST=GD,L=SZ,O=vihoo,OU=dev,CN=vihoo.com" -keyalg RSA -keysize 2048 -validity 3650 -keystore server.keystore
#再用keytool导出其中的证书
keytool -alias server -exportcert -keystore server.keystore -file server.cer -storepass changeit
openssl生成CA自签名证书
#使用openssl生成CA自签名证书
# private key
openssl genrsa -out ca.key 2048
# generate csr
openssl req -new -key ca.key -out ca.csr -subj "/C=CN/ST=GD/L=SZ/O=ca/OU=dev/CN=ca.com"
# generate certificate
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt
#使用一条命令直接生成证书请求文件
openssl req -out ca.crt -new -newkey rsa:2048 -nodes -keyout ca.key -x509 -days 3650 -subj "/C=CN/ST=GD/L=SZ/O=ca/OU=dev/CN=ca.com"
openssl生成CA签名的用户证书
#首次执行需要先创建CA目录,否则生成证书报错 "./demoCA/newcerts: No such file or directory"
cp /etc/ssl/openssl.cnf .
mkdir -p ./demoCA/newcerts
touch demoCA/index.txt
touch demoCA/serial
echo 01 > demoCA/serial
#使用openssl生成CA签名的用户证书
# private key
openssl genrsa -out server.key 2048
# generate csr
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=ca/OU=dev/CN=server.com"
# generate certificate
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -batch
#若报错 "failed to update database",执行以下任意一条命令,或者使用CN不同的 csr 文件
sed -i 's/unique_subject = yes/unique_subject = no/g' demoCA/index.txt.attr
cat /dev/null > demoCA/index.txt
openssl生成吊销列表
# 首次执行需要先创建目录,移入根证书文件
mkdir -p ./demoCA/private
cp ca.key ./demoCA/private/cakey.pem
cp ca.crt ./demoCA/cacert.pem
echo '00' >./demoCA/crlnumber
#吊销证书
openssl ca -revoke server.crt
#生成吊销列表
openssl ca -gencrl -out server.crl
openssl生成证书链
#生成根CA
openssl req -out rootCA.crt -new -newkey rsa:2048 -nodes -keyout rootCA.key -x509 -days 3650 -subj "/C=CN/ST=GD/L=SZ/O=ca/OU=dev/CN=rootCA.com"
#生成二级CA
openssl genrsa -out secondCA.key 2048
openssl req -new -key secondCA.key -out secondCA.csr -subj "/C=CN/ST=GD/L=SZ/O=ca/OU=dev/CN=secondCA.com"
openssl ca -extensions v3_ca -in secondCA.csr -out secondCA.crt -cert rootCA.crt -keyfile rootCA.key -batch
#生成三级CA
openssl genrsa -out thirdCA.key 2048
openssl req -new -key thirdCA.key -out thirdCA.csr -subj "/C=CN/ST=GD/L=SZ/O=ca/OU=dev/CN=thirdCA.com"
openssl ca -extensions v3_ca -in thirdCA.csr -out thirdCA.crt -cert secondCA.crt -keyfile secondCA.key -batch
#签名服务证书(普通私钥)
openssl genrsa -out src.key 2048
openssl req -new -key src.key -out src.csr -subj "/C=CN/ST=GD/L=SZ/O=ca/OU=dev/CN=src.com"
openssl ca -in src.csr -out src.crt -cert thirdCA.crt -keyfile thirdCA.key -batch
#签名服务证书(加密私钥)
openssl genrsa -out src.key 2048
openssl pkcs8 -in src.key -topk8 -out encsrc.key -passout pass:changeit
openssl req -new -key encsrc.key -out encsrc.csr -subj "/C=CN/ST=GD/L=SZ/O=ca/OU=dev/CN=encsrc.com" -passin pass:changeit
openssl ca -in encsrc.csr -out encsrc.crt -cert thirdCA.crt -keyfile thirdCA.key -batch
#生成证书链
cat rootCA.crt secondCA.crt thirdCA.crt > chain.crt
2. 证书内容查看
#使用keytool查看cer证书
keytool -printcert -file server.cer
#使用keytool查看crt证书
keytool -printcert -file server.crt
#使用openssl查看cer证书
openssl x509 -inform DER -text -in server.cer
#使用openssl查看crt证书
openssl x509 -text -noout -in server.crt
#使用openssl查看吊销列表
openssl crl -text -in server.crl
3. 证书格式转换
#cer转crt
openssl x509 -inform DER -in server.cer -out server1.crt
#crt转cer
openssl x509 -in server.crt -outform DER -out server1.cer
4. 证书合并
#合并俩crt证书
cat server.crt server1.crt > server2.crt
#合并俩cer证书
cat server.cer server1.cer > server2.cer
5. 将数字证书导入jks
#导入cer证书至jks
keytool -import -file server2.cer -noprompt -alias servercer -keystore keystore.jks -storepass changeit
#导入crt证书至jks
keytool -import -file server2.crt -noprompt -alias servercrt -keystore keystore.jks -storepass changeit
#导入jks证书至jks
keytool -importkeystore -noprompt -deststorepass changeit -destkeystore dest.keystore -srckeystore src.keystore -srcstorepass changeit -srckeypass changeit -destalias triagen -alias src.server
#将p12证书导入jks
keytool -importkeystore -noprompt -deststorepass changeit -destkeystore dest.keystore -srckeystore src.p12 -srcstorepass changeit -srckeypass changeit -srcstoretype PKCS12 -destalias triagen -alias src.server
#将证书链证书导入jks
cat chain.crt encsrc.crt > all.crt
openssl pkcs12 -export -inkey encsrc.key -in all.crt -name chaincert -out chain.p12 -passin pass:changeit -passout pass:changeit
keytool -importkeystore -noprompt -deststorepass changeit -destkeystore dest.keystore -srckeystore chain.p12 -srcstorepass changeit -srckeypass changeit -srcstoretype PKCS12 -destalias triagen -alias chaincert
6. 证书库生成
#jks证书库生成
keytool -genkeypair -alias server -keypass changeit -storepass changeit -dname "C=CN,ST=GD,L=SZ,O=vihoo,OU=dev,CN=vihoo.com" -keyalg RSA -keysize 2048 -validity 3650 -keystore server.keystore
#pkcs12证书库生成
keytool -genkeypair -alias server -keypass changeit -storepass changeit -storetype PKCS12 -dname "C=CN,ST=GD,L=SZ,O=vihoo,OU=dev,CN=vihoo.com" -keyalg RSA -keysize 2048 -validity 3650 -keystore src.p12
7. 证书库查看
#keytool查看jks证书库
keytool --list -rfc -keystore keystore -storepass changeit
#keytool查看p12证书库
keytool --list -v -storetype PKCS12 -keystore keystore.p12 -storepass changeit
#keytool查看单个证书信息
keytool --list -rfc -keystore keystore -storepass changeit -alias mykey
三、参考链接:
1、如何从不同扩展名的数字证书中提取明文信息? *.pem *.der *.crt *.cer *.key之间的区别是什么?...
2、 生成带保护口令的私钥
3、 Creating a password protected PKCS #12 file for certificates