單點登錄系列之一 ---基礎知識

1.單點登錄
1.1.概述

  單點登錄(Single Sign On),簡稱爲 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。
1.2.技術實現機制

  當用戶第一次訪問應用系統1的時候,因爲還沒有登錄,會被引導到認證系統中進行登錄;根據用戶提供的登錄信息,認證系統進行身份效驗,如果通過效驗,應該返回給用戶一個認證的憑據--ticket;用戶再訪問別的應用的時候,就會將這個ticket帶上,作爲自己認證的憑據,應用系統接受到請求之後會把ticket送到認證系統進行效驗,檢查ticket的合法性。如果通過效驗,用戶就可以在不用再次登錄的情況下訪問應用系統2和應用系統3了。
1.3.要實現SSO需要以下主要的功能

  所有應用系統共享一個身份認證系統;
  所有應用系統能夠識別和提取ticket信息;
  應用系統能夠識別已經登錄過的用戶,能自動判斷當前用戶是否登錄過,從而完成單點登錄的功能。
其中,統一的身份認證系統最重要,認證系統的主要功能是將用戶的登錄信息和用戶信息庫相比較,對用戶進行登錄認證;認證成功後,認證系統應該生成統一的認證標誌(ticket),返還給用戶。另外,認證系統還應該對ticket進行效驗,判斷其有效性。整個系統可以存在兩個以上的認證服務器,這些服務器甚至可以是不同的產品。認證服務器之間要通過標準的通訊協議,互相交換認證信息,就能完成更高級別的單點登錄。


