什麼是安全證書,訪問者到底是怎麼校驗安全證書的,服務端返回安全證書後,客戶端再向誰驗證呢?

private static void trustAllHttpsCertificates() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[1];
TrustManager tm = new miTM();
trustAllCerts[0] = tm;
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
static class miTM implements TrustManager,X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(X509Certificate[] certs) {
return true;
}
public void checkServerTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
public void checkClientTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
}

上面的代碼信任所有證書有什麼作用?忽略所有的證書驗證?


謝邀。

最近在寫https代理的程序,使用openssl實現ssl連接,有涉及到ssl證書。

https的作用有三:1加密傳輸 2認證 3數據完整性

ssl證書的主要是用來做認證和加密。大多數證書基於 X.509 v3 證書標準。

下面以一次ssl連接進行說明。

比如客戶端要認證伺服器,伺服器怎麼證明自己是真實的伺服器,而不是釣魚網站呢?這需要伺服器有個證書。證書包含以下信息:

使用者的公鑰值。

使用者標識信息(如名稱和電子郵件地址)。

證書的有效時間。

頒發者CA標識信息。

頒發者CA的數字簽名。

你可以在IE中Internet選項》內容》證書 中看看證書長什麼樣。

有效的證書需要由權威機構CA簽名,CA會用自己的私鑰來生成數字簽名。這個權威機構CA客戶端是可以完全信任的,客戶端瀏覽器會安裝CA的根證書,由CA簽名的證書是被CA所信任的,這就構成了信任鏈,所以客戶端可以信任該伺服器的證書。

客戶端與伺服器建立ssl連接時,伺服器將自身的證書傳輸給客戶端,客戶端在驗證證書的時候,先看CA的根證書是否在自己的信任根證書列表中。再用CA的根證書提供的公鑰來驗證伺服器證書中的數字簽名,如果公鑰可以解開簽名,證明該證書確實被CA所信任。再看證書是否過期,訪問的網站域名與證書綁定的域名是否一致。這些都通過,說明證書可以信任。

接下來使用伺服器證書裡面的公鑰進行伺服器身份的驗證。 客戶端生成一個隨機數給到伺服器。 伺服器對隨機數進行簽名,並回傳給到客戶端。 客戶端用伺服器證書的公鑰對隨機數的簽名進行驗證,若驗證通過,則說明對應的伺服器確實擁有對應伺服器證書的私鑰,因此判斷伺服器的身份正常。否則,則任務伺服器身份被偽造。這些都沒問題才說明伺服器是可信的。

接下來客戶端會生成會話密鑰,使用伺服器公鑰加密。伺服器用自己的私鑰解密後,用會話密鑰加密數據進行傳輸。ssl連接就建立了。


PKI(Public Key Infrastructure,公共密鑰基礎設施)是通過使用公鑰密碼技術和數字證書來確保系統信息安全並負責驗證數字證書持有者身份的一種體系

PKI基本服務:

用戶提交個人信息和公鑰,申請證書;

核准用戶信息,簽發用戶公鑰證書;

查詢給定的證書的狀態(過期、撤銷、掛起、正常等);

PKI系統基本組件:

RA:註冊機構,接受來自用戶的證書請求,驗證用戶信息

CA:認證機構,使用自己的私鑰簽發用戶公鑰證書

CRL發布者:證書撤銷列表,被撤銷的證書的列表

CRL是一種離線證書狀態列表,如果有條件可以使用OCSP組件,在線查詢證書狀態

資料庫:存儲已經簽發過的證書及用戶信息的伺服器

訂戶:證書的持有實體

依賴方:依賴PKI提供服務的實體

PKI構成示意圖

訂戶公鑰證書由CA簽發,CA即「權威機構」

CA使用自己的私鑰對證書籤名,以證明訂戶身份與公鑰的綁定

依賴方使用CA的公鑰驗證證書上的CA簽名,即可確認綁定關係

問題1:我又怎麼知道CA的公鑰是不是真的是這個CA的?

解決方案:找另一個「權威機構」,簽發CA的證書,以證明CA公鑰與CA身份的綁定關係

問題2:那麼「另一個權威機構」的公鑰又由誰證明?

另另一個「權威機構」

總有一個最頂層的權威機構,是你不得不無條件信任的

無條件信任的CA,叫做信任錨,即信任的起點

由於信任「信任錨」,進而信任所有由它簽發的其它CA證書


安全證書就是合法網站通過認證生成協議,一般來說有一個安全證書認證中心,存放所有證書,我們的計算機一般都會預裝一些證書,以便連接時能夠通過安全中心認證。大致過程是首先和認證伺服器通信,進行協商密鑰,然後和另一台計算機通過密鑰建立安全連接。

完全憑記憶回答,還有很多錯誤不足,望大神批評指正。


推薦閱讀:

關於分散式的問題?
蘋果是如何知道用戶家在哪?
Intel CPU 的三角函數精度問題,會對現實生活產生什麼影響?
從數據結構角度,Golang和Swift對比,有何優缺點?
未來是屬於objc的還是visual studio的?

TAG:編程 | Java | 信息安全 | SSL |