目的
記錄常用的數(shù)據(jù)證書(shū)格式,以及如何生成數(shù)字證書(shū)和進(jìn)行格式轉(zhuǎn)換
目錄
- 生成證書(shū)
- 轉(zhuǎn)換格式
- 文件格式
生成證書(shū)
keytool
# 創(chuàng)建證書(shū)倉(cāng)庫(kù)與私鑰
# -dname CN(Common Name), 可以是域名, 參考 HostnameVerifier
keytool -genkey -alias my -keysize 2048 -validity 36500 -keyalg RSA -dname "CN=localhost" -keypass keypass -storepass storepass -keystore my.jks
# 導(dǎo)出自簽名證書(shū)
keytool -export -alias my -keystore my.jks -storepass storepass -file my.cer
# 導(dǎo)入信任證書(shū)(對(duì)方證書(shū)或CA根證書(shū))
keytool -import -trustcacerts -alias trust1 -file peer.cer -storepass storepass -keystore my.jks
# 查看證書(shū)
keytool -list -keystore my.jks -storepass storepass
openssl
CA根證書(shū)
# 創(chuàng)建CA私鑰
openssl genrsa 2048 > ca.key
# 創(chuàng)建CA證書(shū)
openssl req -new -x509 -key ca.key -out ca.crt -nodes -days 3650
CA簽名證書(shū)
# 創(chuàng)建私鑰
openssl genrsa 2048 > my.key
# 創(chuàng)建生成證書(shū)請(qǐng)求
openssl req -newkey rsa:2048 -days 3650 -nodes -keyout my.key -out my.csr
# 用CA根證書(shū)簽發(fā)證書(shū)
openssl x509 -req -days 3650 -in my.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out my.crt
# 也可以生成自簽名證書(shū)
openssl x509 -req -days 3650 -in my.csr -signkey my.key -out my.self.crt
# 驗(yàn)證證書(shū)
openssl verify -CAfile ca.crt my.crt
轉(zhuǎn)換格式
- JKS和PKCS12
# JKS to PKCS12
keytool -importkeystore -srcstoretype JKS -srcstorepass storepass -srckeypass keypass -srckeystore my.jks -destkeystore my.p12 -deststoretype pkcs12 -srcalias my -deststorepass storepass -destkeypass keypass
# PKCS12 to JKS
keytool -importkeystore -deststorepass storepass -destkeypass keypass -destkeystore my.jks -srckeystore my.p12 -srcstoretype PKCS12 -srcstorepass ""
- CER和PEM
# CER to PEM
openssl x509 -inform DER -outform PEM -in my.cer -out my.crt
- PEM和PKCS12
# PEM to P12
#openssl pkcs12 -export -out my.p12 -name my -in my.crt -inkey my.key
openssl pkcs12 -export -out my.p12 -in my.crt -inkey my.key
# 提取P12私鑰
openssl pkcs12 –nocerts –nodes –in my.p12 –out my.p12.key
# 將PKCS12的私鑰轉(zhuǎn)為PKCS8的私鑰
# netty only support PKCS8 keys
# http://netty.io/wiki/sslcontextbuilder-and-private-key.html
# 去掉-nocrypt參數(shù)可以使用密碼保護(hù)私鑰
openssl pkcs8 -topk8 -nocrypt -in my.p12.key -out my.pk8.key
數(shù)字證書(shū)與文件格式
X509
由用戶公鑰和用戶標(biāo)識(shí)符組成。還包括版本號(hào)、證書(shū)序列號(hào)、CA標(biāo)識(shí)符、簽名算法標(biāo)識(shí)、簽發(fā)者名稱、證書(shū)有效期等信息
DER
可包含所有私鑰、公鑰和證書(shū),按 ASN1 DER 格式存儲(chǔ)
JKS
Java Key Store,可包含所有私鑰、公鑰和證書(shū)
本地開(kāi)發(fā)時(shí),可以編輯${JAVA_HOME}/jre/lib/security/cacerts文件(密碼changeit),導(dǎo)入信任證書(shū),解決SSL/TLS連接可信證書(shū)相關(guān)的問(wèn)題
PKCS12
可以包含所有私鑰、公鑰和證書(shū),是一種二進(jìn)制格式存儲(chǔ),通常以.pfx或.p12為文件后綴
PEM
以"-----BEGIN..."開(kāi)頭,以"-----END..."結(jié)尾,可以存放各種信息
# 查看PEM格式的證書(shū)信息
openssl x509 -in certificate.pem -text -noout
CER
一般指使用DER格式的證書(shū)
CRT
證書(shū)文件??梢允荘EM格式
KEY
一般是PEM格式的私鑰文件
# 查看key
openssl rsa -in mykey.key -text -noout
CSR
證書(shū)請(qǐng)求文件(Certificate Signing Request),并不是證書(shū),而是向權(quán)威證書(shū)頒發(fā)機(jī)構(gòu)獲得簽名證書(shū)的申請(qǐng),其核心內(nèi)容是一個(gè)公鑰(附帶了一些別的個(gè)人信息)
# 查看csr
openssl req -noout -text -in my.csr