2.數字簽名
2.1.概念

  數字簽名(又稱公鑰數字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用於鑑別數字信息的方法。一套數字簽名通常定義兩種互補的運算,一個用於簽名,另一個用於驗證。
2.2.主要功能
  保證信息傳輸的完整性、發送者的身份認證、防止交易中的抵賴發生。
  數字簽名技術是將摘要信息用發送者的私鑰加密,與原文一起傳送給接收者。接收者只有用發送的公鑰才能解密被加密的摘要信息,然後用HASH函數對收到的原文產生一個摘要信息,與解密的摘要信息對比。如果相同,則說明收到的信息是完整的,在傳輸過程 中沒有被修改,否則說明信息被修改過,因此數字簽名能夠驗證信息的完整性。
  數字簽名是個加密的過程,數字簽名驗證是個解密的過程。
2.3.數字簽名的流程


3.數字證書
3.1.概念

  數字證書就是互聯網通訊中標誌通訊各方身份信息的一系列數據,提供了一種在Internet上驗證您身份的方式,其作用類似於司機的駕駛執照或日常生活中的身份證。它是由一個由權威機構---CA機構,又稱爲證書授權(Certificate Authority)中心發行的,人們可以在網上用它來識別對方的身份。數字證書是一個經證書授權中心數字簽名的包含公開密鑰擁有者信息以及公開密鑰的文件。最簡單的證書包含一個公開密鑰、名稱以及證書授權中心的數字簽名。
3.2.頒發過程
  數字證書頒發過程一般爲:用戶首先產生自己的密鑰對,並將公共密鑰及部分個人身份信息傳送給認證中心。 認證中心在覈實身份後,將執行一些必要的步驟,以確信請求確實由用戶發送而來,然後,認證中心將發給用戶一個數字證書,該證書內包含用戶的個人信息和他的公鑰信息,同時還附有認證中心的簽名信息。用戶就可以使用自己的數字證書進行相關的各種活動。數字證書由獨立的證書發行機構發佈。數字證書各不相同,每種證書可提供不同級別的可信度。可以從證書發行機構獲得您自己的數字證書。
3.3.證書格式
  目前數字證書的格式普遍採用的是X.509 V3國際標準,內容包括證書序列號、證書持有者名稱、證書頒發者名稱、證書有效期、公鑰、證書頒發者的數字簽名等。
  數字證書主要由以下兩部分組成
  1、證書數據,包括以下內容
  * 版本信息,用來與X.509的將來版本兼容;
  * 證書序列號,每一個由CA發行的證書必須有一個惟一的序列號;
  * CA所使用的簽名算法;
  * 發行證書CA的名稱;
  * 證書的有效期限;
  * 證書主題名稱;
  * 被證明的公鑰信息,包括公鑰算法、公鑰的位字符串表示;
  * 包含額外信息的特別擴展。
  2、發行證書的CA的數字簽名

4.CA認證中心
4.1.概念

  CA中心又稱CA機構,即證書授權中心(Certificate Authority ),或稱證書授權機構,作爲電子商務交易中受信任的第三方,承擔公鑰體系中公鑰的合法性檢驗的責任。CA中心爲每個使用公開密鑰的用戶發放一個數字證書,數字證書的作用是證明證書中列出的用戶合法擁有證書中列出的公開密鑰。CA機構的數字簽名使得攻擊者不能僞造和篡改證書。在SET交易中,CA不僅對持卡人、商戶發放證書,還要對獲款的銀行、網關發放證書。它負責產生、分配並管理所有參與網上交易的個體所需的數字證書,因此是安全電子交易的核心環節。
4.2.根證書
  根證書是CA認證中心給自己頒發的證書,是信任鏈的起始點。安裝根證書意味着對這個CA認證中心的信任。
  從技術上講,證書其實包含三部分,用戶的信息,用戶的公鑰,還有CA中心對該證書裏面的信息的簽名,要驗證一份證書的真僞(即驗證CA中心對該證書信息的簽名是否有效),需要用CA 中心的公鑰驗證,而CA中心的公鑰存在於對這份證書進行簽名的證書內,故需要下載該證書,但使用該證書驗證又需先驗證該證書本身的真僞,故又要用簽發該證書的證書來驗證,這樣一來就構成一條證書鏈的關係,這條證書鏈在哪裏終結呢?答案就是根證書,根證書是一份特殊的證書,它的簽發者是它本身,下載根證書就表明您對該根證書以下所簽發的證書都表示信任,而技術上則是建立起一個驗證證書信息的鏈條,證書的驗證追溯至根證書即爲結束。所以說用戶在使用自己的數字證書之前必須先下載根證書。

5.HTTPS
5.1.概念

  HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。它是一個URI scheme(抽象標識符體系),句法類同http:體系。用於安全的HTTP數據傳輸。https:URL表明它使用了HTTP,但HTTPS存在不同於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。這個系統的最初研發由網景公司進行,提供了身份驗證與加密通訊方法,現在它被廣泛用於萬維網上安全敏感的通訊,例如交易支付方面。
  它的主要作用可以分爲兩種:一種是建立一個信息安全通道,來保證數據傳輸的安全;另一種就是確認網站的真實性。
5.2.HTTPS和HTTP的區別
1、https協議需要到ca申請證書,一般免費證書很少,需要交費。
2、http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443。
4、http的連接很簡單,是無狀態的,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議 要比http協議安全。
5.3.HTTPS解決的問題
1、信任主機的問題.
2、通訊過程中的數據的泄密和被竄改

6.SSL
6.1.概念

  SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是爲網絡通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網絡連接進行加密。
爲Netscape所研發,用以保障在Internet上數據傳輸之安全,利用數據加密(Encryption)技術,可確保數據在網絡上之傳輸過程中不會被截取及竊 聽。
  當前版本爲3.0。它已被廣泛地用於Web瀏覽器與服務器之間的身份認證和加密數據傳輸。
  SSL協議位於TCP/IP協議與各種應用層協議之間,爲數據通訊提供安全支持。SSL協議可 分爲兩層: SSL記錄協議(SSL Record Protocol):它建立在可靠的傳輸協議(如TCP)之上,爲高層協議提供數據封裝、壓縮、加密等基本功能的支持。 SSL握手協議(SSL Handshake Protocol):它建立在SSL記錄協議之上,用於在實際的數據傳輸開始前,通訊雙方進行身份認證、協商加密算法、交換加密密鑰等。
6.2.SSL協議提供的服務主要有
  1)認證用戶和服務器,確保數據發送到正確的客戶機和服務器;
  2)加密數據以防止數據中途被竊取;
  3)維護數據的完整性,確保數據在傳輸過程中不被改變。
