證書指紋演算法
Ⅰ TLS/SSL數字證書里的指紋演算法、簽名演算法和簽名哈希演算法各是做什麼用的
您好!
作用與目的相同都是為了進行加密,更好的保護平台,SSL安全哈希演算法,是數字簽名演算法標准,所以無論您在哪裡注冊無論多少價格的證書,其演算法基本上都是相同的!
申請SSL證書為考慮到瀏覽器兼容性,保持更多的瀏覽器可以訪問,通常採取加密演算法:RSA 2048 bits,簽名演算法:SHA256WithRSA,該演算法被公認使用,就是網路也使用該演算法!
RSA加密演算法:公鑰用於對數據進行加密,私鑰用於對數據進行解密。
RSA簽名演算法:在簽名演算法中,私鑰用於對數據進行簽名,公鑰用於對簽名進行驗證。
加密演算法分為兩大類:1、對稱加密演算法 2、非對稱加密演算法。
由於計算能力的飛速發展,從安全性角度考慮,很多加密原來SHA1WithRSA簽名演算法的基礎上,新增了支持SHA256WithRSA的簽名演算法。該演算法在摘要演算法上比SHA1WithRSA有更強的安全能力。目前SHA1WithRSA的簽名演算法會繼續提供支持,但為了您的應用安全,強烈建議使用SHA256WithRSA的簽名演算法。
Ⅱ java代碼怎麼獲取數字的證書那一串20位指紋
通過JAVA來讀取數字證書的方法獲取20位指紋:
CARead.java文件代碼:
public class CARead extends JPanel {
private String CA_Name;
private String CA_ItemData[][] = new String[9][2];
private String[] columnNames = { "證書欄位標記", "內容" };
public CARead(String CertName) {
CA_Name = CertName;
/* 三個Panel用來顯示證書內容 */
JTabbedPane tabbedPane = new JTabbedPane();
JPanel panelNormal = new JPanel();
tabbedPane.addTab("普通信息", panelNormal);
JPanel panelAll = new JPanel();
panelAll.setLayout(new BorderLayout());
tabbedPane.addTab("所有信息", panelAll);
JPanel panelBase64 = new JPanel();
panelBase64.setLayout(new BorderLayout());
tabbedPane.addTab("Base64編碼形式的信息", panelBase64);
/野姿* 讀取證書常規信息 */
Read_Normal(panelNormal);
/* 讀取證書文件字元串表示內容 */
Read_Bin(panelAll);
/* 以Base64編碼頌慶絕形式讀取證書文件的信息 */
Read_Raw(panelBase64);
tabbedPane.setSelectedIndex(0);
setLayout(new GridLayout(1, 1));
add(tabbedPane);
}
private int Read_Normal(JPanel panel) {
String Field;
try {
CertificateFactory certificate_factory = CertificateFactory
.getInstance("X.509");
FileInputStream file_inputstream = new FileInputStream(CA_Name);
X509Certificate x509certificate = (X509Certificate) certificate_factory
.generateCertificate(file_inputstream);
Field = x509certificate.getType();
CA_ItemData[0][0] = "類型";
CA_ItemData[0][1] = Field;
Field = Integer.toString(x509certificate.getVersion());
CA_ItemData[1][0] = "版本";
CA_ItemData[1][1] = Field;
Field = x509certificate.getSubjectDN().getName();
CA_ItemData[2][0] = "標題";
CA_ItemData[2][1] = Field;
Field=x509certificate.getNotBefore().toString();//得到開始有效日期
CA_ItemData[3][0] = "開始有效日期";
CA_ItemData[3][1] = Field;
Field=x509certificate. getNotAfter().toString();//得到截止日期
CA_ItemData[4][0] = "截差槐止日期";
CA_ItemData[4][1] = Field;
Field=x509certificate.getSerialNumber().toString(16);//得到序列號
CA_ItemData[5][0] = "序列號";
CA_ItemData[5][1] = Field;
Field=x509certificate.getIssuerDN().getName();//得到發行者名
CA_ItemData[6][0] = "發行者名";
CA_ItemData[6][1] = Field;
Field=x509certificate.getSigAlgName();//得到簽名演算法
CA_ItemData[7][0] = "簽名演算法";
CA_ItemData[7][1] = Field;
Field=x509certificate.getPublicKey().getAlgorithm();//得到公鑰演算法
CA_ItemData[8][0] = "公鑰演算法";
CA_ItemData[8][1] = Field;
//關閉輸入流對象
file_inputstream.close();
final JTable table = new JTable(CA_ItemData, columnNames);
TableColumn tc = null; //表格列控制
tc = table.getColumnModel().getColumn(1);//得到表頭
tc.setPreferredWidth(600);//設置寬度
panel.add(table);//增加到布局面板
} catch (Exception exception) {
exception.printStackTrace(); //異常捕獲、
return -1;
}
return 0;
}
//讀取二進制指紋文件
private int Read_Bin(JPanel panel) {
try {
FileInputStream file_inputstream = new FileInputStream(CA_Name);
DataInputStream data_inputstream = new DataInputStream(
file_inputstream);
CertificateFactory certificatefactory = CertificateFactory
.getInstance("X.509");
byte[] bytes = new byte[data_inputstream.available()];
data_inputstream.readFully(bytes);
ByteArrayInputStream s = new ByteArrayInputStream(bytes);
JEditorPane Cert_EditorPane;
Cert_EditorPane = new JEditorPane();
X509Certificate cert=null;
//遍歷得到所有的證書屬性
if (s.available() > 0)
{
cert = (X509Certificate) certificatefactory .generateCertificate(s);
Cert_EditorPane.setText(cert.toString());
}
Cert_EditorPane.disable();
JScrollPane edit_scroll = new JScrollPane(Cert_EditorPane);
panel.add(edit_scroll);
file_inputstream.close();
data_inputstream.close();
} catch (Exception exception) {
exception.printStackTrace();
return -1;
}
return 0;
}
private int Read_Raw(JPanel panel) {
try {
JEditorPane Cert_EditorPane = new JEditorPane();
StringBuffer strBuffer =new StringBuffer();
File inputFile = new File(CA_Name);
FileReader in = new FileReader(inputFile);
char[] buf = new char[2000];
int len = in.read(buf, 0, 2000);
for (int i = 1; i < len; i++) {
strBuffer.append(buf[i]);
}
in.close();
Cert_EditorPane.setText(strBuffer.toString());
Cert_EditorPane.disable();
JScrollPane edit_scroll = new JScrollPane(Cert_EditorPane);
panel.add(edit_scroll);
} catch (Exception exception) {
exception.printStackTrace();
return -1;
}
return 0;
}
}
Ⅲ 一文弄懂關於證書,簽名,ssl,android包簽名機制。
所有的概念都基於一個非常重要的基礎:
rsa 非對稱加密演算法 :
先感受下幾個概念
PKI。
PKI是公鑰基礎設施(Public Key Infrastructure) 包括PKI策略、軟硬體系統、證書機構CA、注冊機構RA、證書發布系統和PKI應用等。
我們關注就倆東西: PKCS 證書機構CA 。前者是定義加密演算法,簽名,證書相關的各種事情採用的協議。後者可以為我們頒發權威的證書。
PKCS :
PKCS(The Public-Key Cryptography Standards )是由美國RSA數據安全公司及其合作夥伴制定的一組公鑰密碼學標准,其中包括證書申請、證書更新、證書作廢表發布、擴展證書內容以及數字簽名、數字信封的格式等方面的一系列相關協議。RSA演算法可以做加密、解密、簽名、驗證,還有RSA的密鑰對存儲。這些都需要標准來規范,如何輸入,如何輸出,如何存儲等。
PKCS。全稱是公鑰密碼學標准, 目前共發布過 15 個標准,這些標准都是協議。總結一下 就是對加密演算法,簽名,證書協議的描述。下面列舉一些常用的協議,這些協議在本文都會對應上。
這些協議具體的實現就體現在openssl等工具中, 以及jdk工具keytool jdk java第三方庫bouncycastle。
比如用openssl 如何生成公/私鑰(PKCS#1)、簽名(PKCS#1 )、簽名請求文件(KCS#10)、 帶口令的私鑰(PKCS#8)。 含私鑰的證書(PKCS#12)、證書庫(PKCS#12)
其中涉及到演算法的基礎協議PKCS#1等,由於涉及到密碼學原理所以我們並不需要深究它,只要知道怎麼做就可以了。
現實中我們要解決這樣一種情況:
客戶端和伺服器之間的數據要進行加密。需要兩個達成同一個對稱秘鑰加密才行,那麼這個秘鑰如何生成,並在兩邊都能拿到,並保證傳輸過程中不被泄露。 這就用到非對稱加密了。 後續的傳輸,就能用這個 對稱秘鑰來加密和解密了。
還有這樣一個問題:
就是客戶端如何判斷服務端是否是合法的服務端。這就需要服務端有個id來證明它,而這個id 就是證書,而且必須是權威機構頒發的才能算是合法的。
因為客戶端即瀏覽器,認定證書合法的規則必須通過第三方來確認 即ca頒發的證書。否則就我可能進了一個假網站。
而這兩個問題 都是ssl協議要解決的內容。
所以ssl協議做了兩件事情,一是驗證身份,二是協商對稱秘鑰,並安全的傳輸。 而實現這個過程的關鍵數據模型就是證書, 通過證書中的ca對證書的簽名,實現了身份驗證,通過證書中的公鑰,實現對對稱秘鑰加密,從而實現數據保密。 其實還順手做了一件事情就是通過解密簽名比對hash,保證了數據完整性。
明白ssl協議 首先明白幾個重要的概念:
證書: 顧名思義就是提供了一種在Internet上驗證通信實體身份的方式,數字證書不是數字身份證,由權威公正的第三方機構,即CA(例如中國各地方的CA公司)中心簽發的證書, 就是可以認定是合法身份的。客戶端不需要證書。 證書是用來驗證服務端的。
一般的證書都是x509格式證書,這是一種標準的證書,可以和其他證書類型互相轉換。完整來說證書包含,證書的內容,包括 版本號, 證書序列號, hash演算法, 發行者名稱,有效期, 公鑰演算法,公鑰,簽名(證書原文以及原文hash一起簽名)而這個內容以及格式 都是標准化的,即x509格式 是一種標準的格式。
簽名: 就用私鑰對一段數據進行加密,得到的密文。 這一段數據在證書的應用上就是 對證書原文+原文hash進行簽名。
誰簽的名,就是用誰的私鑰進行加密。就像身份證一樣, 合法的身份證我們都依據是政府簽的,才不是假證, 那就是瀏覽器會有政府的公鑰,通過校驗(解密)簽名,如果能夠解密,就可以確定這個就是政府的簽名。就對了。
hash演算法 :對原始數據進行某種形式的信息提取,被提取出的信息就被稱作原始數據的消息摘要。比如,MD5和SHA-1及其大量的變體。 hash演算法具有不可逆性,無法從摘要中恢復出任何的原始消息。長度總是固定的。MD5演算法摘要的消息有128個比特位,SHA-1演算法摘要的消息最終有160比特位的輸出。
ca機構: 權威證書頒發機構,瀏覽器存有ca的公鑰,瀏覽器以此公鑰來驗證服務端證書的合法性。
證書的獲取: 生成證書申請文件.csr(涉及到PKCS#10定義的規范)後向ca機構申請。 或者自己直接通過生成私鑰就可以一步到位生成自簽名證書。 自簽名證書就是用自己的私鑰來簽名證書。
那麼為了體現到 證書身份認證、數據完整、保密性三大特性 ,證書的簡化模型可以認為包含以下兩個要素:伺服器公鑰,ca的簽名(被ca私鑰加密過的證書原文+原文hash),
身份認證:
瀏覽器存有ca公鑰,用ca公鑰解密網站發給你的證書中的簽名。如果能解密,說明該證書由ca頒發,證書合法。 否則瀏覽器就會報警告,問你是否信任這個證書,也就是這個網站。這時候的證書可以是任何人簽發的,可以自己簽發的。 但是中間人攻擊。 完全偽造新的證書, 這就沒有辦法了。 所以還是信任證書的時候要謹慎。
數據完整:
如果你信任該證書的話,這時候就會用證書中的公鑰去解密簽名,如果是ca簽發的證書,那麼之前就已經通過ca的公鑰去解密簽名了。 然後得到證書hash,然後在瀏覽器重新對證書做hash,兩者比對一致的話,說明證書數據沒有被篡改。
保密性:
使用證書的公鑰對對稱秘鑰加密保證傳輸安全,對稱秘鑰生成後,後續的傳輸會通過對稱秘鑰來在服務端和客戶端的加解密。
那麼ssl協議的具體過程就是:
4.網站接收瀏覽器發來的數據之後 使用自己的私鑰校驗簽名,並對原文進行hash 與解密出的hash 做比對檢查完整性。然後發送編碼改變通知,伺服器握手結束通知(所有內容做hash )。 發送給客戶端校驗。
5 客戶端校驗,校驗成功後,之後就用 對稱秘鑰進行通信了。
總共的過程是 c-s-c- s-c 四次握手。
四次握手簡單來說分別是:
1.請求獲取證書
2.服務端返回證書,客戶端驗證了證書的合法性和完整性,同時生成了對稱秘鑰。
3.客戶端把加密的 對稱秘鑰發給伺服器。伺服器檢查真實性和完整性。
4.服務端返回握手結束通知,客戶端再檢查一次真實性和完整性。
前兩次握手是明文, 後兩次握手是密文。 所以都要檢查身份真實性和數據完整性。
ca的作用:
ca起到一個權威中間人的角色,如果脫離了ca, 那麼證書還是證書,還能加密,保證數據完整性。 但是無法應用在客戶端去認定伺服器身份合法這個場景下。
下面就詳細說下 脫離了ca簽發的證書的應用:
自簽名證書:
證書如果沒有權威機構的簽名,就是沒有權威機構給你簽發身份證。 那麼這時候身份認證的場景變了。
這時候的認證場景就變成了,不再是某個官方權威說了算,而是假設第一次碰到這個證書,會認為,這個證書與之捆綁的實體之間是合法的並做記錄。如果當這個實體下次捆綁了另一個證書,那麼就是非法的。
這種情況常用於android中安裝和校驗app的時候,會先假設第一次安裝的是合法的應用,認定這個app證書中的公鑰是合法的公鑰。然後通過自簽名的證書,校驗簽名,就能實現後續安裝是否合法以及完整性。
android中的如何對app進行身份認定和不被篡改:
android系統在安裝app時候會進行校驗applicationId,applicationId 不同會認定為不同應用。相同應用,第二次安裝會校驗證書是否和之前app的證書相同,如果相同則兩個包很可能來自同一個身份。 如果證書不同,也就是該包被另一個身份用自己的私鑰重新簽名過,就會拒絕安裝。 然後通過公鑰來解密簽名,如果能解密,說明身份是ok的。否則拒絕安裝。比對解密簽名後的hash 與apk包內的cert.sf文件(該文件是apk內所有文件生成的hash文件)是否一致,如果相同則認定為沒有被篡改。
android在提交應用商店的問題:
應用商店也會校驗 後續的上傳和第一次上傳時的證書,以及類似上述的後續的一系列校驗。防止合法的開發者平台被盜後,上傳非法應用。
android在接入第三方sdk的問題:
接入第三方sdk 會提交applicationId 和 sha1 值。 這個sha1值就是對 證書原文的簽名後的sha1,也就是證書指紋。這個證書是證書庫里最初的那個證書(x509格式),而不是對apk簽名後生成的證書(PKCS#7)。一般的證書簽名的主體是證書原文本身,而對apk簽名還額外會對apk所有文件生成的hash值文件(cert.sf)進行一次簽名。
第三方平台會記錄 applicationId 與sha1 的對應關系。 當有假冒app試圖接入時候,由於會對app內的PKCS#7證書轉換為原始的x509格式證書,重新生成sha1值,與用戶提交sha1 比對, 如果相同則說明證書很可能是ok的。 因為sha1就是證書的指紋。 之後就會通過證書中的公鑰來校驗簽名,從而最終確認身份合法性以及信息完整性。
第三方平台之所以需要用戶去提交證書指紋sha1值,多了這一步,就意味著你的證書是可以更換的,一旦更換了證書,就必須提交新的指紋給我,然後我來做匹配。而應用商店沒有這個功能, 一旦你的證書的私鑰丟了, 那就必須重新建一個新的app。
總結來看證書的身份認定機制:
在ssl協議下,這種場景是 瀏覽器用於認定合法的伺服器身份。 在自簽名證書下,需要用戶選擇是否信任該證書。
在android app採用自簽名證書的場景下, 證書起到了 假設第一次的證書合法,公鑰合法,後續如果證書不一致或不能夠完成簽名校驗,就是非法。
證書庫:
證書庫應該滿足PKCS#12協議。 但是jdk提供了製作證書的工具keytool 可以生成keystore類型的證書庫,後綴為jks。 keystore pk12可以通過keytool命令互相轉換。
證書庫是個證書的容器, 可以用來創建數字證書。 在keystore證書庫中,所有的數字證書是以一條一條(採用別名alias區別)的形式存入證書庫的。證書庫中的證書格式為pk12,即包含私鑰。 如果導出證書的話, 可以導出為x509不包含私鑰的格式 或者pk12包含私鑰的證書。 也可以也可以用-import參數加一個證書或證書鏈到信任證書。
android中一般都採用讀取證書庫的方式,通過證書庫來創建一個證書,通過alias來區分。 所以在簽名的時候,一個alias是一個證書,不同的alias是不同的證書,不要搞錯了。
幾個關系:
證書和非對稱加密演算法的關系:
證書代表一個身份的主體,包含了非對稱秘鑰體系中的公鑰,以及用私鑰對證書簽名。這種組織結構,把非對稱加密演算法從加密的功能,拓寬到了用於身份認證,信息完整性上。這體現在了證書的作用。 本質還是利用了非對稱加密演算法的特性。
ssl協議和證書的關系。
因為證書解決了客戶端對伺服器的身份認證(自簽名證書除外),同時也解決了加密,和信息完整性,所以ssl協議基於證書來實現。
Ⅳ Https 證書校驗加密機制
數字證書中包含的信息:
1、證書的版本信息;
2、證書的序列號,每個證書都有一個唯一的證書序列號;
3、證書所使用的簽名演算法;
4、證書的發行機構名稱,命名規則一般採用X.500格式;
5、證書的有效期,通用的證書一般採用UTC時間格式;
6、證書所有人的名稱,命名規則一般採用X.500格式;
7、證書所有人的公開密鑰;
8、證書發行者對證書的簽名。
流程:
1.客戶端發送https請求。
2.服務端返回數字證書給客戶端。
3。 客戶端進行驗證 ,驗證成功,則隨機生成字元串,並使用證書上的公鑰進行加密發送給服務端。
4.服務端使用私鑰對加密串進行解密,解出來的就是對稱加密的密鑰。
第三步中客戶端具體驗證原理:
簽名:伺服器對原信息進行HASH計算(一般是sha1或sha256)生成一個hash值,這個值就是指紋,然後將指紋用 CA機構的根私鑰 進行非對稱加密,生成的就是數字簽名。
瀏覽器從證書中獲取證書的頒發機構,從系統內置CA機構證書中查找,如果沒有,就會有警告提示,就的話就獲取對應機構的根公鑰,用根公鑰對簽名進行簡侍非對稱解密,得到這個指紋hash值。客戶端再次對原信息行一次HASH計算,得到一個新的指紋hash1值,如果解密出來的hash與瀏覽器自己算出來的hash1一致,就說明證書沒有被修改過。
(之所以是對指紋進行加密,是因為如果對原文派乎進行攔羨吵加密的話,非對稱加密的速度非常的慢,效率不高)
Ⅳ TLS/SSL數字證書里的指紋演算法、簽名演算法和簽名哈希演算法各是做什麼用的
簽名哈希演算法
當用公鑰解密出數據後,通過簽名哈希演算法計算出傳輸內容的hash值,同時比對隨內容一起傳過來的hash值,確定傳輸內容是否被篡改知爛
簽名演算法
傳遞信息的hash指紋是加密後隨內容一起傳遞的,這為了防止不會好意的人同時修改信息內容和其中的hash值,達到相匹配,讓簽名哈搭備漏希演算法步驟失去真正作用。所以hash值發出前都需要滾伍加密,這是為了數據傳輸更安全上的一道保險鎖。
簽名演算法就是為了解密被加密的傳遞信息的hash指紋
指紋演算法
簡單來講就是驗證收到的數字證書本身有沒有問題。
通過指紋演算法計算證書hash值(指紋),和證書中給出的指紋比對,確認證書正確。
Ⅵ ssl證書 指紋演算法 是什麼意思
網際網路的 超文本傳輸協基友鏈議 (HTTP)使用 SSL 來實現安全的通信。搏孫 在客戶端與伺服器告橡間傳輸的數據是通過使用對稱演算法(如 DES 或 RC4)進行加密的。公用密鑰演算法(通常為 RSA)是用來獲得加密密鑰交換和數字簽名的,此演算法使用伺服器的SSL數字證書...
Ⅶ https傳輸過程
HTTPS傳輸過程主要涉及到對稱加密和非對稱加密兩種方式,對稱加密用來加密數據內容,非對稱加密用來加密對稱加密的秘鑰。
加密和解密使用相同的密鑰
使用公鑰進行加密,私鑰進行解密;私鑰加密的話就使用公鑰解密
A向B發送消息 使用B的公鑰進行加密 B收到密文後使用自己的私鑰進行解密 反之亦然
https協議採用的就是這種加密方式
為了解決在對稱加密/非對稱加密中公鑰被竊取的情況。
A先生成一個對話密鑰,然後把對話密鑰發送給B。但是這個對話密鑰要經過B的公鑰進行加密,B收到後用自己的私鑰進行解密。這樣就解決了對稱加密時公鑰容易被截取的缺陷。
實際上就是對稱加密的密鑰進行非對稱加密
B的公鑰是在最開始連接建立的時候發送給A的。假如這個時候有一個中間人截取了B的公鑰,然後將自己的公鑰發送給A。A在給B發送消息時,想用B的公鑰進行加密。但實際上用的是中間人的公鑰。中間人截取了A給B發送的消息,然後用自己的私鑰解密。就可以隨意讀取消息的內容。
此外,中間人也可以使用B的公鑰來加密一些消息傳輸給B,讓B以為中間人就是A
用於防止中間人攻擊
數字證書是由專業的機構頒發的CA(Certificate Authority)機構
CA機構通過服務端提供的相關信息生成證書,證書的主要內容有:公鑰(Public Key)、ISSUER(證書的發布機構)、Subject(證書持有者)、證書有效期、簽名演算法、指紋及指紋演算法。
數字證書是如何保證公鑰來自請求的伺服器呢?數字證書上由持有人的相關信息,通過這點可以確定其不是一個中間人;但是證書也是可以偽造的,如何保證證書為真呢?
瀏覽器接收到證書以後,就要開始進行驗證工作了。首先從證書中得知證書的頒發機構,然後從瀏覽器系統中去尋找此頒發機構的根證書。上面我們也看到,世界上權威CA機構的根證書都是預先嵌入到瀏覽器中的,如果在瀏覽器系中沒有找到對應的根證書,就代表此機構不是受信任的,那麼就會警告無法確認證書的真假,比如以前打開12360網站就會提示,現在不會了
如果我們找到了證書頒發機構的根證書,那麼就從根證書中取得那個根公鑰,用根公鑰去解密此證書的數字簽名,成功解密的話就得到證書的指紋和指紋演算法,指紋是證書內容通過指紋演算法計算得到的一個hash值,這里我們稱之為h1,h1代表證書的原始內容;然後用指紋演算法對當前接收到的證書內容再進行一次hash計算得到另一個值h2,h2則代表當前證書的內容,如果此時h1和h2是相等的,就代表證書沒有被修改過。如果證書被篡改過,h2和h1是不可能相同的,因為hash值具有唯一性,不同內容通過hash計算得到的值是不可能相同的
有人說假如證書上的指紋是不法分子偽造的,偽造是沒有用的,因為你偽造的指紋不可能用CA機構的根私鑰去加密(根私鑰是CA機構絕對保密的),偽造者只能拿自己的秘鑰去加密這個偽造的指紋,但當我們拿機構的根公鑰去解密偽造指紋的時候是不可能成功的(加密內容只能由一對公鑰私鑰解密)
在證書沒有被修改過的基礎上,再檢查證書上的使用者的URL(比如csdn.net)和我們請求的URL是否相等,如果相等,那麼就可以證明當前瀏覽器鏈接的網址也是正確的,而不是一些釣魚網之類的
但如果瀏覽器的連接被某個中間人截取了,中間人也可以發一個由權威的CA機構頒發的證書給瀏覽器,然後也可以通過證書沒有被篡改的驗證,但是在證書沒有被篡改的前提下,通過對比證書上的URL和我們請求的URL是否相同,我們還是可以判斷當前證書是不是伺服器發的證書。可以這么理解,因為URL具有唯一性,所以中間人的證書的上的URL和我們的證書的URL是不可能相同的,如果中間人修改了自己證書上的URL,那麼就通過不了證書沒有被篡改的驗證,所以中間人的證書也是欺騙不了我們的
到這里我們認證了三點信息:
https就是在http和tcp之間加入了一層SSL層。https的安全基礎就是ssl。
https協議就是由http+ssl組成的可以進行加密傳輸和身份認證的網路協議。https的作用:
所以在證書驗證階段使用的是非對稱加密(即生成會話密鑰的階段),在內容傳輸的時候還是對稱加密
握手階段我們需要注意三點:
從上面可以得知,整個會話過程中(包括握手以及之後的數據傳輸)伺服器的公鑰和私鑰只用到了一次
Ⅷ 如何獲取數字證書(x509Certificate)中的指紋演算法
創建X509證書方法較多,在Windows 環境下大致總結了幾中辦法,
1) 通過CA獲取證書,
2) 通過微軟提供的makecert 工具敗弊掘得到測試證書
3) 編程的方法創建,.Net提供了 X509Certificate2 類,該類可以用於創建證書,但只能從RawData中創建,創建後無法修改除FriendlyName以外的任何屬性。
我在互聯網上找了很久,始終沒有找到完全通過程序創建自定義的證書的方法。後來想了一個折中辦法,就是用程序調用 makecert.exe 先生成一個證書,證書的一些參數如Subject,有效期,序列號等可以通過參數傳入,然後把生成的證書文件讀到Rawdata中,得到X509Certificate2 類型的證書對象。當然這種方法確實比較笨,必須要依賴外部進程。等後面有時間的話,我還是想按照X509 V3 標准,自己創建RawData,然後生成證書,這樣應該是比較靈活的做法。不知道網友們有沒有什麼更好的方察核法來創建一個自定義的證書。
通過 makecert.exe 創建X509證書的代碼如下,供大家參考
static object semObj = new object();
/// <summary>
/// 自定義的證書信息
/// </summary>
public class T_CertInfo
{
public String FriendlyName;
public String Subject;
public DateTime BeginDate;
public DateTime EndDate;
public int SerialNumber;
}
/// <summary>
/// 生成X509證書
/// </summary>
/// <param name="makecrtPath">makecert進程的目錄</param>
/// <param name="crtPath">證書文件臨時目錄</param>
/// <param name="certInfo">證書信息</param>
/// <returns></returns>
public static X509Certificate2 CreateCertificate(String makecrtPath, String crtPath,
T_CertInfo certInfo)
{
Debug.Assert(certInfo != null);
Debug.Assert(certInfo.Subject != null);
string MakeCert = makecrtPath + "makecert.exe";
string fileName = crtPath + "cer";
string userName = Guid.NewGuid().ToString();
StringBuilder arguments = new StringBuilder();
arguments.AppendFormat("-r -n \"{0}\" -ss my -sr currentuser -sky exchange ",
certInfo.Subject);
if (certInfo.SerialNumber > 0)
{
arguments.AppendFormat("-# {0} ", certInfo.SerialNumber);
}
arguments.AppendFormat("-b {0} ", certInfo.BeginDate.ToString(@"MM\/dd\/yyyy"));
arguments.AppendFormat("-e {0} ", certInfo.EndDate.ToString(@"MM\/dd\卜慧/yyyy"));
arguments.AppendFormat("\"{0}\"", fileName);
Ⅸ https數字證書驗證原理
數字證書是Https實現安全傳輸的關鍵,它是由權威的CA機構頒布。如上圖 GeoTrust 便是一個CA機構。證書的主要內瞎凱容包含如下幾點:公鑰、證書發布機構、證書持有者、證書有效期、簽名演算法、 指紋 和 指紋演算法 。
在網路傳輸中,要想實現自己的數據能夠安全的橡神帆傳輸,需要對請求數據進行加密。這樣即使被數據包被截取,數據也不會被泄漏。
該證書是 CA機構 頒發給 申請者 的。
在網路傳輸中,若直接傳輸對稱加密的秘鑰。請求被攔截後,密鑰也會泄露,造成信息泄露。所以HTTPS首先採取非梁雹對稱加密方式,將公鑰傳輸給瀏覽器。同時還會攜帶一些其他信息(這些信息組成證書)。
如下圖所示,證書中 使用者 欄位包含的內容時 *.csdn.net ,這個欄位可以讓瀏覽器供瀏覽器進行驗證。(瀏覽器可以判定是否是目標伺服器發送的證書,而非三方伺服器發送的證書)。
伺服器將該證書發送給瀏覽器的。
瀏覽器內置 CA機構 為 自己頒發的證書 。即 根證書 。
谷歌瀏覽器:設置-->高級-->管理證書--->受信任的根證書頒發機構
根證書是瀏覽器內置的。 根證書中攜帶的是CA的根公鑰。 而根私鑰是絕對保密的 。
CA機構頒發給申請者的CA證書中,存在一個 指紋 屬性,該屬性可以理解為證書身份的唯一標識。
指紋: 證書信息經過指紋演算法sha1計算出hash值,然後使用 根密鑰 進行加密。
https://www.cnblogs.com/MR-Guo/p/11447856.html