㈠ keytool證書
證書,又稱公鑰證書,是實體(簽發者)通過數字簽名提供的一種聲明,確認另一實體(主體)的公鑰及其相關信息具有特定的值。
公鑰是與實體關聯的數字,所有與其交互的人都需要知道。公鑰的主要作用是驗證簽名,確保數據來源的真實性。
數字簽名是將數據與實體的身份綁定,通過使用實體的私鑰,數據不可被偽造。身份在不同系統中可能表現為公鑰、Unix UID、電子郵件地址或X.509特徵名等。
簽名是實體(簽發者)使用其私鑰對數據進行加密的過程。私鑰是保密的,通常每個私鑰僅與特定實體相對應,私鑰與公鑰成對出現,如DSA系統。
實體可以是個人、組織或程序等,需要信任的對象。在分布式網路中,為解決公鑰分發問題,出現了認證機構(CA),如VeriSign、Thawte等,它們作為第三方為實體簽發證書,確保信息的可靠性和有效性。
keytool是一個工具,它支持X.509證書的操作,包括顯示、導入、導出和自簽名證書的生成。X.509標準定義了證書內容格式,包括版本識別、序列號、簽名演算法、簽發者名稱、有效期和主體名稱等詳細信息。
例如,X.509證書可能包含v1、v2或v3版本,序列號用於唯一標識證書,簽發者名稱是證書的簽發者,有效期則限制了證書的使用時間,而主體名稱則是公鑰所對應實體的唯一標識。
㈡ keytool 的問題
Keytool 是安全鑰匙與證書的管理工具.它管理一個存儲了私有鑰匙和驗證相應公共鑰匙的與它們相關聯的X.509 證書鏈的keystore(相當一個資料庫).
Keytool 是一個有效的安全鑰匙和證書的管理工具. 它能夠使用戶使用數字簽名來管理他們自己的私有/公共鑰匙對,管理用來作自我鑒定的相關的證書,管理數據完整性和鑒定服務.它還能使用戶在通信時緩存它們的公共鑰匙.
一個證書是某一實體(個人,公司等)的數字簽名,指出其他實體的公共鑰匙(或其他信息)的詳細的值.當數據被簽名後,這個簽名信息被用來檢驗數據的完整性和真實性.完整性指數據沒有被修改和篡改,真實性指數據從任何產生和簽名的一方真正的傳輸到達.
Keytool 把鑰匙和證書儲存到一個keystore.默任的實現keystore的是一個文件.它用一個密碼保護鑰匙.
而另外的一個工具jarsigner用keystore中的信息產生或檢驗java aRchive(jar文件)中的數字簽名.
Keystore有兩個不同的入口:
1.鑰匙入口:保存了非常敏感的加密的鑰匙信息,並且是用一個保護的格式存儲以防止未被授權的訪問.以這種形式存儲的鑰匙是秘密鑰匙,或是一個對應證書鏈中公有鑰匙的私有鑰匙.
2.信任證書入口:包含一個屬於其他部分的單一公共鑰匙證書.它之所以被稱為"信任證書",是因為keystore信任的證書中的公共鑰匙真正屬於證書所有者的身份識別.
Keystore的別名:
所有的keystore入口(鑰匙和信任證書入口)是通過唯一的別名訪問.別名是 不區分大小寫的.如別名Hugo和hugo指向同一個keystore入口.
可以在加一個入口到keystore的時候使用-genkey參數來產生一個鑰匙對(公共鑰匙和私有鑰匙)時指定別名.也可以用-import參數加一個證書或證書鏈到信任證書.
如:
keytool -genkey -alias ke -keypass kekeypasswd
其中ke為別名,kekeypasswd為ke別名的密碼.這行命令的作用是產生一個新的公共/私有鑰匙對.
假如你想修改密碼,可以用:
keytool -keypasswd -alias ke -keypass kekeypasswd -new newpass
將舊密碼kekeypasswd改為newpass.
Keystore的產生:
1.當使用-genkey 或-import或-identitydb命令添加數據到一個keystore,而當這個keystore不存在時,產生一個keystore.默認名是.keystore,存放到user-home目錄.
2.當用-keystore指定時,將產生指定的keystore.
Keystore的實現:
Keytool 類位於java.security包下,提供一個非常好的介面去取得和修改一個keystore中的信息. 目前有兩個命令行:keytool和jarsinger,一個GUI工具Policy 可以實現keystore.由於keystore是公開的,用戶可以用它寫一些額外的安全應用程序.
Keystore還有一個sun公司提供的內在實現.它把keystore作為一個文件來實現.利用了一個keystore類型(格式)"JKS".它用單獨的密碼保護每一個私有鑰匙.也用可能不同的密碼保護整個keystore的完整性.
支持的演算法和鑰匙大小:
keytool允許用戶指定鑰匙對和注冊密碼服務供應者所提供的簽名演算法.預設的鑰匙對產生演算法是"DSA".假如私有鑰匙是"DSA"類型,預設簽名演算法是"SHA1withDSA",假如私有鑰匙是"RSA"類型,預設演算法是"MD5withRSA".
當產生一個DSA鑰匙對,鑰匙必須在512-1024位之間.對任何演算法的預設鑰匙大小是1024位.
證書:
一個證書是一個實體的數字簽名,指出其他實體的公共鑰匙有明確的值.
1.公共鑰匙 :是同一個詳細的實體的數字關聯,並有意讓所有想同這個實體發生信任關系的其他實體知道.公共鑰匙用來檢驗簽名;
2.數字簽名:假如數據已被簽名,並用身份存儲在一個實體中,一個簽名能夠證明這個實體知道這個數據.這個數據用實體私有鑰匙簽名並遞交;
3.身份:知道實體的方法.在一些系統中身份是公共鑰匙,其他系統中可以是從一個X.509名字的郵件地址的Unix UID來的任何東西;
4.簽名:一個簽名用用實體私有鑰匙來計算某些加密數據;
5.私有鑰匙:是一些數字,每一個私有鑰匙只能被特定的擁有該私有鑰匙的實體知道.私有和公共鑰匙存在所有用公共鑰匙加密的系統的鑰匙對中.一個公共鑰匙加密(如DSA),一個私有鑰匙與一個正確的公共鑰匙通信.私有鑰匙用來計算簽名.
6.實體:一個實體可以是一個人,一個組織,一個程序,一台計算機,一個商業,一個銀行,或其他你想信任的東西.
Keytool應用實例:
1.產生一個keystore:
keytool -genkey -alias User(keystore的別名) -keyalg RSA -validity 7 -keystore keystore(指定keystore).
運行這個命令,系統提示:
Enter keystore password:yourpassword(輸入密碼)
What is your first and last name?
[Unknown]: your name(輸入你的名字)
What is the name of your organizational unit?
[Unknown]:your organizational(輸入你所在組織單位的名字)
What is the name of your organization?
[Unknown]:your organization name (輸入你所在組織的名字)
What is the name of your City or Locality?
[Unknown]:your city name(輸入所在城市的名字)
What is the name of your State or Province?
[Unknown]:your provice name(輸入所在省份名字)
What is the two-letter country code for this unit?
[Unknown]:cn(輸入國家名字)
Is CN=your name, OU=your organizaion, O="your organization name",
L=your city name, ST=your province name, C=cn correct?
[no]: yes
2.檢查一個keystore:
keytool -list -v -keystore keystore
Enter keystore password:your password(輸入密碼)
將顯示keystore內容如:
Keystore type: jks
Keystore provider: SUN
Your keystore contains 1 entry
Alias name: yourname
Creation date: Dec 20, 2001
Entry type: keyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=yourname, OU=your organization, O="your organization name",
L=your city name, ST=your province name, C=CN
Issuer: CN=Duke, OU=Java Software, O="Sun Microsystems, Inc.", L=Palo Alto, ST=CA, C=US
Serial number: 3c22adc1
Valid from: Thu Dec 20 19:34:25 PST 2001 until: Thu Dec 27 19:34:25 PST 2001
Certificate fingerprints:
MD5: F1:5B:9B:A1:F7:16:CF:25:CF:F4:FF:35:3F:4C:9C:F0
SHA1: B2:00:50:DD:B6:CC:35:66:21:45:0F:96:AA:AF:6A:3D:E4:03:7C:74
3.輸出keystore到一個文件:testkey:
keytool -export -alias ke -keystore keystore -rfc -file testkey
系統輸出:
Enter keystore password:your password(輸入密碼)
Certificate stored in file
4.輸入證書到一個新的truststore:
keytool -import -alias kecert -file testkey -keystore truststore
Enter keystore password:your new password.(輸入truststore新密碼)
5.檢查truststore:
keytool -list -v -keystore truststore
系統將顯示truststore的信息.
現在可以用適當的keystore運行你的應用程序.如:
java -Djavax.net.ssl.keyStore=keystore -Djavax.net.ssl.keyStorePassword=password Server
和: java -Djavax.net.ssl.trustStore=truststore
-Djavax.net.ssl.trustStorePassword=trustword Client
㈢ 網址後面有個S加密怎麼弄
https默認埠是443,http默認埠是80,所有加一個s就不一樣。也不是所有網站加s就可以加密,需要WEB伺服器端進行相應的配置。以下配置步驟僅供參考:
HTTPS_SSL配置的步驟:
伺服器端單向認證:
第一步:進入jdk的安裝文件路徑下面的bin目錄;
第二步:在bin目錄下輸入以下命令
keytool -genkey -v -alias mykey -keyalg RSA -validity 3650 -keystore c:\sst.keystore
-dname "CN=你的ip,OU=cn,O=cn,L=cn,ST=cn,c=cn" -storepass 123456 -keypass 123456
說明:
keytool 是JDK提供的證書生成工具,所有參數的用法參見keytool –help
-genkey 創建新證書
-v詳細信息
-alias以」mykey」作為該證書的別名。這里可以根據需要修改
-keyalgRSA 指定演算法
-keysize 指定演算法加密後彎凳密鑰長度
-keystorec:\sst.keystore保存路徑及文件名
-validity3650證書有效期,單位為天
CN=你的ip,OU=cn,O=cn,L=cn,ST=cn,c=cn 基本信息的配置
CN=你的ip 這個配置務必注意
-storepass 123456789 -keypass 123456789 密碼設置
第三步:生成的文件如下圖所示
第埋碰旅四步:配置tomcat的server.xml文件[1]redirectPort埠號改為:443
<Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443" useBodyEncodingForURI="true"/>
[2]SSL HTTP/1.1 Connector定義的地方,修改埠號為:443
<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="C:/sst.keystore" keystorePass="123456"
clientAuth="false" sslProtocol="TLS" />
屬性說明:clientAuth:設置是否雙向驗證,默認為false,設置為true代表吵橘雙向驗證keystoreFile:伺服器證書文件路徑keystorePass:伺服器證書密碼truststoreFile:用來驗證客戶端證書的根證書,此例中就是伺服器證書truststorePass:根證書密碼
[3] AJP 1.3 Connector定義的地方,修改redirectPort為443
<Connector port="8009" protocol="AJP/1.3" redirectPort="443"/>
第五步:重新啟動Tomcat就可以了。
附加內容:若要使得應用只能通過https的方式訪問,在該項目的web.xml文件中加入如下代碼:
<login-config><!-- Authorization setting for SSL --><auth-method>CLIENT-CERT</auth-method><realm-name>Client Cert Users-only Area</realm-name></login-config><security-constraint><!-- Authorization setting for SSL --><web-resource-collection><web-resource-name>SSL</web-resource-name><url-pattern>/*</url-pattern></web-resource-collection><user-data-constraint><transport-guarantee>CONFIDENTIAL</transport-guarantee></user-data-constraint></security-constraint><!--Require HTTPS for everything except /img (favicon) and /css.--><security-constraint><web-resource-collection><web-resource-name>HTTPSOrHTTP</web-resource-name><url-pattern>*.ico</url-pattern><url-pattern>/img/*</url-pattern><url-pattern>/css/*</url-pattern></web-resource-collection><user-data-constraint><transport-guarantee>NONE</transport-guarantee></user-data-constraint></security-constraint>測試 :在瀏覽器中輸入:https://localhost:8443/,會彈出選擇客戶端證書界面,點擊「確定」,會進入tomcat主頁,地址欄後會有「鎖」圖標,表示本次會話已經通過HTTPS雙向驗證,接下來的會話過程中所傳輸的信息都已經過SSL信息加密。
可能存在的問題:
Eclipse中啟動tomcat7.0,本地tomcat配置文件被eclipse恢復。
問題是這樣的,在eclipse的servers配置項里,將tomcat的啟動配置為了use tomcat location,但是每次在eclipse里publish項目都會把本地G:\tomcate7.0\apache-tomcat-7.0.29\conf下的配置文件(如:tomcat-user.xml添加了用戶等信息)給重置,也就是裡面添加的內容被清空了,回復到原來的樣子:
問題解決方案:
你eclipse工程列表中應該 還有個 Servers工程,下面會有Tomcat7的配置文件,你把裡面的對應配置文件改了。每次是用這個文件來覆蓋,tomcat下面的文件的。
特定的目錄實現https訪問
解決方案:
在web.xml文件中配置相應的路徑
<security-constraint><!-- Authorization setting for SSL --><web-resource-collection><web-resource-name>SSL</web-resource-name><url-pattern>/login.html</url-pattern></web-resource-collection><user-data-constraint><transport-guarantee>CONFIDENTIAL</transport-guarantee></user-data-constraint></security-constraint>
㈣ Java Keytool生成數字證書/.cer/.p12文件
如何使用 JDK 自帶的 keytool 創建 p12 文件
創建私鑰和證書:
1. 打開命令提示符,切換至 JDK 的 bin 目錄。
2. 輸入命令:
storepass: 設置 keystore 文件存儲密碼。keypass: 設置私鑰加解密密碼。alias: 設置實體別名,即包括證書私鑰。dname: 填寫證書個人信息。keyalg: 選擇公鑰演算法,默認為 DSA,此處建議採用 RSA。keysize: 指定密鑰長度,注意 DSA 演算法可能不支持 2048 長度,此時需採用 RSA。validity: 設置有效期。keystore: 指定 keystore 文件存儲位置。
3. 命令行會請求輸入相關信息,為了試驗,隨便填寫即可。
4. 最後一行:輸入密鑰口令,如果與之前設置的 keystore 密碼相同,直接回車;若不同,則輸入新口令。
5. 完成上述步驟後,秘鑰庫中生成了數字證書(未經 CA 認證),不影響使用。可導出數字證書給合作夥伴,實現加密通信。
查看 keystore 詳情:
輸入命令,查看 keystore 的詳細信息。
導出本地證書(.cer):
輸入命令:
參數:-export 表示證書導出操作。-keystore 指定秘鑰庫文件。-file 指定導出文件路徑。-storepass 輸入密碼。-rfc 指定以 Base64 編碼格式輸出。
列印數字證書:
輸入命令,列印出數字證書。
將 .cer 格式證書轉換為 p12 證書:
輸入命令:
步驟:執行轉換命令,輸入目標密鑰庫口令和源密鑰庫口令。目標密鑰庫口令為設置 .p12 證書的口令,源密鑰庫口令為 .cer 證書的密鑰庫口令。
P12 證書相關命令:
生成證書:
導出證書:
㈤ 關於公私鑰、各種證書、https基本概念掃盲
最近實習需要寫一些生成證書的腳本,藉此機會順便搞清楚了許多關於證書這塊的疑惑。說到這一塊東西,名詞多到爆炸,對稱加密、非對稱加密、密鑰、密鑰庫、公鑰、私鑰、CA、證書、數字簽名、ssh、https、ssl、keytool、openssl、PKCS、X.509以及令人眼花繚亂的文件後綴名,cer、crt、pem、keystore、jks、key、p12、pfx...
先聽我講個故事,這次我們不用Bob和Alice,聽完之後再去看這些概念,絕壁恍然大悟。
故事背景: 這是2018年,為了能夠安全的進行通信,假設每個人都有倆把鎖,一個叫A鎖,一個叫B鎖,這倆把鎖和一般的鎖有點區別,每把鎖上即帶有自己的鎖孔又帶有另一把鎖的鑰匙,因此A鎖和B鎖既是鎖又是鑰匙。 A鎖和B鎖唯一配對,A鎖鎖住之後,只有B鎖可以打開,同樣B鎖鎖住之後,只有A鎖可以打開 。其中一把鎖是公開的,而一把鎖則自己保管,不公開。假設默認A鎖是公開的,B鎖是私有的。
故事內容: 阿里巴巴子弟小學的小明想給隔壁班的小花寫封表白信,為了不被別人看到,他將信放入在信箱中,並用小花的A鎖將信箱鎖住,因為小花的B鎖(同是A鎖的鑰匙)只有小花自己有,所以除了小花以外的任何人拿到信件,都無法看到信件內容。同樣小花要給小明寫信,那麼也要用小明的A鎖對信件內容進行保護。
小明與小花通過就這樣聊了有一段時間,後來小花覺得差不多了,可以進入秀恩愛的階段了,跟小明說,以後寫信別tm加密了,又不是銀行卡密碼,被人看到又能怎麼樣呢?只要看了之後別瞎改就行了。於是小明在寫完信後,把信里每個字的拼音首字母拼湊了一個字元串,並取名為 消息摘要 ,然後僅僅將消息摘要放入信箱,用自己的B鎖鎖住這個信箱。雖然信件本身沒有放入安全的信箱,但小明作為一個情書高手,隨便一封信都是上萬字,如果其他人對信件內容做任何改變,那麼拼音首字母組成的字元串幾乎肯定會改變,因此小花拿到信件後,先用小明的A鎖(B鎖的鑰匙)打開信箱,拿到小明的摘要,然後小花再對信件內容做同樣的處理(即計算信件每個字的拼音首字母,實際上不會用這么簡單的演算法,而是會用不可逆的hash演算法),計算出的字元串值如與小明的信息摘要一致,說明這封信就是小明寫給自己的,沒有被任何人篡改。
故事高潮: 事情並沒有那麼簡單,小花發現小明只是在信件里對自己熱情似火,平常見了面連聲招呼都不打,一副不認識的樣子。終於有一天小花忍不住了,當面質問小明,小明卻說,我什麼時候給你寫情書了,自作多情吧...於是小花把昨天剛收到的情書狠狠甩在了小明臉上:「上面落款不是你小明嗎?怎麼了,慫了?」小明一看上面還真是自己的名字,但是自己寫沒寫信自己還不知道嗎?小明把自己的作業本拿給小花,並叫自己的同桌做筆跡鑒定,小花發現筆跡的確不大像,看來是有人惡作劇,冒充小明給自己寫情書,哎,好尷尬啊。。。
故事講完了,文章開頭涉及的所有概念都與信息的安全傳輸有關,可以說,一切都是為了安全。關於通信安全,我們通常有三個基本的需求
我們以上面的故事為例說一下這三點安全需求,一開始小明與小花通過A鎖( 對應公鑰 )加密,B鎖( 對應私鑰 )解密的通信方式即符合第一點,信件內容本身被加密,而因為公私鑰唯一配對,只有配對的密鑰才可以解密,因此很難被第三人破解。
之後,為了秀恩愛,他們採用了B鎖( 私鑰 )加密,A鎖( 公鑰 )解密的通信方式,其中用私鑰對消息摘要加密後的字元串稱為 數字簽名 ,這樣雖然信件可以被人直接看到,但如果被人篡改掉後可以輕易發現數據被篡改。本來以為滿足第一條和第二條就可以安全的通信了,但最後才發現小明根本不是小明!為什麼會出現這樣的問題?因為「小明」說他是小明,小花就以為他是小明,他沒有提供任何證明自己真的是小明的認證。因此要想安全通信,我們還需要一個權威第三方的機構來做身份認證,這個機構就是CA機構,通過認證後,CA機構會頒發權威的證書,而有了證書就可以證明身份,就不會出現身份被假冒的情況。而認證的過程則需要向CA機構提供自己的身份信息以及私鑰。
對稱加密就是通信雙方或多方採用的密鑰是一樣的。加解密速度快,但不夠安全。因為一旦密鑰泄露,誰都可以對數據進行解密。非對稱加密就是當然就是通信雙方使用的密鑰不同。而公鑰和私鑰就是非對稱加密的一種方式。比較常用的對稱加密演算法如
AES、DES,非對稱加密比較常見的則有sha256,RSA。
非對稱加密演算法有倆個密鑰,一個公鑰,一個私鑰。公鑰和私鑰必須配對出現,一對公鑰和一個私鑰統稱為一個 密鑰 ,而 密鑰庫 中可以存放多個密鑰,即多對公私鑰。
如果你用github的話,應該注意到github鏈接有倆種方式。一種是https,一種是ssh,通過https經常需要輸密碼,而通過ssh則不需要。回憶你設置ssh的步驟,本地生成了一個密鑰對,並將公鑰上傳到了github。每次傳輸用自動本地私鑰加密,伺服器用你上傳的公鑰解密,就不需要手動輸入密碼了。
keytool和openssl是倆個證書管理工具.keytool是java JDK自帶的證書管理工具,使用keytool可以生成密鑰,創建證書。只要裝了jdk,並正確設置了環境變數,就可以之間通過命令行執行keytool命令來管理證書。
openssl則是一個開源的安全套接字層密碼庫,功能比keytool更加豐富。
PKCS全稱Public-Key Cryptography Standards 即公鑰標准,PKCS已經發布了15個標准。
PKCS#12 包含了公鑰和私鑰的二進制格式的證書形式,以pfx作為證書文件後綴
X.509 則是一個通用的證書標准,規定了證書應該包含哪些內容,X.509通常有倆種編碼方式,一種是二進制編碼,另一種是base64編碼
X.509#DER 二進制格式證書,常用後綴.cer .crt
X.509#PEM 文本格式證書,常用後綴.pem
因為http是明文傳輸,非常不安全,因此又提出了ssl(Secure Sockets Layer即安全套接字)層協議,即在原來的基礎上又加了一層協議用於保障安全傳輸,可以認為https=ssl+http。很多人剛開始接觸https,用瀏覽器F12打開控制台後。可能發現數據仍然沒有加密。要注意https是 傳輸層加密 ,瀏覽器F12控制台你看到的還是應用層的數據。
因為本文主要是概念掃盲,幫助理解,因此關於這部分具體細節不作介紹。
.keystore和.jks和.truststore都是java用來存放密鑰的文件
.key nginx中私鑰文件
而不同的證書文件後綴都是為了區分不同種類的證書的,主要有倆個分類維度