新浪云 建設(shè)網(wǎng)站發(fā)布推廣信息的網(wǎng)站
證書(shū)格式
- pem
- Privacy Enhanced Mail
- 文本格式,以 -----BEGIN CERTIFICATE----- 開(kāi)頭,以-----END CERTIFICATE-----結(jié)尾
- der
- 二進(jìn)制格式,只保存證書(shū),不保存私鑰
- java和window服務(wù)器常見(jiàn)
- pfx/p12
- Predecessor of PKCS#12
- 二進(jìn)制格式,同時(shí)包含證書(shū)和私鑰,一般有密碼保護(hù)
- 一般用于 Windows 上的 IIS 服務(wù)器
- crt
- Certificate 的簡(jiǎn)稱(chēng),有可能是 PEM 編碼格式,也有可能是 DER 編碼格式
- 可以是二進(jìn)制格式,可以是文本格式
- jks
- Java Key Storage
- 二進(jìn)制格式,同時(shí)包含證書(shū)和私鑰,一般有密碼保護(hù)
- 通過(guò)java內(nèi)置工具keytool生成
- bks
- 安卓用的格式,與jks類(lèi)似
- csr
- Certificate Signing Request 證書(shū)簽名請(qǐng)求
keytool -genkey 和 -genkeypair 區(qū)別是什么
keytool命令中的-genkey和-genkeypair選項(xiàng)都用于生成密鑰對(duì)和證書(shū),但是它們的實(shí)現(xiàn)方式略有不同。
參數(shù) | 說(shuō)明 |
---|---|
genkey | 選項(xiàng)用于生成密鑰對(duì)和自簽名證書(shū)。它將提示您提供與密鑰對(duì)和證書(shū)相關(guān)的信息,例如密鑰密碼、證書(shū)主題名稱(chēng)等生成的證書(shū)將是自簽名的,這意味著它未經(jīng)過(guò)任何CA的簽名。該選項(xiàng)通常用于在測(cè)試或開(kāi)發(fā)環(huán)境中生成自簽名證書(shū)。 |
genkeypair | 選項(xiàng)也用于生成密鑰對(duì)和證書(shū),但是它不會(huì)自動(dòng)為證書(shū)簽名。相反,它會(huì)生成一個(gè)證書(shū)簽名請(qǐng)求(CSR),您需要將此CSR發(fā)送給受信任的CA以獲取由CA簽名的證書(shū)。 |
二、雙向認(rèn)證 自簽證書(shū)生成
Keystore和Truststore區(qū)別:
Keystore用于通信,進(jìn)行加解密
Truststore用于認(rèn)證,認(rèn)證對(duì)方是否有效
要使用keytool命令生成自簽名的Keystore和Truststore,使其滿足雙向認(rèn)證,可以按照以下步驟進(jìn)行:
1. 生成服務(wù)端Keystore,包含服務(wù)端私鑰和自簽名證書(shū)。
keytool -genkey -alias server -keyalg RSA -keysize 2048 -validity 365 -keystore server_keystore.jks
在運(yùn)行此命令時(shí),您需要設(shè)置服務(wù)端私鑰的密碼以及一些與證書(shū)相關(guān)的信息,例如組織名稱(chēng)、所在城市等。
2. 導(dǎo)出服務(wù)端證書(shū),生成證書(shū)文件。
keytool -export -alias server -file server.cer -keystore server_keystore.jks
該命令將服務(wù)端證書(shū)導(dǎo)出為一個(gè)X.509證書(shū)文件server.cer。
至此,服務(wù)端證書(shū)創(chuàng)建完畢,以相同流程,創(chuàng)建客戶(hù)端證書(shū)
3. 生成客戶(hù)端Keystore,包含客戶(hù)端私鑰和自簽名證書(shū)。
keytool -genkey -alias client -keyalg RSA -keysize 2048 -validity 365 -keystore client_keystore.jks
在運(yùn)行此命令時(shí),您需要設(shè)置客戶(hù)端私鑰的密碼以及一些與證書(shū)相關(guān)的信息,例如組織名稱(chēng)、所在城市等。
4. 導(dǎo)出客戶(hù)端證書(shū),生成證書(shū)文件。
keytool -export -alias client -file client.cer -keystore client_keystore.jks
該命令將客戶(hù)端證書(shū)導(dǎo)出為一個(gè)X.509證書(shū)文件client.cer。
下面是重點(diǎn)內(nèi)容!!!
5. 生成服務(wù)端Truststore,并將客戶(hù)端證書(shū)導(dǎo)入Truststore。
keytool -import -alias client -file client.cer -keystore server_truststore.jks
此命令將客戶(hù)端證書(shū)生成服務(wù)端使用的truststore文件,此處名字為server_truststore.jks
實(shí)際上是將客戶(hù)端證保存到truststore文件
6. 生成客戶(hù)端Truststore,并將服務(wù)端證書(shū)導(dǎo)入Truststore。
keytool -import -alias server -file server.cer -keystore client_truststore.jks
此命令將服務(wù)端證書(shū)導(dǎo)入到一個(gè)名為client_truststore.jks的Truststore文件中。
7. 因?yàn)槲覀冇胘ava代碼編寫(xiě)客戶(hù)端和服務(wù)端,最終只需要使用這四個(gè)文件即可
- server_keystore.jks ==> 包含服務(wù)端的證書(shū)、服務(wù)端公鑰、服務(wù)端私鑰
- server_truststore.jks ==> 包含客戶(hù)端的證書(shū)以及客戶(hù)端公鑰
- client_keystore.jks ==> 包含客戶(hù)端的證書(shū)、客戶(hù)端公鑰、客戶(hù)端私鑰
- client_truststore.jks ==> 包含服務(wù)端的證書(shū)以及客戶(hù)端公鑰
具體使用可參考TwoWay代碼
三、單向認(rèn)證 自簽證書(shū)生成
由于是單向認(rèn)證,有兩種方式
1. 只需要將服務(wù)端的證書(shū)發(fā)給客戶(hù)端使用即可
這里繼續(xù)使用keytool命令生成自簽名的Keystore,可以按照以下步驟進(jìn)行:
keytool -genkey -alias myapp -keyalg RSA -keysize 2048 -validity 365 -keystore mykeystore.jks
具體使用可參考OneWay代碼
2. 客戶(hù)端預(yù)埋CA證書(shū)即可,不需要使用服務(wù)端的mykeystore.jks
這樣有一種好處,對(duì)于終端設(shè)備來(lái)說(shuō),可以?xún)?nèi)置一個(gè)CA證書(shū)進(jìn)行驗(yàn)證,這個(gè)CA證書(shū)有效期可以長(zhǎng)一點(diǎn),比如說(shuō)10年,20年
而服務(wù)端證書(shū)可以短一些,比如1年,3年。因?yàn)榻K端設(shè)備升級(jí)需要進(jìn)行OTA,比較麻煩。
這里采用openssl方式進(jìn)行說(shuō)明,更容易理解,當(dāng)然keytool也可以實(shí)現(xiàn)
創(chuàng)建一對(duì)證書(shū),用于簽名服務(wù)器,10年
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
生成服務(wù)器私鑰和 CSR
openssl genrsa -out server.key 2048
openssl req -new -sha256 -key server.key -out server.csr
對(duì)使用CA證書(shū)和CA私鑰 對(duì) 服務(wù)器CSR進(jìn)行簽名,時(shí)間為1天
openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 1
使用keytool工具將server.crt添加到Truststore中,并且給tls服務(wù)端使用
# 這條命令不對(duì),因?yàn)閟erver.crt只包含證書(shū),而且server.jks這里面需要包含私鑰
keytool -import -alias myserver -file server.crt -keystore server.jks
# 這條命令是對(duì)的,KeyStore中必須要包含私鑰,TrustStore中不能包含,否則私鑰就泄露
# p12也是證書(shū)的一種
openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12
keytool -importkeystore -srckeystore server.p12 -srcstoretype pkcs12 -destkeystore server.jks -deststoretype jks
使用keytool工具將ca.crt添加到Truststore中,并且給tls客戶(hù)端使用
# 這條命令是對(duì)的,因?yàn)槭强蛻?hù)端使用,客戶(hù)端驗(yàn)證服務(wù)端是否可信,只需要證書(shū)即可,不需要私鑰
# 如果客戶(hù)端不埋入CA證書(shū),則會(huì)直接報(bào)錯(cuò)無(wú)法建立連接
keytool -import -alias myca -file ca.crt -keystore ca.jks
上面創(chuàng)建服務(wù)端證書(shū),有效期是1天,1天后就會(huì)過(guò)期。過(guò)期后不在驗(yàn)證通過(guò)
具體代碼倉(cāng)庫(kù):https://github.com/worker24h/ssl-demo