CA双向认证
一、雙向認(rèn)證
CA認(rèn)證有單向認(rèn)證和雙向認(rèn)證,在我們?nèi)粘>W(wǎng)頁(yè)瀏覽中,我們接觸到的大多數(shù)是單向認(rèn)證,而在一些銀行系統(tǒng)等對(duì)安全性要求比較高的系統(tǒng),會(huì)采用雙向認(rèn)證。
單向認(rèn)證只是客戶端(瀏覽器)認(rèn)證服務(wù)端(例如tomcat等), 雙向認(rèn)證指的是服務(wù)端和客戶端之間相互都要認(rèn)證(在瀏覽器體現(xiàn)為需要安裝進(jìn)證書)。
https的雙向認(rèn)證大概過(guò)程(摘自http://blog.chinaunix.net/uid-26335251-id-3508651.html):
1 瀏覽器發(fā)送一個(gè)連接請(qǐng)求給安全服務(wù)器。
2 服務(wù)器將自己的證書,以及同證書相關(guān)的信息發(fā)送給客戶瀏覽器。
3 瀏覽器檢查服務(wù)器送過(guò)來(lái)的證書是否是由自己信賴的 CA 中心所簽發(fā)的。如果是,就繼續(xù)執(zhí)行協(xié)議;如果不是,客戶瀏覽器就給客戶一個(gè)警告消息:警告客戶這個(gè)證書不是可以信賴的,詢問(wèn)客戶是否需要繼續(xù)。
4 接著客戶瀏覽器比較證書里的消息,與服務(wù)器剛剛發(fā)送的相關(guān)消息是否一致,如果是一致的,客戶瀏覽器認(rèn)可這個(gè)服務(wù)器的合法身份。
5 服務(wù)器要求客戶發(fā)送客戶自己的證書。收到后,服務(wù)器驗(yàn)證客戶的證書,如果沒(méi)有通過(guò)驗(yàn)證,拒絕連接;如果通過(guò)驗(yàn)證,服務(wù)器獲得用戶的公鑰。
6 客戶瀏覽器告訴服務(wù)器自己所能夠支持的通訊對(duì)稱密碼方案。
7 服務(wù)器從客戶發(fā)送過(guò)來(lái)的密碼方案中,選擇一種加密程度最高的密碼方案,用客戶的公鑰加過(guò)密后通知瀏覽器。
8 瀏覽器針對(duì)這個(gè)密碼方案,選擇一個(gè)通話密鑰,接著用服務(wù)器的公鑰加過(guò)密后發(fā)送給服務(wù)器。
9 服務(wù)器接收到瀏覽器送過(guò)來(lái)的消息,用自己的私鑰解密,獲得通話密鑰。
10 服務(wù)器、瀏覽器接下來(lái)的通訊都是用對(duì)稱密碼方案,對(duì)稱密鑰是加過(guò)密的。
二、搭建CA證書頒發(fā)中心
1 創(chuàng)建rsaCA目錄
mkdir rsaCA
mkdir -p ./rsaCA/{private,newcerts} && \
??? touch ./rsaCA/index.txt && \
??? touch ./rsaCA/serial && \
echo 01 > ./rsaCA/serial
touch rsaCA/index.txt.attr
把openssl.cnf放到rsaCA目錄下
2 生成ca私鑰
openssl genrsa -out ./rsaCA/private/cakey.pem 2048
3 生成證書請(qǐng)求
?? openssl req -new -days 3650 -key ./rsaCA/private/cakey.pem -out careq.pem -config ./rsaCA/openssl.cnf
?
4 根據(jù)CA私鑰生成CA的自簽名證書
openssl ca -selfsign -in careq.pem -out ./rsaCA/cacert.pem -extensions v3_ca -config ./rsaCA/openssl.cnf
?
三、生成客戶端證書
1 客戶端私鑰生成證書簽名請(qǐng)求( cacsr.cer為請(qǐng)求證書,client_crt.cer為簽名證書)
??? 生成RSA私鑰
openssl genrsa -out client.pem 2048
??? 生成證書請(qǐng)求
?? openssl req -new -days 3650 -key client.pem ?-out client_csr.pem ?-config ./rsaCA/openssl.cnf
2.使用CA的私鑰和證書對(duì)用戶證書簽名(openssl.cnf為gmssl/ssl目錄下的配置文件)
openssl ca -in client_csr.pem ?-out client_cert.cer ?-extensions v3_ca -config ./rsaCA/openssl.cnf
?
四、生成服務(wù)端證書(這里使用的是tomcat)
1 生成服務(wù)器證書
使用keytool為Tomcat生成證書,假定目標(biāo)機(jī)器的域名是localhost或者“192.168.1.1”,keystore文件為tomcat.keystore,口令為“l(fā)ogiscn”,使用如下命令生成:
keytool -genkey -v -alias tomcat -keyalg RSA -keystore tomcat.keystore -dname "CN=192.168.1.1,OU=logiscn,O=logis,L=beijing,ST=beijing,C=CN" -validity 3650 -storepass logiscn -keypass logiscn
2 將CA機(jī)構(gòu)自簽名證書導(dǎo)入tomcat中
keytool -import -alias ca -v -file ./rsaCA/cacert.pem -keystore /root/rsa/tomcat.keystore -storepass logiscn
3 將客戶端證書導(dǎo)入tomcat中
keytool -import -alias tianli -v -file /root/CA/test/client_crt.cer -keystoretomcat.keystore -storepass logiscn
4?配置Tomcat服務(wù)器
打開Tomcat根目錄下的/conf/server.xml,找到如下配置段,修改如下:
打開注釋
? ?<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
? ? ? ? maxThreads="150" scheme="https" secure="true"
? ? ? ? clientAuth="true" sslProtocol="TLS"
? ? ? ? keystoreFile="/root/rsa/tomcat.keystore" keystorePass="logiscn"
? ? ? ? truststoreFile="/root/rsa/tomcat.keystore" truststorePass="logiscn" />
其中,clientAuth指定是否需要驗(yàn)證客戶端證書,如果該設(shè)置為“false”,則為單向SSL驗(yàn)證,SSL配置可到此結(jié)束。如果clientAuth設(shè)置為“true”,表示強(qiáng)制雙向SSL驗(yàn)證,必須驗(yàn)證客戶端證書。如果clientAuth設(shè)置為“want”,則表示可以驗(yàn)證客戶端證書,但如果客戶端沒(méi)有有效證書,也不強(qiáng)制驗(yàn)證。
5 重啟tomcat
?
五、實(shí)現(xiàn)類似銀行U盾的操作
以前用過(guò)網(wǎng)銀的朋友們可能知道,在我們登錄網(wǎng)銀的時(shí)候是需要插入一個(gè)U盾的,其實(shí)他也是一個(gè)雙向認(rèn)證的原理。在這里,我們可以借助第三方工具u-key來(lái)實(shí)現(xiàn)。
可以購(gòu)買市面上現(xiàn)成的u-key,將上述做成的客戶端證書導(dǎo)入u-key中,在設(shè)置u-key的密碼,這樣就可以實(shí)現(xiàn)客戶想要訪問(wèn)服務(wù)器,必須擁有u-key以及登錄密碼才可訪問(wèn)的功能了。
?
附:
openssl一些用法
顯示證書信息。
cacert.pem為已加簽后的證書文件
opensslx509 -text -noout -in cacert.pem
顯示申請(qǐng)加簽的證書信息
cacsr.pem為申請(qǐng)加簽的文件
openssl req -in cacsr.pem -noout -text
顯示公私鑰信息
cakey.pem為私鑰文件
openssl pkey -pubout -in cakey.pem -noout-text
由私鑰文件導(dǎo)致公鑰命令
cakey.pem為私鑰文件,public.pem為生成的公鑰文件
openssl pkey -pubout -in cakey.pem -out public.pem
顯示公鑰文件的公鑰信息
public.pem為公鑰文件
openssl pkey -pubin -in public.pem -noout -text
提取用戶證書:
openssl pkcs12 -in test.p12 -clcerts -nokeys -out cert.pem ?//pem格式
openssl pkcs12 -in test.p12 -clcerts -nokeys -out cert.crt ?//crt格式
如果需要攜帶秘鑰,則去掉 -nokeys
openssl pkcs12 -in test.p12 -clcerts? -out cert.pem? //pem格式
openssl pkcs12 -in test.p12 -clcerts? -out cert.crt? //crt格式
提取私鑰:
openssl pkcs12 -in test.p12 -nocerts -out key.pem
將證書、私鑰轉(zhuǎn)換為p12格式:
gmssl pkcs12 -export -clcerts -in client_cert.cer –inkey client.pem -out
?
一關(guān)于keytool的一些指令:
https://spdx4046.iteye.com/blog/1554577
openssl指令部分說(shuō)明:
https://zhuanlan.zhihu.com/p/26646377
openssl配置文件說(shuō)明:
https://www.cnblogs.com/f-ck-need-u/p/6091027.html
?
總結(jié)
- 上一篇: 【BZOJ】1013 球形空间产生器
- 下一篇: oracle分区