6.3.SSL協議的工作流程
  服務器認證階段:1)客戶端向服務器發送一個開始信息“Hello”以便開始一個新的會話連接;2)服務器根據客戶的信息確定是否需要生成新的主密鑰,如需要則服務器在響應客戶的“Hello”信息時將包含生成主密鑰所需的信息;3)客戶根據收到的服務器響應信息,產生一個主密鑰,並用服務器的公開密鑰加密後傳給服務器;4)服務器恢復該主密鑰,並返回給客戶一個用主密鑰認證的信息,以此讓客戶認證服務器。
用戶認證階段:在此之前,服務器已經通過了客戶認證,這一階段主要完成對客戶的認證。經認證的服務器發送一個提問給客戶,客戶則返回(數字)簽名後的提問和其公開密鑰,從而向服務器提供認證。
  從SSL 協議所提供的服務及其工作流程可以看出,SSL協議運行的基礎是商家對消費者信息保密的承諾,這就有利於商家而不利於消費者。

7.PKI
7.1.概念

  PKI(Public Key Infrastructure)即“公鑰基礎設施”,是一種遵循既定標準的密鑰管理平臺,它能夠爲所有網絡應用提供加密和數字簽名等密碼服務及所必需的密鑰和證書管理體系,簡單來說,PKI就是利用公鑰理論和技術建立的提供安全服務的基礎設施。當然,沒有好的非對稱算法和好的密鑰管理就不可能提供完善的安全服務,也就不能叫做PKI。也就是說,該定義中已經隱含了必須具有的密鑰管理功能。PKI技術是信息安全技術的核心,也是電子商務的關鍵和基礎技術。
PKI的基礎技術包括加密、數字簽名、數據完整性機制、數字信封、雙重數字簽名等。
它由公開密鑰密碼技術、數字證書、證書發放機構(CA)和關於公開密鑰的安全策略等基本成分共同組成的。PKI 是利用公鑰技術實現電子商務安全的一種體系,是一種基礎設施,網絡通訊、網上交易是利用它來保證安全的。

8.密碼體制
  密碼體制分爲私用密鑰加密技術(對稱加密)和公開密鑰加密技術(非對稱加密)。
8.1.對稱加密算法(對稱密鑰)
  對稱密鑰加密又叫專用密鑰加密,即發送和接收數據的雙方必使用相同的密鑰對明文進行加密和解密運算。對稱密鑰加密算法主要包括:DES、3DES、IDEA、FEAL、BLOWFISH等。
8.2.非對稱加密算法(公開密鑰加密、公鑰加密)
  非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應 的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。因爲加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱 加密算法。 非對稱加密算法實現機密信息交換的基本過程是:甲方生成一對密鑰並將其中的一把作爲公用密鑰向其它方公開;得到該公用密鑰的乙方使用該密鑰對機密信息進行 加密後再發送給甲方;甲方再用自己保存的另一把專用密鑰對加密後的信息進行解密。
算法:RSA、Elgamal、揹包算法、Rabin、HD,ECC(橢圓曲線加密算法)。使用最廣泛的是RSA算法,Elgamal是另一種常用的非對稱加密算法。

9.X.509
9.1.簡介

  數字證書的格式遵循X.509標準。X.509是由國際電信聯盟(ITU-T)制定的數字證書標準。
  X.509被廣泛使用的數字證書標準,是由國際電聯電信委員會(ITU-T)爲單點登錄(SSO-Single Sing-on)和授權管理基礎設施(PMI-Privilege Management Infrastructure)制定的PKI標準。X.509定義了(但不僅限於)公鑰證書、證書吊銷清單、屬性證書和證書路徑驗證算法等證書標準。
