Java SSL與TLS客戶端證書配置方式
一、TLS安全概念
(1)PKI
PKI是 Public Key Infrastructure的簡(jiǎn)稱,意思是公鑰基礎(chǔ)設(shè)施。
公鑰基礎(chǔ)設(shè)施是提供公鑰加密和數(shù)字簽名服務(wù)的系統(tǒng)或平臺(tái),目的是為了管理密鑰和證書。通過(guò)證書和秘鑰來(lái)確認(rèn)通訊雙方是否可信任。
(2)CA
CA是Certificate Authority的簡(jiǎn)稱,即證書的簽發(fā)機(jī)構(gòu),它是PKI的核心。
正常情況來(lái)說(shuō),CA是具有權(quán)威性的機(jī)構(gòu),通過(guò)CA獲取證書需要給錢。
但是有的時(shí)候可能不想用CA機(jī)構(gòu)的證書,又想要使用https站點(diǎn),那么可能就需要自己生成證書,但是這種證書瀏覽器是認(rèn)為不安全的,本文檔后邊的具體步驟即針對(duì)這種場(chǎng)景。
(3)https
https是http+ssl,通俗點(diǎn)說(shuō),就是采用http通訊的安全傳輸協(xié)議,用來(lái)保證http傳輸過(guò)程中數(shù)據(jù)的機(jī)密性、完整性和可靠性,ssl需要證書。
(4)單向認(rèn)證
網(wǎng)絡(luò)通訊是雙向的,但是安全認(rèn)證不一定都是雙向。大多數(shù)情況下可能都是單向的,只需要客戶端確認(rèn)服務(wù)端是可靠的,而服務(wù)端不管客戶端是否可靠。
即客戶端,比如瀏覽器會(huì)驗(yàn)證服務(wù)端證書,服務(wù)端不需要客戶端證書。
(5)雙向認(rèn)證
雙向認(rèn)證相對(duì)于單向認(rèn)證,即客戶端需要確認(rèn)服務(wù)端是否可信,服務(wù)端也需要確認(rèn)客戶端是否可信。
雙方都要驗(yàn)證對(duì)方的證書
(6)SSL
Secure Sockets Layer,一種加密協(xié)議規(guī)范,如https就使用它進(jìn)行加解密
(7)OpenSSL
一種ssl規(guī)范的實(shí)現(xiàn),可以幫助我們生成解析各類證書
(8)X.509
證書標(biāo)準(zhǔn),比如證書應(yīng)該包含哪些信息
(9)PEM
Privacy Enhanced Mail,一種編碼格式,常用于Apache和UNIX服務(wù)器,查看證書信息:openssl x509 -in certificate.pem -text -noout
(10)DER
Distinguished Encoding Rules,一種編碼格式,常用于Java和Windows服務(wù)器,查看證書的信息:openssl x509 -in certificate.der -inform der -text -noout
(11)CRT
certificate,證書文件,常見于UNIX系統(tǒng),大多應(yīng)是PEM編碼
(12)CER
certificate,證書文件,常見于Windows系統(tǒng),大多應(yīng)是DER編碼.
(13)KEY
通常用來(lái)存放一個(gè)公鑰或者私鑰,查看不同編碼格式文件內(nèi)容
(14)CSR
Certificate Signing Request,即證書簽名請(qǐng)求,這個(gè)并不是證書,而是向權(quán)威證書頒發(fā)機(jī)構(gòu)獲得簽名證書的申請(qǐng),查看方法:openssl req -noout -text -in my.csr (DER格式同上后面加上-inform der)
(15)PFX/P12
predecessor of PKCS#12,對(duì)Unix服務(wù)器來(lái)說(shuō),一般CRT和KEY是分開存放在不同文件中的,但Windows的IIS則將它們存在一個(gè)PFX文件中,因此這個(gè)文件包含了證書及私鑰。
(16)JKS
Java Key Storage,跟OpenSSL關(guān)系不大,Java的keytool工具可以將PFX轉(zhuǎn)為JKS,也能直接生成JKS
二、證書存儲(chǔ)格式
1、pem格式:pem、crt、key后綴。編碼方式base64,key使用pkcs1、pkcs8格式存儲(chǔ)
2、p12(通用的證書存儲(chǔ)格式)
3、jks(java的證書存儲(chǔ)格式,依賴jdk版本,小版本差異會(huì)報(bào)錯(cuò))
三、證書客戶端設(shè)置
KeyManager是提供客戶端證書管理,TrustManager是信任服務(wù)端證書管理
(1)單向認(rèn)證
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
FileInputStream caInputStream = new FileInputStream(caPath);
List<X509Certificate> caList = certificateFactory.generateCertificates(caInputStream).stream().map(v->
(X509Certificate)v).collect(Collectors.toList());
KeyStore keystore = KeyStore.getInstance("JKS");
keystore.load(null, null);
for(X509Certificate ca: caList)
keystore.setCertificateEntry(ca.getSubjectDN().getName(), ca);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX");
tmf.init(keystore);
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), new SecureRandom());(2)雙向認(rèn)證
private void sslContext() {
// 初始化密鑰庫(kù)
KeyManagerFactory keyManagerFactory = KeyManagerFactory
.getInstance("SunX509");
KeyStore keyStore = getKeyStore("client.jks", "123456", "PKCS12");
keyManagerFactory.init(keyStore, "123456".toCharArray());
// 初始化信任庫(kù)
TrustManagerFactory trustManagerFactory = TrustManagerFactory
.getInstance("SunX509");
KeyStore trustkeyStore = getKeyStore("server.jks", "123456", "JKS");
trustManagerFactory.init(trustkeyStore);
// 初始化SSL上下文
SSLContext ctx = SSLContext.getInstance("SSL");
ctx.init(keyManagerFactory.getKeyManagers(), trustManagerFactory
.getTrustManagers(), null);
}
private KeyStore getKeyStore(String keyStorePath, String password, String type)
throws Exception {
FileInputStream is = new FileInputStream(keyStorePath);
KeyStore ks = KeyStore.getInstance(type);
ks.load(is, password.toCharArray());
is.close();
return ks;
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
智能 AI 代碼生成工具 Cursor 安裝和使用超詳細(xì)教程
Cursor.so 是一個(gè)集成了 GPT-4 的國(guó)內(nèi)直接可以訪問(wèn)的,優(yōu)秀而強(qiáng)大的免費(fèi)代碼生成器,可以幫助你快速編寫、編輯和討論代碼,這篇文章主要介紹了智能 AI 代碼生成工具 Cursor 安裝和使用介紹,需要的朋友可以參考下2023-05-05
Java趣味練習(xí)題之輸出兩個(gè)日期之間的相隔天數(shù)
本篇文章介紹了我看到的一個(gè)趣味小題目,怎么求得兩個(gè)日期之間相隔的天數(shù),以及解決該題目的過(guò)程及思路,通讀本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下2021-10-10
MyBatis的動(dòng)態(tài)SQL語(yǔ)句實(shí)現(xiàn)
這篇文章主要介紹了MyBatis的動(dòng)態(tài)SQL語(yǔ)句實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
Java實(shí)現(xiàn)AES加密算法的簡(jiǎn)單示例分享
這篇文章主要介紹了Java實(shí)現(xiàn)AES加密算法的簡(jiǎn)單示例分享,AES算法是基于對(duì)密碼值的置換和替代,需要的朋友可以參考下2016-04-04
Springboot jpa @Column命名大小寫問(wèn)題及解決
這篇文章主要介紹了Springboot jpa @Column命名大小寫問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
簡(jiǎn)單了解java ibatis #及$的區(qū)別和用法
這篇文章主要介紹了簡(jiǎn)單了解java ibatis #及$的區(qū)別和用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
struts1之ActionServlet詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了struts1之ActionServlet詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09

