隨筆-9  評論-168  文章-266  trackbacks-0

          X.509完結

          參考文檔:  終極武器—數字證書 http://book.51cto.com/art/201004/192437.htm

                   用SSL進行雙向身份驗證意思就是在客戶機連接服務器時,鏈接雙方都要對彼此的數字證書進行驗證,保證這
          是經過授權的才能夠連接(我們鏈接一般的SSL時采用的是單向驗證,客戶機只驗證服務器的證書,服務器不驗證客戶
          機的證書。而連接網上銀行時使用的U盾就是用來存儲進行雙向驗證所需要的客戶端證書的)。

          注: 證書更改操作(導入,刪除等),都必需重啟WEB應用.否則證書庫的緩存無法清除.一般客戶端的證書不需吊銷,也沒意義,直接讓其無法登陸就行.
          spring security3 的X.509配置在雙向認證中,可直接登錄,即網銀中使用U盾就可以不用輸入用戶名和密碼直接登錄系統.
          <http>
              <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" requires-channel="https"/>
              <intercept-url pattern="/**" access="ROLE_USER"  requires-channel="https"/>
              <x509 subject-principal-regex="CN=(.*?)," user-service-ref="userService"/>
          </http>

          <user-service id="userService">
              <user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" />
              <user name="user" password="user" authorities="ROLE_USER" />
          </user-service>

           

          獲得安全證書有兩種方式:
          (1)一種方式是到權威機構CA購買
          要獲得數字證書,我們需要使用數字證書管理工具(如KeyTool和OpenSSL)構建CSR(Certificate Signing Request,數字證書簽發申請),交由CA機構簽發,

          形成最終的數字證書。
          (2)還有一種方式是創建自我簽名的證書

          keystore:keystore擴展名的文件(即JKS類型)中一般保存的是我們的私鑰,用來加解密或者為別人做簽名
          truestore:保存的是一些可信任的證書,主要是訪問某個https的時候對訪問者進行認證,以確保其可信任。
          truststore:雙向認證中是必須的,如果沒有顯式的指定,默認指定為$JAVA_HOME/lib/security/cacerts 這個文件。
          雙向SSL認證,服務器必須要信任客戶端證書,因此,必須把客戶端證書添加為服務器的信任認證中心,即$JAVA_HOME/lib/security/cacerts 這個文件
          1)KeyStore: 其中保存服務端的私鑰
          2)Trust KeyStore:其中保存客戶端的授權證書

           

          一.Keytool是一個Java數據證書的管理工具。
          1.keystore 文件
          Keytool是一個證書庫文件,可將N個密鑰(key)和證書(certificates)存在一個稱為keystore的文件中,也即N個條目的意思.
           在keystore里,包含兩種對應的數據:
          (1)密鑰實體(Key entity): 密鑰(secret key)又或者是私鑰和配對公鑰(采用非對稱加密)
          (2)可信任的證書實體(trusted certificate entries): 也可稱為公鑰.

          2.參數說明
          參數說明:
          -genkey  創建證書庫.
          -import      將已簽名數字證書導入密鑰庫  keytool -import -alias sage -keystore sagely -file sagely.crt
                       導入已簽名數字證書用keytool -list -v 以后可以明顯發現多了認證鏈長度,并且把整個CA鏈全部打印出來。
          -delete 刪除指定別名的條目(密鑰及證書)
          -trustcacerts 表示將數字證書導入信任庫。
          -alias 密鑰別名(任意不重復).證書實體關聯著密鑰實體,可通過別名刪除整個條目(證書).
          -dname 表示密鑰的Distinguished Names,
                  CN=commonName  即對于服端證書時為網站域名,客戶端則任意.通常使用域名或帶有通配符“*”的泛域名,如“*.zlex.org”標識用戶身份。
                  OU=organizationUnit
                  O=organizationName
                  L=localityName
                  S=stateName
                  C=country
          Distinguished Names表明了密鑰的發行者身份
          -keyalg   指定密鑰的加密算法,支持RSA(通常)和DSA共2種算法,默認算法為DSA。
          -keypass 密鑰的密碼

          -keystore 指定keystore文件及路徑(產生的信息存在.keystore文件中)
          如果不設置,則默認在操作系統的當前用戶(如ALGZ)目錄下生成名為“.keystore”的文件,還會產生一個mykey的密鑰別名,mykey中包含用戶的公鑰、私鑰和證書。
          在Wnidows下,文件的位置為:C:\Documents and Settings\ALGZ\.keystore
          在Linux下,該文件的位置為:home\ALGZ\.keystore

          -storepass 訪問keystore(密鑰庫)的密碼,這個密碼提供系統從mykeystore文件中將信息取出
          -validity 該密鑰的有效期,以天為單位

          -keysize     指定密鑰長度,以位為單位.
          -file        參數指定導出證書的文件名.
          -sigalg 指定數字簽名算法,這里指定為SHA1withRSA算法,通常不用設置。
          -rfc 指定以Base64編碼格式輸出,通常不設置。


          3.使用步驟:
          (1)生成證書庫
          生成密鑰,并以證書庫文件方式保存
           keytool -genkey -alias bogus -keysize 512 -validity 3650 -keyalg RSA -dname "CN=bogus.com, OU=XXX CA, O=Bogus Inc, L=Stockholm, S=Stockholm,

          C=SE" -keypass boguspw -storepass boguspw -keystore sean.cert

          2.導出證書
          從證書庫中(-keystore)將指定別名的證書導出為證書文件(-file)
          例如:keytool -export -keystore monitor.keystore -alias monitor -file monitor.cer
          將把證書庫 monitor.keystore 中的別名為 monitor 的證書導出到 monitor.cer 證書文件中.它包含證書主體的信息及證書的公鑰,不包括私鑰,可以公開。
          keytool -export -keystore d2aApplet.keystore -alias RapaServer -file Rapa.cert -storetype IAIKKeystore

          3.導入證書
          將指定別名的證書(-file)中導入到keystore證書庫(-keystore)中
          這里向Java默認的證書 cacerts導入Rapa.cert
          keytool -import -alias RapaServer -keystore cacerts -file Rapa.cert
          通常該命令用以導入來自CA中心的證書(Importing a Certificate for the CA)

          4.刪除證書庫中的條目(即密鑰實體與證書實體)
          keytool -delete -alias RapaServer -keystore d2aApplet.keystore ,這條命令將 d2aApplet.keystore 中的 RapaServer 這一條證書刪除了。

          5.證書條目口令的修改
          使用 -keypasswd 參數,如:keytool -keypasswd -alias RapaServer -keystore d2aApplet.keystore,可以以交互的方式修改 d2aApplet.keystore證書庫中的條目

          為 RapaServer 的證書。
          Keytool -keypasswd -alias RapaServer -keypass 654321 -new 123456 -storepass 888888 -keystore d2aApplet.keystore這一行命令以非交互式的方式修改庫

          中別名為 RapaServer 的證書的密碼為新密碼 654321,行中的 123456 是指該條證書的原密碼, 888888 是指證書庫的密碼。

          6. 導出證書到新的TrustStore(信任的證書庫)
           keytool -import -alias 別名 -file 文件名 -keystore truststore

          7.    查看Keystore文件內容
          進入JDK安裝目錄下的bin目錄,運行keytool命令。
          keytool -list -keystore C:\keystore.jks -storepass password

           -v              顯示密鑰庫中的證書詳細信息

          ***********************************************

          cacerts證書文件(The cacerts Certificates File)
          證書文件存在于java.home\lib\security目錄下,是Java系統的CA證書倉庫

          CA證書的導入(Importing Certificates)
          命令:
          引用
          keytool -import -alias joe -file jcertfile.cer

          這個命令將證書文件jcertfile.cer中別名為joe的證書導入系統的受信任證書列表中
          通常該命令用以導入來自CA中心的證書(Importing a Certificate for the CA)

          導入被CA中心授權的證書(Importing the Certificate Reply from the CA)
          命令:
          引用
          keytool -import -trustcacerts -file VSMarkJ.cer

           

          證書的導出(Exporting Certificates)
          命令:
          引用
          keytool -export -alias jane -file janecertfile.cer

          這個命令將別名為jane的證書導出到證書文件jcertfile.cer中
          生成的證書可以交付客戶端用戶使用,用以進行SSL通訊,或者伴隨電子簽名的jar包進行發布者的身份認證。


          *************************************


          網上有許多教程,但沒有說明443與8443,http與https的區別,讓人試來試去總有不爽的地方。沒有說明怎樣測試,呵呵,我說明一下:


          Tomcat6配置HTTPS

          我使用的JDK版本為JDK6,使用的的Tomcat版本為6;配置Tomcat下的HTTPS其實很簡單,只需要完成兩步工作就可以 了;SSL認證分雙向認證和單向認證,如

          果為雙向認證則客戶端也需要安裝已生成好的文件。


          我把生成的“服務器證書文件”取名為server.jks。簡單起見,我把server.jks放在D盤根目錄下面,配置環境為windows.
          首先使用JDK自帶的工具keytool生成一個“服務器證書”,取名為server.jks。

          一.tomcat6配置雙向認證

          1、生成服務器端證書
          x:\>keytool -genkey -keyalg RSA -dname "cn=localhost,ou=sango,o=none,l=china,st=beijing,c=cn"
          -alias server -keypass password -keystore d:\server.jks -storepass password -validity 3650
          服務端的CN值必須為域名,不然客戶端認證時為非法.

          2、生成客戶端證書
          X:\>keytool -genkey -keyalg RSA -dname “cn=sango,ou=sango,o=none,l=china,st=beijing,c=cn”
          -alias custom -storetype PKCS12 -keypass password -keystore d:\custom.p12
          -storepass password -validity 3650  
          客戶端的CN可以是任意值。

          3、由于是雙向SSL認證,服務器必須要信任客戶端證書,因此,必須把客戶端證書添加為服務器的信任認證。由于不能直接將PKCS12格式的證書庫導入,我們

          (1)必須先把客戶端證書導出為一個單獨的CER文件,使用如下命令,先把客戶端證書導出為一個單獨的cer文件:
          X:\>keytool -export -alias custom -file d:\custom.cer -keystore  d:\custom.p12 -storepass password -storetype PKCS12 -rfc  
          (2)然后,添加客戶端證書到服務器中(將已簽名數字證書導入密鑰庫)
          X:\>keytool -import -v -alias custom -file d:\custom.cer -keystore  d:\server.jks -storepass password  

          4、查看證書詳細(-v)內容
          keytool -list -v -keystore d:\server.jks -storepass password  

          5、配置tomcat service.xml文件
          <Connector port=“8443″ protocol=“HTTP/1.1″ SSLEnabled=“true”  maxThreads=“150″ scheme=“https” secure=“true” 
          clientAuth=“true” sslProtocol=“TLS” 
          keystoreFile="D:/server.jks" keystorePass="password"
          truststoreFile="D:/server.jks" truststorePass="password"  /> 

          不設置truststoreFile,truststorePass屬性,即默認指向"%JAVA_HOME%/JRE/LIB/SECURITY/CACERTS"文件(JKS類型),則在雙向認證中,需把客戶端認證導入到此

          文件中.
          clientAuth=”true”表示雙向認證

          6、導入客戶端證書到瀏覽器
          雙向認證需要強制驗證客戶端證書。雙擊“custom.p12”即可將證書導入至IE

          二.tomcat6配置單向認證

          1、生成服務器端證書
          X:\>keytool -genkey -keyalg RSA -dname “cn=localhost,ou=sango,o=none,l=china,st=beijing,c=cn”
          -alias server -keypass password -keystore d:\server.jks -storepass password -validity 3650  

          2、由于是單向認證,沒有必要生成客戶端的證書,直接進入配置tomcat service.xml文件,Xml代碼
          <Connector port=”8443″ protocol=”HTTP/1.1″ SSLEnabled=”true”
          maxThreads=”150″ scheme=”https” secure=”true”
          clientAuth=”false” sslProtocol=”TLS”
          keystoreFile=”D:/server.jks” keystorePass=”password”/>

          clientAuth=”false”表示單向認證,同時去掉服務端的可信任認證,即:truststoreFile=”D:/server.jks” truststorePass=”password”這2個屬性 .

          測試說明:

          1.請注意本機測試的網址是:https://localhost:8443

          2.如果將tomcat的 server.xml 的8443 更改為 443,注意本機的443是否開啟。

          3.如果你的tomcat 使用了http://localhost:8080,測試網址也是https://localhost:8443

          其它:當使用https訪問某一域名時,瀏覽器默認訪問服務器的443端口。內部處理后,再轉向80處理。所以ssl 全稱Security Socket Layer, 加密套接字協議層 名

          字沒有改錯,只是一個加密層

          posted on 2011-03-03 16:19 紫蝶∏飛揚↗ 閱讀(4879) 評論(0)  編輯  收藏 所屬分類: Spring Security

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(5)

          隨筆檔案(9)

          文章分類(339)

          文章檔案(265)

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 鄂伦春自治旗| 镇原县| 财经| 沂水县| 平远县| 云安县| 高安市| 黄平县| 武义县| 米泉市| 本溪市| 蓬莱市| 资源县| 宜春市| 浠水县| 阳西县| 龙山县| 石台县| 翁牛特旗| 乌拉特后旗| 连云港市| 湾仔区| 华蓥市| 怀化市| 城步| 威远县| 牙克石市| 板桥市| 闵行区| 翁源县| 四子王旗| 神农架林区| 馆陶县| 新宁县| 渭源县| 汾西县| 瓦房店市| 兰西县| 海伦市| 讷河市| 嘉定区|