一、证书格式
- X.509:是一种基本的数字证书标准,定义了证书中应该包含哪些内容。它只有公钥,常见的编码格式如 PEM和 DER。
- p7:一般是把证书分成两个文件,一个公钥一个私钥。一般是分发公钥用。
- p12:使用PKCS#12 标准定义,包含了公钥和私钥的二进制格式的证书形式(私钥用密码加密),以 .pfx 作为证书文件后缀名
- DER :文件是DER 编码的二进制格式,证书中没有私钥。以 .der、.cer 作为证书文件后缀名。
- PEM:一般是Base64 编码的文本格式。可以存放私钥,多个公钥、私钥可以被包含到一个文件中。内容包含前缀---begin---、----end----。以 .cer 、.key、.pub为文件后缀名。OpenSSL 使用 PEM 格式来存放各种信息,也是 CA颁发证书最常用的格式。
- keystore:keytool生成证书的存储库,用来存储若干条目,每一条目包含公私钥,主体信息等。默认为用户目录下.keystore,相当于一个有密码保护的文件。
- truststore:与keystore格式相同,但是为区分只用来存放信任的证书如CA,不存密钥等信息。
- .jks:二进制格式,同时包含证书和私钥,一般有密码保护。
- .csr:证书请求文件格式,包含公钥和主体信息,发给ca,ca用私钥对内容签名并制作成证书返回。keytool在生成csr文件时需要指定证书(即公钥与主体信息)。
- .crt:一般用于linux系统的证书格式,包含公钥和主体信息。可以是二进制格式,可以是文本格式。
二、OpenSSL
查看版本信息:
openssl version
查看证书信息
openssl x509 -in server-cert.pem -text -noout
验证证书和私钥是否匹配
由于证书可能以不同的格式(如PEM或DER)输出的,无法直接比较文本内容。通过计算哈希值(如MD5、SHA-256)是否相同判断证书和私钥是否匹配。
openssl x509 -in certificate.crt -pubkey -noout | openssl md5
openssl rsa -in private.key -pubout | openssl md5
验证证书的有效性
检查证书链和信任根。简单的验证证书签名是否有效
openssl verify -CAfile CA_certificate.crt certificate.crt
将PFX文件转为一个PEM文件。
PFX转PEM后文件中包含认证证书和私钥,需要把它们分开存储。
openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes
CER转DER
openssl x509 -in cert.crt -outform der -out cert.der
DER转PEM
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
1、生成自签名CA证书
- 生成CA私钥
openssl genrsa -aes256 -passout pass:$password -out ca-private-key.pem 4096
- 生成CA证书
openssl req -new -x509 -days 36500 -key ca-private-key.pem -passin pass:$password -sha256 -out ca.pem -subj "/C=CN/ST=BeiJing/L=BeiJing/O=$Organizationa/CN=$ip"
2、使用自签名证书签发服务器证书
- 生成服务端私钥
openssl genrsa -out server-private-key.pem 4096
- 生成服务器证书的CSR
openssl req -subj "/CN=$ip" -sha256 -new -key server-private-key.pem -out server.csr
- 使用CA证书和私钥签发服务器证书
openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-private-key.pem -passin "pass:$password" -CAcreateserial -out server-cert.pem
3、使用自签名证书签发客户端证书
- 生成客户端私钥
openssl genrsa -out key.pem 4096
- 生成客户端证书的CSR
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
- 使用CA证书和私钥签发客户端证书
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$password" -CAcreateserial -out cert.pem -extfile extfile-client.cnf
三、keytool
keytool是Java的数据证书管理工具,可存放公钥、私钥、证书。文件通常是.jks格式。.keystore是一种通用的密钥库格式,.jks是.keystore的一种实现。
- 生成密钥对(签名文件)
keytool -genkeypair -v -storetype PKCS12 -keysize 2048 -dname “C=CN/ST=BeiJing/L=BeiJing/O=$Organizationa/CN=$ip” -alias $signtest4 -keyalg RSA -validity 36500 -destalias $signtest4 -keypass $a123456 -keystore signtest4.jks -storepass $a123456
- 生成密钥(对称加密方式)
keytool -genseckey -v -storetype PKCS12 -alias signtest5 -keypass 123456 -keyalg DES -keysize 56 -keystore ./signtest5.jks -storepass 123456
- 为存在的keystore生成证书请求文件CSR
keytool -certreq -alias mydomain -keystore keystore.jks -file mydomain.csr
- 导入根证书到keystore
keytool -import -trustcacerts -alias root -file mydomain.crt -keystore keystore.jks
- 导入可信任证书到keystore
keytool -import -trustcacerts -alias mydomain -file mydomain.crt -keystore keystore.jks
- 查看单个证书
keytool -printcert -v -file mydomain.crt
- 列出keystore存在的所有证书
keytool -list -v -keystore keystore.jks
- 提取公钥证书
将证书信息打印,复制---begin---、----end---的内容。如果某个别名中存的是证书链,自上而下第一个为自己的证书,然后是中间证书、根证书。复制证书链的所有证书然后保存到一个xxx.pem文件中,注意:在pem中证书的顺序自上而下第一个是根证书,最后一个是自己的证书,顺序错误会导致验证失败。
keytool -list -rfc -keystore yao.jks -storepass 123456
- 提取证书私钥
不能直接得到 jks文件中的私钥,需要通过openssl将jks文件转换成pfx格式,然后再进行提取
keytool -importkeystore -srckeystore <jks-file> -destkeystore <pkcs12-file>.p12 -deststoretype PKCS12
openssl pkcs12 -in <pkcs12-file>.p12 -nocerts -nodes -out <private-key>.key
四、国密
- 国密算法是基于SM2公钥密码算法的一种非对称加密算法。
openssl中,支持sm2的公私钥的生成方法,不过其名称并不是sm2的字面意思,而是ec - 生成密钥对
openssl ecparam -name sm2 -genkey -noout -out sm2key.pem
- 证书请求文件 CSR
openssl req -new -key sm2key.pem -out sm2csr.pem
- 签发自签名证书
openssl x509 -req -in sm2csr.pem -signkey sm2key.pem -out sm2cert.pem
- 将证书转换为PKCS#12格式
openssl pkcs12 -inkey sm2key.pem -in sm2cert.pem -export -out sm2cert.p12