1. 程式人生 > >java加密解密

java加密解密

子郵件 openssl sock 天數 file 驗證 word genrsa https

一:
1.KeyManagerFactory類(密鑰管理工廠,用來管理密鑰):
構建密鑰庫管理工廠與下例一樣:
System.setProperty("javax.net.ssl.keyStore","D:\\server.keystore");
System.setProperty("javax.net.ssl.keyStorePassword","123456");
2.TrustManagerFactory類(用於管理信任材料的管理器工廠)
構建信任庫管理工廠與下例一樣:
System.setProperty("javax.net.ssl.trustStore","D:\\server.keystore");
System.setProperty("javax.net.ssl.trustStorePassword","123456");
3.

SSLContext類(用於表示安全套接字上下文,為安全套接字協議的實現,充當安全套接字工廠或SSLEngine的工廠):用一組密鑰和信任管理器及安全隨機字節初始化此類
4.HttpsURLConnection類(構建https連接)
5.SSLSession接口(用於保持SSL協議網絡交互會話狀態,可獲得加密套件CipherSuite、數字證書)。
6.SSLSocketFactory類(用於創建SSLSocket,並獲得相應加密套件)
7.SSLSocket類(基於SSL協議的Socket,用於設置加密套件、處理握手結束事件,並管理SSLSession)
8.SSLServerSocketFactory類(和SSLSocketFactory類一樣,只是構建的Socket是SSLServerSocket類)
9.
SSLServerSocket類(專用於服務端的SSLSocket,是ServerSocket的子類)

二:數字證書概念描述:
1.數字證書為加密算法和公鑰的載體。
1.1 證書的簽發過程:為對申請數字證書的公鑰做數字簽名
1.2 證書的驗證過程:為對數字證書的公鑰做驗證簽名,包括證書有效期驗證。
2.數字證書采用了公鑰基礎設施(PKI),包含了:非對稱加密算法、數字簽名算法、消息摘要算法:
2.1 非對稱加密算法:用於對數據進行加密/解密操作,確保數據機密性
2.2 數字簽名算法:用於對數據進行簽名/驗證操作,確保數據的完整性和抗否認性
2.3 消息摘要算法:用於對數字證書本身做摘要處理,確保數字證書完整性(有的叫:指紋算法)
3.

數字證書文件編碼格式:CER(可變長)、DER(定長)
4.目前主要有JKS和PEM兩種編碼格式文件:
4.1 JKS:java原生的密鑰庫/信任庫文件
4.2 PEM(隱私增強郵件):使用多種加密方法提供機密性、認證和信息完整性的因特網電子郵件,在OpenSSL中最為常見的密鑰庫文件。
5.通常使用Base64編碼格式作為數字證書文件存儲格式
6.KeyTool進行數字證書管理:用於數字證書的申請、導入、導出和撤銷等操作。與本地密鑰庫相關聯,將私鑰存於密鑰庫,公鑰則以數字證書輸出。KeyTool位於%JDK_HOME%\bin目錄下

三:使用KeyTool進行證書管理:
1.構建自簽名證書(自己為自己簽發一個數字證書,未進行CA認證)
1.1 生成密鑰對,放於生成的數字證書中(基於某種非對稱加密算法的公私鑰):“www.zlex.org”為別名,RSA為加密算法,密鑰長度為2048位,SHA1withRSA為數字簽名算法,簽發有效期為36000天
例:keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 36000 -alias www.zlex.org -keystore zlex.keystore
-dname "CN=www.zlex.org, OU=zlex, O=zlex, L=BJ, ST=BJ, C=CN"
命令說明:
-genkeypair   生成密鑰對
-keyalg    指定密鑰算法,這裏為RSA算法
-keysize   指定密鑰長度,默認為1024位,這裏指定為2048位
-sigalg    指定數字簽名算法,這裏為SHA1withRSA
-validity   指定證書有效期,這裏為36000天
-alias    指定別名,這裏為www.zlex.org
-keystore   指定密鑰庫存儲位置,這裏是zlex.keystore(新生成的密鑰對就在裏面)
-dname   指定用戶信息 (創建數字證書時避免手輸)
-storepass 指定密碼(創建數字證書時避免手輸)
1.2 導出數字證書
例: keytool -exportcert -alias www.zlex.org -keystore zlex.keystore -file zlex.cer -rfc -storepass 123456
-exportcert 證書導出操作
-alias 指定導別名,這裏為 www.zlex.org
-keystore 指定密鑰庫文件,這裏為 zlex.keystore
-file 指定導出文件路徑,這裏為 zlex.cer (此為數字證書)
-rfc 指定以Base64編碼格式輸出
-storepass 指定導出時的密碼,這裏為 123456
1.3 將數字證書中的內容打印出來 (將zlex.cer中的內容打印出來)
例:keytool -printcert -file zlex.cer
2.構建CA簽發證書
1.若要獲取CA機構認證的證書,需生成數字證書簽發申請(CSR),經CA機構認證並頒發,同時將認證後的證書導入本地密鑰庫和信任庫
例:keytool -certreq -alias www.zlex.org -keystore zlex.keystore -file zlex.csr -v -storepass 123456
-certreq 生成數字證書簽發申請操作
-alias 指定別名,這裏為 www.zlex.org
-keystore 指定密鑰庫文件,這裏為 zlex.keystore
-file 指定導出文件路徑 ,這裏為 zlex.csr
-v 詳細信息
-storepass 指定導出時的密碼,這裏為 123456
2.導入數字證書
例:keytool -importcert -trustcacerts -alias www.zlex.org -file zlex.cer -keystore zlex.keystore -storepass 123456
-importcert 導入數字證書
-trustcacerts 將數字證書導入信任庫
-alias 指定導別名,這裏為 www.zlex.org
-file 指定導入數字證書文件路徑,這裏為 zlex.cer
-keystore 指定密鑰庫文件,這裏為 zlex.keystore
-storepass 指定導入時設置的密碼,這裏為 123456
3.列出密鑰庫中的條目
例:keytool -list -alias www.zlex.org -keystore zlex.keystore -storepass 123456
-list 列出密鑰庫中的條目
-alias 指定別名,這裏為 www.zlex.org
-keystore 指定密鑰庫文件,這裏為 zlex.keystore
-storepass 指定輸出時要輸入的密碼,這裏為 123456