9.2.證書擴展文件名
  .cer, .crt - 通常被用於二進制的DER文件格式 (同於.der), 不過也被用於Base64編碼的文件 (例如 .pem).
  .P7B - 同於 .p7c
  .P7C - PKCS#7證書格式,僅僅包含證書和CRL列表信息,沒有私鑰。
  .PFX - 同於 .p12
  .P12 - PKCS#12文件, 包含證書(公鑰)和私鑰(受密碼保護),已經完整的證書鏈信。
  PKCS#7 是一種將數據加密和簽名(正式名稱是“enveloping”)的技術標準。 它描述數字證書的語法和其他加密消息——尤其是,數據加密和數字簽名的方法,也包含了算法。但PKCS#7不包含私鑰信息。
  PKCS#12 定義了一個用於保存私鑰和對應公鑰證書的文件格式,並由對稱密鑰加密保護。PKCS#12通常採用PFX,P12作爲文件擴展名。 PKCS#12文件可以存放多個證書,並由密碼保護,通常用於WINDOWS IIS,也能夠被當作Java Keysotre文件使用,用於Tomcat,Resign,Weblogic,Jboss等,不能被用於Apache。

10.證書管理工具
10.1.keytool工具

  keytool是Java中的密鑰和數字證書管理工具。它使用戶能夠管理自己的公鑰/私鑰對及相關證書,用於(通過數字簽名)自我認證(用戶向別的用戶/服務認證自己)或數據完整性以及認證服務。它還允許用戶儲存他們的通信對等者的公鑰(以證書形式)。
  keytool將密鑰和證書儲存在一個所謂的密鑰倉庫中。缺省的密鑰倉庫實現將密鑰倉庫實現爲一個文件。它用口令來保護私鑰。

  keytool用於數字證書的申請、導入、導出和撤銷等操作。

參考資料

java keytool 使用總結:http://yushan.iteye.com/blog/434955

// 刪除
keytool -delete -alias tomcatsso -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
keytool -delete -alias tomcatsso -storepass changeit

// 刪除
keytool -delete -alias root -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

// 生成私鑰
keytool -genkey -keyalg RSA -alias root -dname "cn=mycas.cn" -storepass changeit -keystore root.keystore

// 導出證書
keytool -export -alias root -file root.crt -storepass changeit -keystore root.keystore

// 導入證書
keytool -import -alias root -file root.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

// 查看
keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit


更多參數,請在命令行下執行:keytool -help


10.2.openssl工具
  OpenSSL(http://www.openssl.org/)是一個開放源代碼軟件包,由Eric A. Young 和Tim J.Hudson等人編寫,實現了SSL及相關加密技術,是最常用的證書管理工具。OpenSSL功能遠勝於KeyTool,可用於根證書、服務器證書和客戶證書的管理。

10.2.1.openssl使用說明(Windows32,筆者下載使用:Win32OpenSSL_Light-1_0_0a.exe)

1. 環境變量
設置系統變量OpenSSL_Home,並將其指向OpenSSL的安裝目錄(C:\OpenSSL)。
OpenSSL_Home=C:\OpenSSL

同時,將其執行目錄(%OpenSSL_Home%\bin;)加入系統變量Path中。
Path=%OpenSSL_Home%/bin;%MAVEN_HOME%/bin;%FLEX_HOME%/bin

2. 工作目錄
打開OpenSSL配置文件openssl.cfg(%OpenSSL_Home%\bin\openssl.cfg),找到配置[CA_default]
注意變量dir,它指向的是CA工作目錄,本文將路徑D:/ca作爲CA工作目錄,對變量dir做相應修改。對於其他變量,我們無需修改。

建立CA工作目錄後,我們需要構建一些子目錄,用於存放證書、密鑰等。
1)構建CA子目錄
echo 構建已發行證書存放目錄certs
mkdir certs
echo 構建新證書存放目錄newcerts
mkdir newcerts
echo 構建私鑰存放目錄private
mkdir private
echo 構建證書吊銷列表存放目錄crl
mkdir crl

