第一部分,先說證書的申請。java
這步是要到正規的CA公司申請正式的設備證書必須走的步驟。apache
一、先生成證書的密鑰對瀏覽器
打開命令行,切換到某個本身新建的目錄下,執行以下命令tomcat
keytool -genkey -keyalg RSA -keysize 1024 -dname 「CN=www.javastar.org,OU=翊天閣,O=翊天閣,L=南京市,ST=江蘇省,C=CN」 -alias server -keypass 123456 -keystore server.jks -storepass 123456 -validity 365服務器
這裏說明一下幾個重要的地方,CN=www.javastar.org,這裏的www.javastar.org必定要換成你實際要部署的站點的域名,若是是在內網,就要用服務器的hostname,必定不能夠用IP,不然,是沒法創建SSL連接的。spa
OU=翊天閣,O=翊天閣,這裏能夠替換成你本身的組織名稱,或者公司名稱。.net
-validity 365這裏聲明證書有效期爲1年。命令行
其餘的參數本身能夠參考keytool的使用幫助或相關文檔。server
好了,成功執行上面的命令後,咱們在當前命令行所在目錄獲得server.jks文件,這個就是包含密鑰對的基本證書信息庫文件。xml
二、導出證書請求文件
keytool -certreq -alias server -sigalg 「SHA1withRSA」 -file server.pem -keypass 123456 -keystore server.jks -storepass 123456
這裏能夠獲得一個server.pem的文件。
三、向CA公司申請簽發設備證書
將上一步獲得的server.pem證書發送給相關的CA公司,CA公司會經過這個申請簽發一張設備證書,最後咱們會獲得一個.cer的文件,好比server.cer。
同時,咱們要取得該CA公司的證書鏈,好比會有CA_ROOT.cer和CA_CA.cer,第一張爲CA公司的根證書,第二張爲CA公司的簽名證書。
四、將CA根證書導入服務器證書庫
keytool -import -alias CA_ROOT -keystore server.jks -trustcacerts -storepass 123456 -file CA_ROOT.cer
五、將CA簽名證書導入服務器證書庫
keytool -import -alias CA_CA -keystore server.jks -trustcacerts -storepass 123456 -file CA_CA.cer
六、使用CA簽發的證書回覆咱們本身生成的包含私鑰的證書
keytool -import -alias server -keystore server.jks -trustcacerts -storepass 123456 -file server.cer
七、導出回覆成功後的服務器證書
keytool -export -alias server -storepass 123456 -file javastar.org.cer -keystore server.jks
好了,到這裏咱們須要的設備證書已經ok了。
最後對咱們實際有用的是兩個文件:server.jks,是服務器證書庫,存儲了含有私鑰的服務器證書,及其證書鏈,這個就是主要的設備證書了,是放在服務器的SSL配置裏面;還有一個是javastar.org.cer,這個是隻包含服務器證書公鑰的設備證書,是發給用戶,讓用戶放入本身的可信任庫的。
第二部分,配置Tomcat的SSL雙向連接
一、準備客戶端證書
keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore client.p12 -dname 「CN=Client,OU=javastar.org,L=nj,ST=js,C=cn」 -storepass 123456 -keypass 123456 -validity 365
執行完畢,咱們會獲得一張p12的客戶證書client.p12。
二、導出.cer格式的客戶證書
keytool -export -alias client -keystore client.p12 -storetype PKCS12 -storepass 123456 -rfc -file client.cer
執行完畢獲得client.cer證書。
三、將客戶端證書導入服務器的可信任證書庫
keytool -import -v -file client.cer -keystore servertrust.keystore -storepass 123456
執行完畢獲得servertrust.keystore,這個是給tomcat服務器端用的。
四、將服務器證書導入客戶端可信任證書庫
keytool -import -v -file javastar.org.cer -keystore clienttrust.keystore -storepass 123456
執行完畢會獲得clienttrust.keystore證書庫,留着備用。同時,也能夠一樣的方法,把CA_ROOT.cer和CA_CA.cer導入。
五、在和tomcat的bin目錄並行的目錄下新建一個cert文件夾,把server.jks和servertrust.keystore文件拷貝進去。
六、找到tomcat的server.xml文件,找到以下的內容
<!–
<Connector port=」8443″ protocol=」HTTP/1.1″ SSLEnabled=」true」
maxThreads=」150″ scheme=」https」 secure=」true」
clientAuth=」false」 sslProtocol=」TLS」 />
–>
去掉註釋,並修改成
<Connector port=」8443″ protocol=」HTTP/1.1″ SSLEnabled=」true」
maxThreads=」500″ scheme=」https」 secure=」true」
clientAuth=」true」 sslProtocol=」TLS」
keystoreFile=」D:/apache-tomcat-6.0.20/cert/server.jks」 keystorePass=」123456″
truststoreFile=」D:/apache-tomcat-6.0.20/cert/servertrust.keystore」 truststorePass=」123456″/>
這裏注意把D:/apache-tomcat-6.0.20/cert修改成你的tomcat實際的路徑。
七、啓動或者重啓tomcat,在瀏覽器中導入client.p12的證書,而後,在地址欄輸入https://www.javastar.org:8443,就會彈出證書選擇框,選擇證書後,就能夠使用SSL協議訪問tomcat服務器了。
第三部分,在程序中如何創建與服務器的SSL雙向認證連接
其實這個就簡單了,以java爲例,好比咱們如今要訪問一個經過SSL雙向認證保護的WebService接口,只須要在生成的客戶端程序中開始部分加入
System.setProperty(「javax.net.ssl.keyStore」, 「D:/client.p12″);
System.setProperty(「javax.net.ssl.keyStorePassword」, 「123456″);
System.setProperty(「javax.net.ssl.keyStoreType」, 「PKCS12″);
System.setProperty(「javax.net.ssl.trustStore」, 「D:/clienttrust.keystore」);
System.setProperty(「javax.net.ssl.trustStorePassword」, 「123456″);
System.setProperty(「javax.net.ssl.trustStoreType」, 「JKS」);
JVM會自動將證書提交給服務器驗證,因爲服務器證書也在咱們的可信任庫,也會自動信任服務器端的證書。
下面的代碼能夠在須要的時候清除以上的環境內容
System.clearProperty(「javax.net.ssl.keyStore」);
System.clearProperty(「javax.net.ssl.keyStorePassword」);
System.clearProperty(「javax.net.ssl.keyStoreType」);
System.clearProperty(「javax.net.ssl.trustStore」);
System.clearProperty(「javax.net.ssl.trustStorePassword」);
System.clearProperty(「javax.net.ssl.trustStoreType」);