首頁 > 軟體

OpenSSL編碼規則概述

2020-06-16 17:44:44

1 資料編碼格式

openssl的資料編碼規則是基於ans.1的,ans.1是什麼 ? 先上高大上的解釋

ASN.1(Abstract Syntax Notation One), 是一種結構化的描述語言,包括兩部分,資料描述語言和資料編碼規則,資料描述語言標準:語言標準允許使用者自定義的基本資料型別,並可以通過簡單的資料型別組成更複雜的資料型別。資料編碼規則:這些編碼方法規定了將數位物件轉換成應用程式能夠處理、儲存、傳輸的二進位制形式的一組規則。標準ASN.1編碼規則有規範編碼規則(CER,Canonical Encoding Rules)、唯一編碼規則(DER,Distinguished Encoding Rules)、壓縮編碼規則(PER,Packed Encoding Rules)和XML編碼規則(XER,XML Encoding Rules)。

沒看懂?好吧,我也沒看懂。經過搜尋無數資料後,現把自己的理解說一下,有不對的地方請大牛指正

我們知道在計算機語言中有很多的資料結構,有列表、集合、陣列等等。但對應用程式特別是網路來說,這些資料結構都是二進位制的資料流,那麼如何把這些不同的資料結構變成資料流,又能讓其他應用能夠識別呢。這就需要一個標準,也就是我們說的ans.1,大家都遵守這個標準,自然可以和平共處。OK,這個標準到底是什麼玩意?

這個問題一會再來回答。現在我們想想如何把一個二元樹中的資料以流的形式發出去,對於整型、字串這些基本型別我們可以直接塞進資料流裡,但對於這種複雜的結構,這種方法就不顯示了,怎麼辦?我們引入一個數位物件的概念,把這些資料結構轉化成一個數位物件,怎麼轉?這就用到了asn.1標準的第一部分--資料描述語言標準,這個標準定義了一些基本的資料型別,如果我們使用到複雜的資料結構,asn.1還允許通過簡單資料型別組成複雜的資料型別(x.509)。

數位物件已經建立的,怎麼把這個資料物件變成二進位制流呢,這就需要用到ans.1的第二部分--編碼規則,編碼方法規定了將數位物件轉換成應用程式能夠處理、儲存、傳輸的二進位制形式的一組規則。

現在可以回答上面這個問題了,簡單來說這個標準就是規定了把資料轉化成資料物件,又規定資料物件編碼為二進位制流的方法。

openssl使用的是asn.1的der編碼規則,保證每個asn.1物件使用der編碼的出的二進位制編碼是唯一的。

openssl使用pem作為基本的檔案編碼格式,pem和der是什麼關係,如下圖所示,幾種加密環節是可選的

從本質上來說,openssl是pem編碼就是在der編碼的技術上進行Base64編碼,然後新增一些頭尾資訊組成,可以通過openssl指令對der和pem進行格式轉換

2 證書編碼格式

常見的證書編碼格式有三種X.509證書,PKCS#12證書PKCS#7證書。

X.509證書:最常用的證書格式,它僅包含了公鑰資訊而沒有私鑰資訊,一個openssl簽發經過PEM編碼的X.509證書看起來如下

-----BEGIN CERTIFICATE-----
XXX
-----END CERTIFICATE-----

中間部分就是經過PEM編碼的X509證書。除了上述形式的頭尾格式,還可能出現以下兩種不同的識別符號

-----BEGIN X.509 CERTIFICATE----
XXX
-----END X.509 CERTIFICATE-----
或者
-----BEGIN TRUSTED  CERTIFICATE-----
-----END TRUSTED  CERTIFICATE-----

X.509證書檔案的字尾名經常是der,cer或者crt。openssl的指令x509提供了對X.509證書進行格式轉換的方法。

PKCS#12證書:PKCS12證書可以包含一個或者多個證書,並且還可以包含證書對應的私鑰。openssl的pkcs12指令可以將X.509格式的證書和私鑰封裝成PKCS#12格式的證書,也可以將PKCS#12證書轉換成X.509證書

PKCS#12證書的字尾名通常是p12或者pdx

PKCS#7證書: PKCS#7可以封裝一個或者多個X.509證書或者PKCS#6證書,並且可以包含CRL資訊。PKCS#7證書中也不包含私鑰資訊。openssl提供了crl2pkcs7和pkcs7兩個指令來生成和處理PKCS#7檔案,可以使用他們在X.509證書和PKCS#7證書之間進行轉換和處理

PKCS#7證書的字尾名是p7b

3 金鑰編碼

openssl有多種形式的金鑰,openssl提供PEM和DER兩種編碼方式對這些金鑰進行編碼,並提供相關指令可以使使用者在這兩種格式之間進行轉換

openssl金鑰大致可以分為兩種,一種是可以公開的,例如公鑰,一種是不能公開的,比對私鑰。反映在編碼上,有的金鑰需要加密,有的金鑰就不需要加密。一個經過加密的PEM編碼金鑰檔案會在PEM檔案中增加一些頭資訊,表明金鑰的加密狀態,加密演算法及初始化向量等資訊

openssl指令提供了對金鑰加密的功能,並提供了多種可選的對稱加密演算法,比如DES和DES3。當對金鑰進行加密的時候通常需要使用者輸入口令,這裡的口令並非直接用來作為加密的金鑰,而是根據這個口令使用一系列HASH操作來生成一個使用者加密金鑰資料的金鑰。當讀取這類金鑰的時候,同樣需要輸入同樣的口令。

更多OpenSSL相關內容可以檢視以下的有用連結: 

使用 OpenSSL 命令列構建 CA 及證書  http://www.linuxidc.com/Linux/2015-10/124682.htm

Ubuntu安裝OpenSSL  http://www.linuxidc.com/Linux/2015-10/124001.htm

通過OpenSSL提供FTP+SSL/TLS認證功能,並實現安全資料傳輸 http://www.linuxidc.com/Linux/2013-05/84986.htm

Linux下使用OpenSSL生成證書 http://www.linuxidc.com/Linux/2015-05/117034.htm

利用OpenSSL簽署多域名證書 http://www.linuxidc.com/Linux/2014-10/108222.htm

在OpenSSL中新增自定義加密演算法  http://www.linuxidc.com/Linux/2015-08/121749.htm


IT145.com E-mail:sddin#qq.com