歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> OpenSSL編碼規則概述

OpenSSL編碼規則概述

日期:2017/2/28 13:53:46   编辑:Linux教程

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

OpenSSL 的詳細介紹:請點這裡
OpenSSL 的下載地址
:請點這裡

Copyright © Linux教程網 All Rights Reserved