Keytool工具的介紹與使用方法

一、keytool 簡介
Keytool 是一個(gè) Java數(shù)據(jù)證書的管理工具, Keytool將密鑰(key)和證書(certificates)存在一個(gè)稱為 keystore的文件中。
keystore 文件介紹
在 keystore里,包含兩種數(shù)據(jù):
- 密鑰實(shí)體(Key entity)——密鑰(secret key)又或者是私鑰和配對(duì)公鑰(采用非對(duì)稱加密)
- 可信任的證書實(shí)體(trusted certificate entries)——只包含公鑰
我們常說的證書就是就是上面的公鑰,公鑰是公開給其它人使用的。
證書后綴解釋
- jks 是Java的keytool證書工具支持的證書私鑰格式;
- pfx 是微軟支持的私鑰格式(p12是pfx的新格式);
- cer / crt 是證書的公鑰格式(cer是crt證書的微軟形式)
- csr 數(shù)字證書簽名請(qǐng)求文件(Cerificate Signing Request)
Tips:
- .der .cer : 此證書文件是二進(jìn)制格式,只含有證書信息,不包含私鑰。
- .crt : 此證書文件是二進(jìn)制格式或文本格式,一般為文本格式,功能與 .der 及 .cer 證書文件相同。
- .pem : 此證書文件一般是文本格式,可以存放證書或私鑰,或者兩者都包含。 .pem 文件如果只包含私鑰,一般用 .key 文件代替。
- .pfx .p12 : 此證書文件是二進(jìn)制格式,同時(shí)包含證書和私鑰,且一般有密碼保護(hù)。
- .keystore .truststore : 兩者本質(zhì)都是keystore,都是儲(chǔ)存密鑰的容器:
- 兩者存放的密鑰所有者不同,keystore是存儲(chǔ)自己的公鑰和私鑰而,truststore是存儲(chǔ)自己信任對(duì)象的公鑰。約定通過文件名稱區(qū)分類型以及用途;
- truststore 是必須的,如果我們沒有顯式的指定,那么java會(huì)默認(rèn)指定為 $JAVA_HOME/lib/security/cacerts 這個(gè)文件;
- java 在jdk 中已經(jīng)默認(rèn)在 $JAVA_HOME/lib/security/cacerts 這個(gè)文件中預(yù)置了常用的證書;
- 不同語言需要的證書格式并不一致,比如說Java采用jks,.Net采用pfx和cer,Php則采用pem和cer;
- 區(qū)別證書的不是后綴名,而是文件的格式和內(nèi)容。
二、keytool 命令詳解
密鑰和證書管理工具
-certreq 生成證書請(qǐng)求 -changealias 更改條目的別名 -delete 刪除條目 -exportcert 導(dǎo)出證書(簡寫 export) -genkeypair 生成密鑰對(duì)(簡寫 genkey) -genseckey 生成密鑰 -gencert 根據(jù)證書請(qǐng)求生成證書 -importcert 導(dǎo)入證書或證書鏈(簡寫 import) -importpass 導(dǎo)入口令 -importkeystore 從其他密鑰庫導(dǎo)入一個(gè)或所有條目 -keypasswd 更改條目的密鑰口令 -list 列出密鑰庫中的條目 -printcert 打印證書內(nèi)容 -printcertreq 打印證書請(qǐng)求的內(nèi)容 -printcrl 打印 CRL 文件的內(nèi)容 -storepasswd 更改密鑰庫的存儲(chǔ)口令
Tips:
- 使用 ketytool --help 獲取所有可用命令
- 使用 keytool -command_name -help 來獲取 command_name 的用法
常用參數(shù)
-genkey 產(chǎn)生密鑰對(duì)(genkeypair 簡寫);表示要?jiǎng)?chuàng)建一個(gè)新的密鑰;alias和keystore缺省時(shí),在用戶主目錄中創(chuàng)建一個(gè)”.keystore”文件,且別名為mykey,包含用戶的公鑰、私鑰證書 -alias 產(chǎn)生證書別名,和keystore關(guān)聯(lián)的唯一別名,不區(qū)分大小寫(默認(rèn) `mykey`) -keystore 指定密鑰庫文件的名稱(默認(rèn)在用戶主目錄創(chuàng)建證書庫) -keyalg 指定密鑰的算法(可選擇密鑰算法:`RSA`、`DSA`、`EC`,默認(rèn)`DSA`) -keysize 指定密鑰長度(與keyalg默認(rèn)對(duì)應(yīng)關(guān)系:`RSA=2048`、`DSA=2048`、`EC=256`) -sigalg 指定簽名算法(MD5和 SHA1的簽名算法已經(jīng)不安全) -validity 指定證書有效期天數(shù)(默認(rèn) `90`天) -storepass 指定密鑰庫口令,推薦與keypass一致(獲取keystore信息所需的密碼) -storetype 指定密鑰庫的類型,可用類型為:JKS、PKCS12等。(jdk9以前,默認(rèn)為JKS。自jdk9開始,默認(rèn)為PKCS12) -keypass 指定別名條目口令(私鑰的密碼) -dname 指定證書發(fā)行者信息(其中 CN 要和服務(wù)器的 `域名` 或 `IP` 相同,本地測試則使用localhost,其他的可以不填) -list 顯示密鑰庫中的證書信息 -v 詳細(xì)輸出,顯示密鑰庫中的證書詳細(xì)信息 -file 指定導(dǎo)出或?qū)С龅奈募? -export 將別名指定的證書導(dǎo)出到文件(exportcert 簡寫) -import 將已簽名數(shù)字證書導(dǎo)入密鑰庫(importcert 簡寫) -printcert 查看導(dǎo)出的證書信息 -delete 刪除密鑰庫中某條目 -keypasswd 修改密鑰庫中指定條目口令 -storepasswd 修改keystore口令 -ext X.509 擴(kuò)展
Tips:
- 所有密碼長度必須大于或等于 6 位
- keyalg 指定加密算法;可以選擇的密鑰算法有:RSA、DSA(默認(rèn))、EC。
- sigalg 指定簽名算法(MD5和 SHA1的簽名算法已經(jīng)不安全):
- keyalg = RSA 時(shí),簽名算法有:MD5withRSA、SHA1withRSA、SHA256withRSA(默認(rèn))、SHA384withRSA、SHA512withRSA
- keyalg = DSA 時(shí),簽名算法有:SHA1withDSA、SHA256withDSA(默認(rèn))
- dname 表明了密鑰的發(fā)行者身份(Distinguished Names)
- CN = 域名或IP(Common Name) 注:生成服務(wù)器證書時(shí),CN要和服務(wù)器的 域名 或 IP 相同,本地測試則使用localhost,其他的可以不填(客戶端證書無要求)
- OU = 組織單位名稱(Organization Unit)
- O = 組織名稱(Organization Name)
- L = 城市或區(qū)域名稱(Locality Name)
- ST = 州或省份名稱(State Name)
- C = 國家的簡寫(Country,CN 代表中國)
三、證書操作
創(chuàng)建證書
創(chuàng)建秘鑰庫(keystore),秘鑰庫是存儲(chǔ)一個(gè)或多個(gè)密鑰條目的文件,每個(gè)密鑰條目應(yīng)該以一個(gè)別名標(biāo)識(shí),它包含密鑰和證書相關(guān)信息。
Usage:
keytool -genkey -alias <alias> -keyalg RSA [-sigalg SHA256withRSA] [-keysize 2048] -keypass <keypasswd> -keystore <keystore_file> -storetype JKS|PKCS12 -storepass <keystore_passwd> -validity 3650 -dname "CN=github.com,OU=github.com,Inc.,O=Github, Inc.,L=San Francisco,ST=California,C=US" -ext SAN=dns:github.com,dns:www.github.com,ip:127.0.0.1
Options:
-genkey 產(chǎn)生密鑰對(duì)(genkeypair 簡寫) -alias 證書別名;和keystore關(guān)聯(lián)的唯一別名,這個(gè)alias通常不區(qū)分大小寫(默認(rèn)`mykey`) -keyalg 指定加密算法,RSA:非對(duì)稱加密(默認(rèn)`DSA`) -sigalg 指定簽名算法,可選; -keysize 指定密鑰長度,可選; -keypass 指定別名條目口令(私鑰的密碼) -storetype 生成證書類型,可用的證書庫類型為:JKS、PKCS12等。(jdk9以前,默認(rèn)為JKS。自jdk9開始,默認(rèn)為PKCS12) -keystore 指定產(chǎn)生的密鑰庫的位置; -storepass 指定密鑰庫的存取口令,推薦與keypass一致 -validity 證書有效期天數(shù);(默認(rèn)為 90天) -dname 表明了密鑰的發(fā)行者身份(Distinguished Names)生成證書時(shí),其中 CN 要和服務(wù)器的 `域名` 或 `IP` 相同,本地測試則使用localhost,其他的可以不填 -ext X.509 擴(kuò)展
Tips:
- 此處需要注意:MD5 和SHA1 的簽名算法已經(jīng)不安全;
- 如果Tomcat所在服務(wù)器的域名不是 “localhost” 時(shí),瀏覽器會(huì)彈出警告窗口,提示用戶證書與所在域不匹配。
- 服務(wù)器證書 dname的 CN應(yīng)改為對(duì)應(yīng)的域名,如 “www.github.com”;在本地做開發(fā)測試時(shí),CN應(yīng)填入 “localhost”;
- 客戶端證書 dname的 CN可以是任意值,且不用使用 -ext擴(kuò)展。
導(dǎo)出證書信息
此證書文件不包含私鑰;分為自簽名證書和認(rèn)證證書,下面分別介紹了兩中證書的生成方式
- 認(rèn)證證書與導(dǎo)出的服務(wù)器自簽名證書作用一致,使用時(shí)取其中一種證書即可。兩者主要區(qū)別為是否經(jīng)證書機(jī)構(gòu)認(rèn)證;
- 使用自簽名證書則無需生成證書簽名請(qǐng)求(CSR),使用認(rèn)證證書則無需導(dǎo)出服務(wù)器自簽名證書;
- 大部分認(rèn)證證書都是收費(fèi)的;
導(dǎo)出自簽名證書
自簽名證書沒有經(jīng)過證書認(rèn)證機(jī)構(gòu)進(jìn)行認(rèn)證,但并不影響使用,我們可以使用相應(yīng)的命令對(duì)證書進(jìn)行導(dǎo)出;
Usage:
keytool -export -alias <alias> -keystore <keystore_file> -storepass <keystore_passwd> -file <file_cer> [-rfc]
Options:
-export 執(zhí)行證書導(dǎo)出操作(exportcert 簡寫) -alias 密鑰庫中的證書條目別名(jks里可以存儲(chǔ)多對(duì)公私鑰文件,通過別名指定導(dǎo)出的公鑰證書) -keystore 指定密鑰庫文件 -storepass 密鑰庫口令 -file 導(dǎo)出文件的輸出路徑 -rfc 使用Base64格式輸出(輸出pem編碼格式的證書,文本格式),不適用則導(dǎo)出的證書為DER編碼格式
獲取認(rèn)證證書(生成證書簽名請(qǐng)求)
如果想得到證書認(rèn)證機(jī)構(gòu)的認(rèn)證,則不使用上述的自簽名證書,需要使用步驟導(dǎo)出數(shù)字證書并簽發(fā)申請(qǐng)(Cerificate Signing Request),經(jīng)證書認(rèn)證機(jī)構(gòu)認(rèn)證并頒發(fā)后,再將認(rèn)證后的證書導(dǎo)入本地密鑰庫與信任庫。
Usage:
keytool -certreq -alias <alias> -keystore <keystore_file> -storepass <keystore_passwd> -file <file_csr>
Options:
-certreq 執(zhí)行證書簽發(fā)申請(qǐng)導(dǎo)出操作
-alias 密鑰庫中的證書條目別名
-keystore 密鑰庫文件名稱
-storepass 密鑰庫口令
-file 輸出的csr文件路徑
導(dǎo)入證書庫
雙向認(rèn)證: 將各自的公鑰證書分別導(dǎo)入對(duì)方的信任庫,使客戶端和服務(wù)端相互信任。
Usage:
keytool -import
[-trustcacerts]
-alias <alias_cer>
-keystore <keystore_file>
-storepass <keystore_passwd>
-file <file_cer>
Options:
-import 執(zhí)行證書導(dǎo)入操作(importcert 簡寫)
-alias 指定導(dǎo)入密鑰庫中的證書別名(指定的條目別名不能與密鑰庫中已存在的條目別名重復(fù)(導(dǎo)入簽發(fā)證書除外))
-trustcacerts 將證書導(dǎo)入信任庫(信任來自 cacerts 的證書)
-keystore 密鑰庫名稱
-storepass 密鑰庫口令
-file 輸入文件名
Tips: 此步驟會(huì)生成信任證書 truststore.jks文件, 文件存放需要信任的公鑰證書,如客戶端證書(也可以將 keystore值改為服務(wù)器密鑰庫,如tomcat.jks。此時(shí)的tomcat.jks 就同時(shí)是服務(wù)的密鑰庫和信任庫)
安裝服務(wù)器證書
(將服務(wù)器公鑰證書導(dǎo)入客戶端)
雙向認(rèn)證: 客戶端信任服務(wù)端: 在客戶機(jī)器上雙擊證書文件完成導(dǎo)入操作(window中導(dǎo)入)安裝公鑰證書
安裝公鑰證書
將服務(wù)器公鑰證書(cer | crt等格式文件)發(fā)往客戶端機(jī)器
--> 雙擊該證書進(jìn)入“證書信息”頁
--> 點(diǎn)擊【安裝證書】進(jìn)入“證書導(dǎo)入向?qū)?rdquo;首頁
--> 點(diǎn)擊【下一步】
--> 選中【將所有的證書都放入下列存儲(chǔ)】,然后單擊【瀏覽】
--> 選擇【受信任的根證書頒發(fā)機(jī)構(gòu)】并點(diǎn)擊【確定】
--> 點(diǎn)擊【下一步】
--> 點(diǎn)擊【完成】。然后彈出提示【導(dǎo)入完成】。
安裝客戶端證書
將客戶端證書(jsk | p12等格式文件)發(fā)往客戶端機(jī)器
--> 雙擊該證書進(jìn)入“證書導(dǎo)入向?qū)?rdquo;首頁
--> 點(diǎn)擊【下一步】
--> 點(diǎn)擊【下一步】
--> 輸入證書密碼(keystore密碼)并點(diǎn)擊【下一步】
--> 點(diǎn)擊【下一步】(這里也可以自己指定證書儲(chǔ)存)
--> 點(diǎn)擊【完成】。然后彈出提示【導(dǎo)入完成】。
查看證書
Usage:
查看單個(gè)證書(cer | crt)
keytool -printcert -file <cert_file> [-v|-rfc]
查看密鑰庫中的證書條目
keytool -list [-alias <alias_name>] -keystore <keystore_file> -storepass <keystore_passwd> [-v|-rfc]
查看生成的CSR證書請(qǐng)求
keytool -printcertreq -file <certreq_file>
Options:
-alias 密鑰庫中的證書條目別名;
-keystore 指定密鑰庫文件;
-storepass 密鑰庫口令;
-printcert 執(zhí)行證書打印命令;
-list 缺省情況下,命令打印證書的 MD5 指紋。
而如果指定了 -v 選項(xiàng),將以可讀格式打印證書,
如果指定了 -rfc 選項(xiàng),將以可打印的編碼格式輸出證書。
其他命令
# 刪除keystore里面指定證書條目
keytool -delete -alias <alias> -keystore <keystore_file> -storepass <keystore_passwd># 修改條目別名
keytool -changealias -keystore <keystore_file> -alias <old_alias> -destalias <new_alias># 修改條目密碼
keytool -keypasswd -alias <alias> -keypass <old_keypasswd> -new <new_keypasswd> -keystore <keystore_file> -storepass <keystore_passwd># 修改keysore密碼
keytool -storepasswd -new <new_storepasswd> -keystore <keystore_file> -storepass <old_storepasswd># 列出信任的CA證書(查看 JVM的信任庫中的證書,storepass 默認(rèn)為changeit)
## 該證書文件存在于JAVA_HOME\jre\lib\security目錄下,是Java系統(tǒng)的CA證書倉庫,可以用 'alias' 來查看證書是否真的導(dǎo)入到JVM中
keytool -list -v [-alias clientCer] -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit# 導(dǎo)入新的CA到信任證書,導(dǎo)入到 JRE的信任證書庫
## 常出現(xiàn)的異常:“未找到可信任的證書” -- 主要原因?yàn)樵诳蛻舳宋磳⒎?wù)器下發(fā)的證書導(dǎo)入到JVM中。
keytool -import -trustcacerts -alias clientCer -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -file ~/ssl/client.cer
四、栗子
SSL單向證書認(rèn)證配置#
-
創(chuàng)建服務(wù)器證書
-
導(dǎo)出服務(wù)器公鑰證書
-
將服務(wù)器公鑰證書導(dǎo)入客戶端(客戶端信任服務(wù)器)
-
配置 Tomcat/conf/server.xml,找到如下原注釋內(nèi)容,并修改如下:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="~/ssl/tomcat.jks" keystorePass="123456" />
Keytool 配置Tomcat的 HTTPS單向認(rèn)證:
https://www.cnblogs.com/librarookie/p/16806817.html
SSL雙向證書認(rèn)證配置
-
創(chuàng)建服務(wù)器證書,創(chuàng)建客戶端證書
-
導(dǎo)出服務(wù)器公鑰證書,導(dǎo)出客戶端公鑰證書
-
將服務(wù)器公鑰證書導(dǎo)入客戶端(客戶端信任服務(wù)器)
-
將客戶端公鑰證書導(dǎo)入信任庫(服務(wù)器信任客戶端)
-
配置 Tomcat/conf/server.xml,并開啟雙向認(rèn)證(clientAuth的值改為true)
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="true" sslProtocol="TLS" keystoreFile="~/ssl/tomcat.jks" keystorePass="123456" truststoreFile="~/ssl/truststore.jks" truststorePass="123456" />
Keytool 配置Tomcat的 HTTPS雙向認(rèn)證:
https://www.cnblogs.com/librarookie/p/16807218.html
五、常見問題
瀏覽器訪問時(shí),出現(xiàn)的提示與可能原因:
此服務(wù)器無法證實(shí)它是“192.168..” - 您計(jì)算機(jī)的操作系統(tǒng)不信任其安全證書 。。。
-- 客戶端未導(dǎo)入服務(wù)器證書
此服務(wù)器無法證實(shí)它就是“192.168..” - 它的安全證書沒有指定主題備用名稱 。。。
-- 生成服務(wù)器證書庫未使用 -ext參數(shù)
“192.168..”不接受您的登錄證書,或者您可能沒有提供登錄證書。。。
-- Tomcat配置開了雙向認(rèn)證,且未指定信任證書庫(truststore)
Via
- https://www.cnblogs.com/molao-doing/articles/9687445.html
- https://yoloz.github.io/2020/04/17/security/keytool命令詳解/
- https://blog.csdn.net/qq_26708427/article/details/68491201
到此這篇關(guān)于Keytool工具的介紹與使用方法的文章就介紹到這了,更多相關(guān)Keytool用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
WebStorm如何調(diào)試Vue項(xiàng)目? webstorm配置vue開發(fā)環(huán)境指南
WebStorm 支持多種調(diào)試工具,包括瀏覽器的開發(fā)者工具,但本文主要講解的是使用 WebStorm 自帶的調(diào)試功能2025-04-15VSCode和webstorm怎么設(shè)置綠色護(hù)眼背景? 綠豆沙背景色的設(shè)置方法
護(hù)眼色一定程度能保護(hù)眼睛,緩解疲勞,VSCode和webstorm這兩款常用的軟件怎么設(shè)置護(hù)眼色呢?詳細(xì)請(qǐng)看下文介紹2025-04-15WebStorm常用插件以及實(shí)用設(shè)置分享
WebStorm本身已經(jīng)足夠強(qiáng)大,但一些優(yōu)秀的插件能錦上添花,顯著提升開發(fā)效率,詳細(xì)請(qǐng)看下文介紹2025-04-15如何安裝配置WebStorm? WebStorm安裝與使用全方位指南
WebStorm軟件在前端和后端開發(fā)領(lǐng)域都備受青睞,很多朋友不知道該怎么下載安裝,下面我們就來看看詳細(xì)的安裝配置教程2025-04-15Webstorm怎么配置? Webstorm入門之軟件配置教程
WebStorm是一款功能強(qiáng)大的集成開發(fā)環(huán)境(IDE),支持各種前端開發(fā)技術(shù),今天我們就來看看Webstorm的配置教程2025-04-15Webstorm怎么設(shè)置字體大小/背景顏色/背景圖片?
WebStorm 允許您自定義界面顏色,以創(chuàng)建更個(gè)性化和美觀的工作空間,今天我們就來看看Webstorm改變字體大小、背景顏色、設(shè)置背景圖片的方法2025-04-15- VScode上安裝PlatformIO插件能成功安裝,嘗試卸載VScode并刪除插件,這些錯(cuò)誤仍然存在,下面我們就來看看這個(gè)問題的解決辦法2025-04-03
提升代碼搜索效率! VSCode里DeepSeek插件安裝與配置指南
今天我們將向大家介紹如何在Visual Studio Code中安裝并配置 DeepSeek 插件,幫助你更高效地進(jìn)行代碼搜索2025-04-07提升你的編程效率! VSCode的初級(jí)使用教程超詳細(xì)版
VSCode是一款免費(fèi)且開源的代碼編輯器,因其強(qiáng)大的功能和良好的用戶體驗(yàn)而廣受歡迎,本文將詳細(xì)介紹 VSCode 的基本使用方法,并通過插圖幫助你更好地理解2025-04-03- 今天我們來聊聊如何安裝和配置VS Code,讓它成為你編程路上的得力助手,這個(gè)過程其實(shí)很簡單,只要跟著我的步驟走,你絕對(duì)能搞定2025-04-03