2)構建相關文件
echo 構建索引文件index.txt
echo 0>index.txt
echo 構建序列號文件serial
echo 01>serial


3. 構建根證書
// 在構建根證書前,需要構建隨機數文件(.rand)
openssl rand -out private/.rand 1000

// 構建根證書私鑰(ca.key.pem),這時我們需要輸入根證書密碼“123456”
openssl genrsa -aes256 -out private/ca.key.pem 2048

// 生成根證書籤發申請文件(ca.csr),這時我們需要輸入根證書密碼“123456”
openssl req -new -key private/ca.key.pem -out private/ca.csr -subj "/C=CN/ST=BJ/L=BJ/O=zlex/OU=zlex/CN=*.zlex.org"

// 得到根證書籤發申請文件後,我們可以將其發送給CA機構簽發。當然,我們也可以自行簽發根證書。
// 簽發根證書,這時我們需要輸入根證書密碼“123456”
openssl x509 -req -days 10000 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certs/ca.cer

// OpenSSL產生的數字證書不能在Java語言環境中直接使用,需要將其轉化爲PKCS#12編碼格式。
// 根證書轉換,這時我們需要輸入根證書密碼“123456”
openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certs/ca.cer -out certs/ca.p12

// 個人信息交換文件(PKCS#12)可以作爲密鑰庫或信任庫使用,我們可以通過KeyTool查看該密鑰庫的詳細信息。
keytool -list -keystore certs/ca.p12 -storetype pkcs12 -v -storepass 123456


4. 構建服務器證書
// 服務器證書的構建與根證書構建相似,首先需要構建服務器私鑰,這時我們需要輸入服務器證書密碼“123456”
openssl genrsa -aes256 -out private/server.key.pem 2048

// 完成服務器證書密鑰構建後,我們需要產生服務器證書籤發申請,這時我們需要輸入服務器證書密碼“123456”
openssl req -new -key private/server.key.pem -out private/server.csr -subj "/C=CN/ST=BJ/L=BJ/O=zlex/OU=zlex/CN=www.zlex.org"

// 我們已經獲得了根證書,可以使用根證書籤發服務器證書
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out certs/server.cer

// 將OpenSSL產生的數字證書轉化爲PKCS#12編碼格式,這時我們需要輸入服務器證書密碼“123456”
openssl pkcs12 -export -clcerts -inkey private/server.key.pem -in certs/server.cer -out certs/server.p12

現在,我們已經構建了服務器證書(server.cer),並可使用該證書構建基於單向認證的網絡交互平臺。


5. 構建客戶證書
// 客戶證書的構建與服務器證書構建基本一致,首先需要構建私鑰
// 產生客戶私鑰,這時我們需要輸入客戶證書密碼“123456”
openssl genrsa -aes256 -out private/client.key.pem 2048

// 生成客戶證書籤發申請,這時我們需要輸入客戶證書密碼“123456”
openssl req -new -key private/client.key.pem -out private/client.csr -subj "/C=CN/ST=BJ/L=BJ/O=zlex/OU=zlex/CN=zlex"

// 簽發客戶證書。如果在第2點配置有問題,有可能報錯: I am unable to access the ./demoCA/newcerts directory ./demoCA/newcerts: No such file or directory
openssl ca -days 3650 -in private/client.csr -out certs/client.cer -cert certs/ca.cer -keyfile private/ca.key.pem

// 客戶證書轉換
openssl pkcs12 -export -inkey private/client.key.pem -in certs/client.cer -out certs/client.p12

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章