CA双向认证
一、雙向認證
CA認證有單向認證和雙向認證,在我們日常網頁瀏覽中,我們接觸到的大多數是單向認證,而在一些銀行系統等對安全性要求比較高的系統,會采用雙向認證。
單向認證只是客戶端(瀏覽器)認證服務端(例如tomcat等), 雙向認證指的是服務端和客戶端之間相互都要認證(在瀏覽器體現為需要安裝進證書)。
https的雙向認證大概過程(摘自http://blog.chinaunix.net/uid-26335251-id-3508651.html):
1 瀏覽器發送一個連接請求給安全服務器。
2 服務器將自己的證書,以及同證書相關的信息發送給客戶瀏覽器。
3 瀏覽器檢查服務器送過來的證書是否是由自己信賴的 CA 中心所簽發的。如果是,就繼續執行協議;如果不是,客戶瀏覽器就給客戶一個警告消息:警告客戶這個證書不是可以信賴的,詢問客戶是否需要繼續。
4 接著客戶瀏覽器比較證書里的消息,與服務器剛剛發送的相關消息是否一致,如果是一致的,客戶瀏覽器認可這個服務器的合法身份。
5 服務器要求客戶發送客戶自己的證書。收到后,服務器驗證客戶的證書,如果沒有通過驗證,拒絕連接;如果通過驗證,服務器獲得用戶的公鑰。
6 客戶瀏覽器告訴服務器自己所能夠支持的通訊對稱密碼方案。
7 服務器從客戶發送過來的密碼方案中,選擇一種加密程度最高的密碼方案,用客戶的公鑰加過密后通知瀏覽器。
8 瀏覽器針對這個密碼方案,選擇一個通話密鑰,接著用服務器的公鑰加過密后發送給服務器。
9 服務器接收到瀏覽器送過來的消息,用自己的私鑰解密,獲得通話密鑰。
10 服務器、瀏覽器接下來的通訊都是用對稱密碼方案,對稱密鑰是加過密的。
二、搭建CA證書頒發中心
1 創建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 生成證書請求
?? openssl req -new -days 3650 -key ./rsaCA/private/cakey.pem -out careq.pem -config ./rsaCA/openssl.cnf
?
4 根據CA私鑰生成CA的自簽名證書
openssl ca -selfsign -in careq.pem -out ./rsaCA/cacert.pem -extensions v3_ca -config ./rsaCA/openssl.cnf
?
三、生成客戶端證書
1 客戶端私鑰生成證書簽名請求( cacsr.cer為請求證書,client_crt.cer為簽名證書)
??? 生成RSA私鑰
openssl genrsa -out client.pem 2048
??? 生成證書請求
?? openssl req -new -days 3650 -key client.pem ?-out client_csr.pem ?-config ./rsaCA/openssl.cnf
2.使用CA的私鑰和證書對用戶證書簽名(openssl.cnf為gmssl/ssl目錄下的配置文件)
openssl ca -in client_csr.pem ?-out client_cert.cer ?-extensions v3_ca -config ./rsaCA/openssl.cnf
?
四、生成服務端證書(這里使用的是tomcat)
1 生成服務器證書
使用keytool為Tomcat生成證書,假定目標機器的域名是localhost或者“192.168.1.1”,keystore文件為tomcat.keystore,口令為“logiscn”,使用如下命令生成:
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機構自簽名證書導入tomcat中
keytool -import -alias ca -v -file ./rsaCA/cacert.pem -keystore /root/rsa/tomcat.keystore -storepass logiscn
3 將客戶端證書導入tomcat中
keytool -import -alias tianli -v -file /root/CA/test/client_crt.cer -keystoretomcat.keystore -storepass logiscn
4?配置Tomcat服務器
打開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指定是否需要驗證客戶端證書,如果該設置為“false”,則為單向SSL驗證,SSL配置可到此結束。如果clientAuth設置為“true”,表示強制雙向SSL驗證,必須驗證客戶端證書。如果clientAuth設置為“want”,則表示可以驗證客戶端證書,但如果客戶端沒有有效證書,也不強制驗證。
5 重啟tomcat
?
五、實現類似銀行U盾的操作
以前用過網銀的朋友們可能知道,在我們登錄網銀的時候是需要插入一個U盾的,其實他也是一個雙向認證的原理。在這里,我們可以借助第三方工具u-key來實現。
可以購買市面上現成的u-key,將上述做成的客戶端證書導入u-key中,在設置u-key的密碼,這樣就可以實現客戶想要訪問服務器,必須擁有u-key以及登錄密碼才可訪問的功能了。
?
附:
openssl一些用法
顯示證書信息。
cacert.pem為已加簽后的證書文件
opensslx509 -text -noout -in cacert.pem
顯示申請加簽的證書信息
cacsr.pem為申請加簽的文件
openssl req -in cacsr.pem -noout -text
顯示公私鑰信息
cakey.pem為私鑰文件
openssl pkey -pubout -in cakey.pem -noout-text
由私鑰文件導致公鑰命令
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
將證書、私鑰轉換為p12格式:
gmssl pkcs12 -export -clcerts -in client_cert.cer –inkey client.pem -out
?
一關于keytool的一些指令:
https://spdx4046.iteye.com/blog/1554577
openssl指令部分說明:
https://zhuanlan.zhihu.com/p/26646377
openssl配置文件說明:
https://www.cnblogs.com/f-ck-need-u/p/6091027.html
?
總結
- 上一篇: 【BZOJ】1013 球形空间产生器
- 下一篇: oracle分区