做Web層面的安全測試,免不了要做中間人代理來截包分析。常用的工具有BurpSuit,Fiddler,Charles等等。關于這些工具的用法網上已經有很多介紹,這里就不贅述了。然而在測試一些安全性高的站點時,往往會遇到SSL通信的問題。這里對這些數字證書的問題進行一個小結,歡迎拍磚交流。
數字證書主要在互聯網上的用于身份驗證的用途。 安全站點在獲得CA(Certificate Authority)認證后,獲得一個數字證書,以此來標識其合法身份的真實性。
數字證書的格式遵循X.509標準。(X.509是由國際電信聯盟(ITU-T)制定的數字證書標準。它設定了一系列嚴格的CA分級體系來頒發數字證書。) 數字證書主要分為服務器證書和客戶端證書。服務器證書(SSL證書)用來進行身份驗證和通信的加密,客戶端證書主要用于身份驗證和電子簽名。下面對數字證書的組成結構和工作原理進行一個簡單的介紹。 最簡單的證書包含了:
1. 證書內容
a) 證書所有者的公鑰
b) 頒發者信息
c) 使用者信息
d) 等等
2. CA的數字簽名 (CA使用私鑰對證書內容的報文摘要進行加密后的結果)
3. 簽名算法
真實的數字證書主要結構如下圖:
其中證書內容字段的詳細結構如下:
CA的數字簽名是CA用其私鑰對證書信息的HASH值加密后的結果。由于使用私鑰加密以及非對稱加密算法的特性,數字簽名具有不可偽造的特點,同時報文摘要也保證了證書信息的完整性。用戶可以使用CA的公鑰對數字證書中CA的數字簽名進行解密來判斷該數字證書信息的真實性。 客戶端校驗服務器證書的大致流程如下: 1. 查看證書是否過期 2. CA是否可靠 3. CA的公鑰能否正確解開服務器證書的CA數字簽名,即證書的簽名值 4. 服務器證書上的域名是否和服務器的實際域名相匹配
其中CA的根證書大多是由操作系統預裝好并將它們設置為受信任的證書。所謂根證書就是未被簽名的公鑰證書或自簽名的證書,是CA給自己頒發的證書,包含了CA的公鑰等信息。安裝某個CA的根證書,就表示信任這個CA,它是證書信任鏈的開始。國際著名的CA有:verySign,Batltimore,Entrust等。 中國金融認證中心(China Financial Certification Authority,簡稱CFCA)是經中國人民銀行和國家信息安全管理機構批準成立的國家級權威安全認證機構,是國家重要的金融信息安全基礎設施之一。
Tips: 某些瀏覽器內置的CA證書列表 https://www.mozilla.org/en-US/about/governance/policies/security-group/certs/included/
常見的證書文件有以下格式:
格式 擴展名
DER .cer .crt .rsa
PKCS7 .p7b .p7r
CMS .p7c .p7m .p7s
PEM .pem (ASCII文件 一般使用base64編碼)
PKCS10 .p10 .csr (ASCII文件)
SPC .pvk .spc
常見的密鑰庫(keystore)文件格式如下:
格式 擴展名
JKS .jks .ks
JCEKS .jce
PKCS12 .p12
BKS .bks
UBER .ubr
BurpSuit和Fiddler等代理軟件可以用來攔截HTTPS流量。它們使用自帶的一個SSL證書與客戶端進行交互,充當中間人的角色去轉發數據包。由于這些代理軟件的證書是自簽名的根證書,而未經過知名CA機構認證,所以默認是不受信任,瀏覽器會進行警告阻攔。
使用桌面瀏覽器測試時,可以通過添加例外的方式信任它們的證書。在移動端測試時,也可以導出這些代理軟件的證書,再將其安裝到移動設備,方便對移動應用的HTTPS流量進行代理。
在瀏覽器證書管理器中導出BurpSuite證書:
Fiddler選項中可以直接導出證書:
直接安裝
代理軟件的數字證書可以安裝到手機系統中,方便對走HTTPS流量的APP進行安全測試。 安卓系統中的服務器證書安裝方法如下: 將數字證書拷貝到安卓的sdcard目錄下。在設置->安全->選擇從SDCARD安裝證書。
IOS中也是類似的操作。
導入到密鑰庫 除了直接安裝代理軟件證書之外,有的app會自帶受其信任的密鑰庫,如下: 在/asserts資源文件夾下,存在幾個bks密鑰庫文件。
可以使用工具打開bks密鑰庫,并將代理軟件的證書添加導入進去并保存。
當然,也可以使用keytool命令行進行證書導入。
Tips: Android系統中CA證書文件的位置在:/system/etc/security/cacerts.bks
http://blog.csdn.net/haijun286972766/article/details/6247675
修改檢測代碼 有的APP還會直接在代碼中進行對服務器證書進行校驗。
可以逆向app得到smali代碼,修改驗證邏輯,再重編譯打包,從而繞過對服務器證書的驗證。 具體案例可以看這篇博客:http://cih.so/?p=476
除了服務端證書外,有的網銀等高安全性的系統還會要求用戶提供客戶端證書進行身份驗證。如果用戶證書不正確,有的就直接無法連接服務端,有的會有如下提示:
客戶端證書主要用作身份驗證和電子簽名的作用。一般網銀包含私鑰的客戶端證書都被存儲在USBKEY中,存儲在USBKEY中包含私鑰的證書不能被導出和復制。可以使用USBKEY的證書管理工具安裝USBKEY中的證書,然后在瀏覽器中導出其公鑰證書,并在代理軟件中設置該客戶端證書。瀏覽器中的導出方法如下:
測試過程中,如果發現服務器會檢測用戶的客戶端證書,并且沒有設置客戶端證書,Fiddler會提示如下信息:
可以將導出的客戶端公鑰證書放到如上所示的目錄中。
BurpSuit也可以設置客戶端證書:
除了保存在USBKEY中的用戶證書(客戶端證書),CFCA也提供軟證書的下載,也就是包含私鑰的證書文件。在CFCA下載證書時,選擇Microsoft Enhanced Cryptographic Provider v1.0
將軟證書安裝到瀏覽器后,也可以通過同樣的方法導出公鑰證書。另外還可以導出包含私鑰的證書,導出時需要設置密碼。在Fiddler代理中設置客戶端的公鑰證書后,就可以直接進行代理了。
安卓app簽名的數字證書不需要權威機構來認證,是開發者自己產生的自簽名數字證書。數字證書都是有有效期的,Android只是在應用程序安裝的時候才會檢查證書的有效期。如果程序已經安裝在系統中,即使證書過期也不會影響程序的正常功能。
Android將數字證書用來標識應用程序的作者、在應用程序之間建立信任關系,而不是用來決定最終用戶可以安裝哪些應用程序。
由于惡意開發者可能通過使用相同的包名來混淆替換已經安裝的程序,簽名可以保證相當名字但是簽名不同的app不被替換。
另外,在申請一些特別權限的時候,需要驗證時會使用簽名。 Eclipse調試編譯app時,是使用debug證書對apk簽名的。安裝adt開發插件后的eclipse可以直接使用android tools圖形化界面對apk進行簽名。
簽名之后會多出一個META-INF文件夾
/CERT.RSA (包含證書信息)
/CERT.SF
/MANIFEST.MF
查看安卓簽名信息
keytool -printcert -file CERT.RSA