四:OpenSSL證書管理
1.功能遠勝KeyTool,可用於根證書、服務器證書、客戶端證書管理。
2.下載OpenSSL後得先配置環境變量
2.1 變量名: OpenSSL_Home C:\OpenSSL(安裝目錄)
2.2 將變量加入到系統變量Path: %OpenSSL_Home%\bin;
3.構建根證書
3.1 構建根證書前,得先構建隨機數文件(.rand)
例子:openssl rand -out private/.rand 1000
rand 隨機數命令
-out 輸出文件路徑,這裏將隨機數文件輸出到private目錄下
1000 產生偽隨機字節數
4.構建根證書私鑰(通常使用PEM編碼格式保存私鑰)(此處私鑰在5中會用到)
例子:openssl genrsa -aes256 -out private/ca.key.pem 2048 (執行這條命令後還得設置根證書密碼:123456)
genrsa 產生RSA密鑰命令
-aes256 使用AES算法(256位密鑰)對產生的私鑰加密。可選算法包括DES、DESede、IDEA和AES
out 輸出路徑,這裏指private/ca.key.pem(生成的根證書私鑰)
2048 指RSA密鑰長度位數,默認長度為512位
5.完成密鑰構建後,還得生成根證書簽發申請文件(ca.csr) (此處執行下列命令後,需輸入根證書密碼:123456)
例子:openssl req -new -key private/ca.key.pem -out private/ca.csr -subj "/C=CN/ST=BJ/L=BJ/O=zlex/OU=zlex/CN=*.zlex.org"
req 產生證書簽發申請命令
-new 表示新請求
-key 密鑰,這裏為private/ca.key.pem文件(根證書私鑰)
-out 輸出路徑,這裏為private/ca.csr文件(根證書申請文件)
-subj 指定用戶信息,這裏使用泛域名"*.zlex.org"作為用戶名
6.獲得根證書簽發申請文件後,進行根證書簽發(一般要將ca.csr發給CA機構簽發,此處進行自行簽發。執行下列命令後還需輸入根證書密鑰:123456)
例子:openssl x509 -req -days 10000 -shal -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certs/ca.cer
x509 簽發X.509格式證書命令
-req 證書輸入請求
-days 證書有效天數,這裏為10000天
-shal 證書摘要算法,這裏為SHA1算法
-extensions   按OpenSSL配置文件v3_ca項添加擴展
-signkey    自簽名密鑰,這裏為private/ca.key.pem(根證書私鑰)
-in    輸入文件,這裏為private/ca.csr(根證書申請文件)
-out    輸出文件,這裏為certs/ca.cer(生成的根證書)
7.根證書轉換:簽發獲得數字證書後(根證書),在java環境中是不能直接用的,需轉化為PKCS#12編碼格式。(執行下列命令後,還需輸入根證書密鑰:123456)
例子:openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certs/ca.cer -out certs/ca.p12
pkcs12    PKCS#12編碼格式證書命令
-export    導出證書
-cacerts    僅導出CA證書
-inkey    輸入密鑰,這裏為private/ca.key.pem(根證書密鑰)
-in    輸入文件,這裏為certs/ca.cer (原始的根證書)
-out    輸出文件,這裏為certs/ca.p12 (轉碼後的根證書)
8.使用KeyTool查看個人信息交換文件(PKCS#12),該類型文件可作為密鑰庫或信任庫使用。(下列作為密鑰庫文件,查看密鑰庫信息)
例子:keytool -list -keystore certs/ca.p12 -storetype pkcs12 -v -storepass 123456
註意:構建根證書(ca.cer)成功後,可根據根證書簽發服務器證書和客戶證書

9.構建服務器證書的密鑰(執行下列命令後,需輸入服務器證書密碼:123456)
例子:openssl genrsa -aes256 -out private/server.key.pem 2048
genrsa    產生RSA密鑰命令
-aes256    使用AES算法(256位密鑰)對產生的私鑰加密。可選算法包括DES、DESede、IDEA和AES
out   輸出路徑,這裏指private/server.key.pem(生成的服務器證書私鑰)
2048    指RSA密鑰長度位數,默認長度為512位
10.服務器證書密鑰構建成功後,需生成服務器證書簽發申請文件(執行下列命令後,還需輸入服務器證書密碼:123456)
例子:openssl req -new -key private/server.key.pem -out private/server.csr -subj "/C=CN/ST=BJ/L=BJ/O=zlex/CN=www.zlex.org"
req    生成證書簽發申請文件命令
-new    新請求
-key    密鑰,這裏為private/server.key.pem(為9中生成的服務器證書密鑰)
-out    輸出路徑,這裏為private/server.csr(生成的證書簽發申請文件)
-subj    指定用戶信息,這裏使用域名"www.zlex.org"作為用戶名
11.根據根證書進行服務器證書進行簽發,生成服務器證書(執行下列命令後,需設置服務器證書密碼:123456)
例子:openssl x509 -req -days 3650 -shal -extensions v3_req -CA certs/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out certs/server.cer
x509    簽發X.509格式證書命令
-req    證書輸入請求
-days   有效天數,這裏為3650天
-sha1    證書摘要算法,這裏為SHA1算法
-extensions   按OpenSSL配置文件v3_req項添加擴展
-CA   CA證書,這裏為certs/ca.cer(根證書)
-CAkey    CA證書密鑰,這裏為private/ca.key.pem
-CAserial    CA證書序列號文件,這裏為ca.srl
-CAcreateserial    創建CA證書序列號
-in    輸入文件,這裏為private/server.csr(服務器證書簽發申請文件)
-out    輸出文件,這裏為certs/server.cer(服務器證書)
12.生成的服務器證書不能直接使用,需將證書轉化為PKCS#12格式(執行下列命令後,需輸入服務器證書密碼:123456)
例子:openssl pkcs12 -export -clcerts -inkey private/server.key.pem -in certs/server.cer -out certs/server.p12
pkcs12   PKCS#12編碼格式證書命令
-export    導出證書
-clcerts   僅導出客戶證書
-inkey    輸入密鑰文件路徑,這裏為private/server.key.pem(為9中生成的服務器證書密鑰)
-in    輸入文件路徑,這裏為certs/server.cer(原證書文件)
-out    輸出文件路徑,這裏為certs/server.p12(轉碼後的證書文件)
註意此處已經表示構建服務器證書成功,可使用該證書構建基於單向認證的網絡交互平臺了

13.構建客戶證書,先構建客戶私鑰(與構建服務證書差不多,執行下列命令後,需設置客戶證書密碼:123456)
例子:openssl genrsa -aes256 -out private/client.key.pem 2048
genrsa    產生RSA密鑰命令
-aes256    使用AES算法(256位密鑰)對產生的私鑰加密。可選算法包括DES、DESede、IDEA和AES
out    輸出路徑,這裏指private/client.key.pem(生成的客戶證書私鑰)
2048    指RSA密鑰長度位數,默認長度為512位
14.客戶證書密鑰申請成功後,需生成客戶證書簽發申請文件(執行下列命令後,需輸入客戶證書密碼:123456)
例子:openssl req -new -key private/client.key.pem -out private/client.csr -subj "/C=CN/ST=BJ/L=BJ/O=zlex/CN=zlex"
req    生成證書簽發申請文件命令
-new    新請求
-key   密鑰,這裏為private/client.key.pem(為9中生成的服務器證書密鑰)
-out    輸出路徑,這裏為private/client.csr(生成的證書簽發申請文件)
-subj    指定用戶信息,這裏使用域名"zlex"作為用戶名
15.根據根證書和客戶證書簽發申請文件,生成客戶證書(執行下列命令後,需輸入客戶證書密碼:123456,並同意簽發證書)
例子:openssl ca -days 3650 -in private/client.csr -out certs/client.cer -cert certs/ca.cer -keyfile private/ca.key.pem
ca    簽發證書命令
-days    證書有效期,這裏為3650天
-in    輸入文件,這裏為private/client.csr(客戶證書簽發申請文件)
-out   輸出文件,這裏為certs/server.cer(客戶證書文件)
-cert    根證書文件,這裏為certs/ca.cer
-keyfile    根證書密鑰文件,這裏為private/ca.key.pem
16.生成的客戶證書不能直接使用,需進行PKCS#12編碼轉換(執行下列命令後,需輸入客戶證書密碼:123456)
例子:openssl pkcs12 -export -clcerts -inkey private/client.key.pem -in certs/client.cer -out certs/client.p12
pkcs12   PKCS#12編碼格式證書命令
-export    導出證書
-clcerts    僅導出客戶證書
-inkey    輸入密鑰,這裏為private/client.key.pem
-in    輸入文件,這裏為certs/client.cer(原客戶證書文件)
-out    輸出文件,這裏為certs/client.p12(轉碼後證書文件)
註意:到達此處時,已經生成了服務端和客戶端證書,此時可以進行雙向認證了。

java加密解密