PKI知識點整理

1 基礎(chǔ)

1.1 對稱算法

  • 描述:對稱加密是指加密過程和解密過程使用相同的密碼泣特。主要分:分組加密柿菩、序列加密部凑。
  • 原理:XOR運算椭员,將二進制數(shù)據(jù)進行XOR運算干签,兩次同樣的操作得到原文,所以大致過程就是加密->A xor B = C拆撼,解密->C xor B = A(B就是密鑰)容劳。
  • 優(yōu)點:加密速度快喘沿,適合于對大量數(shù)據(jù)加密。
  • 缺點:發(fā)送方和接受方需要使用相同的密鑰竭贩,一旦密鑰泄露蚜印,在互聯(lián)網(wǎng)上傳輸?shù)募用軘?shù)據(jù)將會被中間人破解。而且由于加密數(shù)據(jù)量大

分類:

  • DES(Data Encryption Standard)留量,
    • 分組算法
    • 分組長度64bit(8字節(jié))窄赋,明文分為左右兩側(cè)輪回與密鑰XOR運算,每輪使用不同的密鑰
    • 密鑰空間2^56
  • 三重DES(triple-DES),將DES重復(fù)3次
    • 分組長度64bit(8字節(jié))
  • AES(Advances Encryption Standard)楼熄,高級加密標(biāo)準(zhǔn)
    • 分組長度為128bit(16字節(jié))
    • 密鑰長度只有128忆绰、192、256bit
  • RC2,RC4,RC5
    • RC2和RC5是分組算法可岂,RC4是序列算法
    • RC5分組可變错敢、密鑰長度可變
  • SSF33,SM1,SM4
    • 分組算法
    • 分組長度128bit(16字節(jié))

1.2 摘要算法

摘要算法使用密碼學(xué)hash函數(shù),用于驗證數(shù)據(jù)完整性(沒有修改缕粹、插入稚茅、刪除、或重放)平斩。找到兩個不同數(shù)據(jù)具有相同hash值的難度高亚享。
輸入數(shù)據(jù)的長度首先被填充為某固定長度分組的整數(shù)倍,填充的內(nèi)容包括原始數(shù)據(jù)的位長度信息绘面。安全性要求如下兩種情況在計算上不可行(即沒有攻擊方法比窮舉攻擊更有效):

  • 對預(yù)先指定的hash值找到對應(yīng)的數(shù)據(jù)塊(單向性)
  • 找到兩個不同的數(shù)據(jù)塊對應(yīng)相同的hash值(抗碰撞性)

Hash算法一般是指Hash表的摘要算法欺税,將不同的鍵值分散到不同的數(shù)組位置,允許少量的沖突碰撞揭璃。安全Hash算法(SHA)是使用最廣泛的Hash函數(shù)

  • MD2魄衅、MD4、MD5
    • 摘要長度128bit(16字節(jié))
  • SHA1塘辅、SHA2晃虫、SHA3
    • Secure Hash Algorithm
    • SHA-1摘要長度160bit(20字節(jié))
    • SHA-2摘要長度256bit(32byte)
    • SHA-3摘要長度384bit(48byte)
  • SM3
    • 中國國家商用密碼算法
    • 摘要長度256bit(32byte)

摘要函數(shù)——MD2/MD4/MD5數(shù)字簽名

附1:消息認(rèn)證碼(MAC)

又稱密碼校驗和,利用密鑰K和可變長度的數(shù)據(jù)M生成固定長度的短數(shù)據(jù)塊MAC扣墩,并將數(shù)據(jù)塊附加在數(shù)據(jù)M之后:
$$
MAC = C(K, M)
$$
若對于數(shù)據(jù)的保密性要求不高(例如廣播)哲银,可直接將消息MMAC一起發(fā)給接受者,接收者收到后使用相同的密鑰K和MAC函數(shù)C對消息M計算得出MAC2呻惕,再對比兩者是否相等荆责。(這里設(shè)定通信雙方共享相同的密鑰K
若對于數(shù)據(jù)的保密性要求嚴(yán)格,可選擇將消息MMAC加密再發(fā)送:
$$
ENC = E(K_2, M||C(K_1,M))
$$
接收者收到數(shù)據(jù)后首先解密亚脆。

附2:基于Hash函數(shù)的MAC:HMAC

HMAC將Hash函數(shù)視為黑盒做院,將現(xiàn)有Hash函數(shù)作為一個模塊,預(yù)先封裝,在需要時直接使用键耕。

HMAC結(jié)構(gòu)
  • H:嵌入的Hash函數(shù)
  • IV:Hash函數(shù)輸入的初始化數(shù)組
  • M:HMAC的消息輸入(包括由嵌入Hash函數(shù)定義的填充位)
  • $Y_i$:M的第i個分組
  • L:M中的分組個數(shù)
  • b:每一分組所含位數(shù)(bits)
  • n:嵌入的Hash函數(shù)所產(chǎn)生的Hash碼長

1.3 分組模式

  • ECB (Electronic Code book寺滚,電子密碼本方式)明文分組與密文分組一一對應(yīng)
    • 優(yōu)點:最簡單的一種模式,可并行運算屈雄,誤差不會傳遞
    • 缺點:若有相同明文分組村视,將被加密成相同密文分組,即明文的結(jié)構(gòu)容易被泄露
    • CA產(chǎn)品的私鑰保護使用ECB算法
  • CBC (Cipher-block chaining酒奶,密碼分組鏈接)明文分組首先與一個密文分組XOR運算蚁孔,然后再加密,這樣做的目的就是改變明文分組的結(jié)構(gòu)惋嚎,由于第一個明文分組前沒有密文分組杠氢,需增添IV初始化向量,與第一個明文分組XOR運算
    • 若密文分組損壞另伍,但是長度沒有改變鼻百,即僅改變幾位的數(shù)據(jù),解密后最多只影響兩個明文分組(密文分組本身對應(yīng)的明文分組质况,密文分組為后一個分組提供XOR伙伴的后一個明文分組)
    • 若密文缺失bit,則缺失bit之后的密文全部無法解密
  • CFB (Cipher Feedback 玻靡,密碼反饋模式)明文分組與密鑰XOR運算结榄,CFB實現(xiàn)了一個被我成為偽偽隨機數(shù)發(fā)生器的密碼算法,它將前一個密文分組加密生成一個bit序列囤捻,稱為密鑰流(key stream)臼朗,由于第一個明文分組前沒有密文分組,需添加IV初始化向量蝎土,執(zhí)行加密生成第一個密鑰流视哑。
  • OFB (Output Feedback ,輸出反饋模式)OFB與CFB相同的地方在于都是將明文分組與密鑰XOR運算誊涯,區(qū)別就在于密鑰的生成挡毅。OFB的密鑰算法的輸入來自于上一個密鑰算法的輸出。第一個密鑰算法的輸入使用一個IV向量

OFB與CFB都采用將分組加密轉(zhuǎn)換成流加密的方式

1.4 填充模式

  • PKCS#5Padding
PKCS5Padding

如圖暴构,用自己的話來描述就是缺多少bit跪呈,就在每個bit里填多少。該方式是8分組結(jié)構(gòu)取逾,只適合DES/3DES耗绿。

  • PKCS7Padding
    分組長度可以是小于255的任意長度
  • ZeroPadding
    使用0X0補齊:... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |
  • ANSI X.923
    該模式在最后一個字節(jié)填缺少的bit數(shù),其它補0X0(我覺得這個模式更符合一般人的想法):... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |
  • ISO 10126
    該模式個人覺得稍好一些砾隅,最后一個填充位填寫缺少的bit數(shù)误阻,其它位填充隨機數(shù):... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |
  • ISO/IEC 7816-4
    填充實例如下:... | DD DD DD DD DD DD DD DD | DD DD DD DD 80 00 00 00 |(未解)

1.5 密鑰運算

密鑰運算包含兩種操作(私鑰操作、公鑰操作),簽名驗簽正是基于這兩種操作:
$$
C=P^d mod n
$$

$$
P=C^d mod n
$$

1.5.1 簽名驗簽

使用簽名的前提是使用公鑰加密的密文只有私鑰才能解開究反,使用私鑰加密的密文只有公鑰才能解開寻定,確保了身份認(rèn)證抗抵賴性。
過程:

  • 對原文摘要
  • A使用自己的私鑰AS對摘要私鑰加密運算奴紧,得到簽名
  • B使用A的公鑰AP對簽名公鑰解密運算特姐,得到摘要值2,這一步證明簽名來自A黍氮,若C偽造A的身份使用自己的私鑰CP唐含,則B的公鑰解密失敗。
  • B再使用和A相同的hash算法對原文摘要沫浆,得到摘要值3捷枯,這一步可用來驗證原文是否遭到篡改,
  • B驗證摘要值2和3是否相等

至于填充模式专执,定義在PKCS#1:00||BT||PS||00||D

  • 00保證大數(shù)是非負(fù)整數(shù)
  • BT分為00淮捆,01,02本股。00,01是私鑰操作攀痊,02是公鑰操作
    • 00:填充數(shù)據(jù)全為0X00,摘要必須以非0開頭拄显,如果摘要以0開頭苟径,將與填充數(shù)據(jù)無法區(qū)分
    • 01:填充數(shù)據(jù)全為0XFF
    • 02:填充數(shù)據(jù)必須為隨機數(shù)

1.5.2 RSA公鑰加密

使用RSA公鑰運算,過程如下:

  • 對原文數(shù)據(jù)填充躬审、封裝->$P$
  • 對P大數(shù)運算:$C=P^e mod n$

用途:用于非對稱傳輸信息棘街,比如Bob有一個信息想傳給Alice,需使用Alice的公鑰加密信息承边,傳給Alice遭殉,Alice得到加密信息后使用自己的私鑰即可解開讀取信息。他人即使截獲加密信息也無法解開博助,利用了大數(shù)分解難題险污。

1.5.3 RSA私鑰解密

使用RSA私鑰運算,過程如下:

  • 對密文數(shù)據(jù)大數(shù)運算:$P=C^d mod n$
  • 對P進行去填充

以上可以看出富岳,私鑰解密和簽名的運算過程一致罗心!

1.6 PKCS#1

定義RSA公私鑰數(shù)據(jù)表達形式,及加密城瞎,解密渤闷,簽名,驗簽脖镀,填充過程飒箭,定義了數(shù)字簽名如何計算狼电,包括簽名數(shù)據(jù)和簽名本身的格式。

RSA公鑰結(jié)構(gòu):

RSAPublicKey :: = SEQUENCE{
   modulus              INTEGER,   ------ n(RSA合數(shù)模)
   publicExponent    INTEGER    ------ e (RSA公開冪弦蹂,3~n-1范圍內(nèi)的正整數(shù))
}

RSA公鑰的ASN.1結(jié)構(gòu)肩碟,可以表述為:名為RSAPublicKey的這個結(jié)構(gòu)呢,就可以用來表述一個RSA公鑰了凸椿。它有兩個INTEGER型變量:modulus和publicExponent削祈。

RSA私鑰結(jié)構(gòu):

RSAPrivateKey :: = SEQUENCE{
    version                 Version,(版本號,如果使用多素數(shù)脑漫,版本號為1)
    modulus               INTEGER,   ------ n(RSA合數(shù)模)
    publicExponent     INTEGER,   ------ e(RSA的公開冪)
    privateExponent    INTEGER,   ------ d(RSA的私有冪)
    prime1                 INTEGER,   ------ p(n的素數(shù)因子p)
    prime2                 INTEGER,   ------ q(n的素數(shù)因子q)
    exponent1            INTEGER,   ------ d mod (p -1)
    exponent2            INTEGER,   ------ d mod (q -1)
    coefficient            INTEGER,   ------- (inverse of q) mod p
    otherPrimeInfos    OtherPrimeInfos   ------ OPTIONAL(當(dāng)version為0時髓抑,不存在;當(dāng) version為1時优幸,必須有)
}

加密和簽名方案的對象標(biāo)識

以下是對PKCS#1 OID的類型表示的定義

PKCS1Algorithms ALGORITHM-IDENTIFIER ::= {
 { OID rsaEncryption PARAMETERS NULL } |
 { OID md2WithRSAEncryption PARAMETERS NULL } |
 { OID md5WithRSAEncryption PARAMETERS NULL } |
 { OID sha1WithRSAEncryption PARAMETERS NULL } |
 { OID sha256WithRSAEncryption PARAMETERS NULL } |
 { OID sha384WithRSAEncryption PARAMETERS NULL } |
 { OID sha512WithRSAEncryption PARAMETERS NULL } |
{ OID id-RSAES-OAEP PARAMETERS RSAES-OAEP-params } |
 PKCS1PSourceAlgorithms |
{ OID id-RSASSA-PSS PARAMETERS RSASSA-PSS-params } ,
 ... -- Allows for future expansion --
} 

RSAES-OAEP加密

RSAES-OAEP-params ::= SEQUENCE {
 hashAlgorithm [0] HashAlgorithm DEFAULT sha1,(標(biāo)識了散列函數(shù))
 maskGenAlgorithm [1] MaskGenAlgorithm DEFAULT mgf1SHA1, (標(biāo)識掩膜生成函數(shù))
 pSourceAlgorithm [2] PSourceAlgorithm DEFAULT pSpecifiedEmpty(標(biāo)識標(biāo)簽L的源)
} 

hashAlgorithm支持的散列函數(shù):

OAEP-PSSDigestAlgorithms ALGORITHM-IDENTIFIER ::= {
 { OID id-sha1 PARAMETERS NULL }|
{ OID id-sha256 PARAMETERS NULL }|
{ OID id-sha384 PARAMETERS NULL }|
{ OID id-sha512 PARAMETERS NULL },
 ... -- Allows for future expansion --
} 

1.7 PKCS#5

基于口令的加密規(guī)范Password-Based Cryptography Specification

目的:保護私鑰文件的安全性

通過將原始口令+salt派生出新口令進行加密

PKSC5Padding(用于制定算法DES)對稱加密填充方式吨拍,填充塊固定為8個字節(jié),填充值為待填充的長度网杆,與PKCS7Padding類似羹饰。

1.8 PKCS#7

加密消息的語法標(biāo)準(zhǔn)Cryptographic Message Syntax Version 1.5
結(jié)構(gòu):

typedef struct pkcs7_st
{
  /* 其他項 */

  ASN1_OBJECT *type;

  union
  {
    char *ptr;
   /* NID_pkcs7_data */
   ASN1_OCTET_STRING *data;

   /* NID_pkcs7_signed */
   PKCS7_SIGNED *sign;

   /* NID_pkcs7_enveloped */
   PKCS7_ENVELOPE *enveloped;

   /* NID_pkcs7_signedAndEnveloped */
   PKCS7_SIGN_ENVELOPE *signed_and_enveloped;

   /* NID_pkcs7_digest */
   PKCS7_DIGEST *digest;

   /* NID_pkcs7_encrypted */
   PKCS7_ENCRYPT *encrypted;

   /* Anything else */
   ASN1_TYPE *other;
 } d;
} PKCS7;

pkcs7 各種類型數(shù)據(jù)結(jié)構(gòu)的 DER 編解碼通過宏在 crypto/pkcs7/pk7_asn1.c 中實現(xiàn)

  • 可以包含6種類型的數(shù)據(jù):
    • id-data: 任意數(shù)據(jù),由應(yīng)用解析碳却,可以是明文數(shù)據(jù)队秩。
    • id-signedData: 簽名數(shù)據(jù)
    • id-envelopedData: 加密數(shù)據(jù)
    • id-signedAndEnvelopedData: 簽名又加密數(shù)據(jù),數(shù)字信封
    • id-digestedData: 摘要數(shù)據(jù)昼浦,原文及摘要結(jié)果
    • id-encryptedData: 只有加密數(shù)據(jù)馍资,密鑰在帶外傳送、管理

數(shù)字信封流程:(A:發(fā)送方座柱;B:接收方迷帜;SK:私鑰物舒;PK:公鑰)

  • A對明文進行hash運算色洞,得到摘要

  • A用自己的私鑰A:SK對摘要進行RSA私鑰加密運算,得到A的數(shù)字簽名

  • A隨即產(chǎn)生一個用于特定加密算法的加密密鑰(DES密鑰)冠胯,并使用該密鑰對明文進行對稱加密火诸,形成密文

  • A使用B的公鑰B:PK對隨機產(chǎn)生的加密密鑰進行RSA公鑰加密運算,并將結(jié)果與密文一同傳送給B

  • B用自己的私鑰B:SK對對稱加密的結(jié)果進行RSA私鑰解密運算荠察,得到A隨機產(chǎn)生的對稱加密密鑰

  • B用加密密鑰對密文解密置蜀,得到明文

  • B用A的公鑰A:PK對A的數(shù)字簽名進行RSA公鑰解密運算,得到A的信息摘要

  • B用相同的hash算法對明文進行hash運算悉盆,得到新的信息摘要盯荤,并與收到的信息摘要比較,若一致焕盟,則說明明文未被修改秋秤,來自A。

常用的用途有:

  • 證書鏈
  • 數(shù)字信封
  • 帶原文的簽名數(shù)據(jù)

PKCS#7結(jié)構(gòu)分析之簽名

PKCS#7結(jié)構(gòu)分析之?dāng)?shù)字信封

附:數(shù)字信封

envelop

構(gòu)造數(shù)字信封要能夠達到以下功能:

  • 保密(對稱加密,RSA公鑰加密)
  • 驗證完整性(MAC值)
  • 驗證身份(簽名)

因此該結(jié)構(gòu)應(yīng)該包含:

  • 明文加密后的密文cryptodata
  • Hash函數(shù)生成的MAC值
  • RSA私鑰加密的簽名值signdata
  • (也應(yīng)該包含證書灼卢,由CA擔(dān)保身份)

1.8 PKCS#8

私鑰封裝格式Private_Key Information Syntax Specification Version 1.2

定義了私鑰信息語法和加密私鑰語法绍哎。
私鑰類型任意,對稱算法可設(shè)置

1.9 PKCS#10

證書請求格式(主題鞋真,公鑰崇堰,私鑰簽名)

RA注冊流程:注冊信息->審核通過->生成密鑰->生成PKCS10請求->將信息和P10請求的公鑰合并成CMP請求->發(fā)送到CA

1.10 PKCS#11

介質(zhì)接口格式:

  • 硬件驅(qū)動
  • 定義文件操作
  • 權(quán)限管理

對應(yīng)于Windows的CSP,國密接口的SKF

1.11 PKCS#12

帶私鑰的個人證書格式涩咖,包含私鑰海诲、證書、證書鏈抠藕、CRL...

1.12 X.509

X.509證書與509黑名單規(guī)范

X.509數(shù)字證書主體如下:

  • 簽名前的證書申請(簽名對象的信息)
  • 數(shù)字簽名的算法(CA對證書簽名使用的算法)
  • 數(shù)字簽名(用于驗證證書的有效性饿肺,使用者使用CA的公鑰使用同種算法對證書簽名,查看和該數(shù)字簽名是否相同)

一個真實的X509數(shù)字證書包含:

  • 證書版本(V3)
  • 證書序列號
  • 簽名算法(sha1RSA)
  • 簽名哈希算法(sha1)
  • 簽名
  • 頒發(fā)者信息
    • CN
    • OU
    • O組織
    • L地點
    • S州
    • C
  • 使用者信息
  • 有效期
  • 公鑰
  • 密鑰用法
    • Key Encipherment, Data Encipherment
    • Digital Signature, Non-Repudiation
  • CRL分發(fā)點
  • 指紋算法
  • 指紋

結(jié)構(gòu)

struct x509_st
{
    X509_CINF *cert_info;
    X509_ALGOR *sig_alg;
    ASN1_BIT_STRING *signature;
    int valid;
    int references; 
    char *name;
    CRYPTO_EX_DATA ex_data;
    long ex_pathlen;
    long ex_pcpathlen;
    unsigned long ex_flags;
    unsigned long ex_kusage;
    unsigned long ex_xkusage;
    unsigned long ex_nscert;
    ASN1_OCTET_STRING *skid;
    struct AUTHORITY_KEYID_st *akid;
    X509_POLICY_CACHE *policy_cache;
#ifndef OPENSSL_NO_SHA
    unsigned char sha1_hash[SHA_DIGEST_LENGTH];
#endif
    X509_CERT_AUX *aux; 
};

以上結(jié)構(gòu)表示一個完整的數(shù)字證書盾似,主要項如下:

  • cert_info:證書主體信息敬辣;
  • sig_alg:簽名算法;
  • signature:簽名值零院,存放CA對該證書采用sig_alg算法簽名的結(jié)果(驗證證書持有者身份時溉跃,使用該CA公鑰對該證書采用sig_alg簽名算法簽名得到signature1,將兩個簽名值比較告抄,若相等撰茎,則表明是通過CA確認(rèn)的證書持有者);
  • valid:是否是合法證書打洼,1 為合法龄糊,0 為未知赡鲜;
  • references:引用次數(shù)哗脖,被引用一次則加一捞挥;
  • name:證書持有者信息該內(nèi)容在調(diào)用 d2i_X509的過程中冶伞,通過回調(diào)函數(shù) x509_cb(crypto/asn1/x_x509.c)調(diào)用 X509_NAME_oneline 來設(shè)置宠哄;

編程接口

DER 編解碼接口由宏在 crypto/asn1/x_x509.c 中實現(xiàn)种蘸,包括各自的new坤溃、free甥郑、i2d 和 d2i 函數(shù):

  • d2i_X509:解碼 DER 編碼的數(shù)字證書
  • PEM_read_bio_X509:從PEM格式的數(shù)字證書中得到X509數(shù)據(jù)結(jié)構(gòu)

1.13 ASN.1

Abstract Syntax Notation One芭毙,抽象語法標(biāo)識筋蓖,是與平臺、語言無關(guān)的數(shù)據(jù)結(jié)構(gòu)定義語法

編碼格式

BER退敦、CER粘咖、DER、XER侈百,可以編碼成XML格式瓮下,不僅僅是常用的二進制流忠聚。
二進制流的TLV方式表達數(shù)據(jù)結(jié)構(gòu),如下:

Identifier octets Type Length octets Length Contents octets Value End-of-contents octets
  Personnel
  Record     Length   Contents
  60         8185
                      Name     Length  Contents
                      61       10
                                       VisibleString  Length  Contents
                                       1A             04      "John"
                                       VisibleString  Length  Contents
                                       1A             01      "P"
                                       VisibleString  Length  Contents
                                       1A             05      "Smith"

                       DateofBirth     Length  Contents
                       A0              0A
                                               Date    Length  Contents
                                               43      08      "19590717"
  • BER: Basic Encoding Rules
    • 基本編碼格式唱捣。
    • 對相同的數(shù)據(jù)两蟀,可以有多種編碼方式,比如長字節(jié)型震缭、短字節(jié)型赂毯、不定長型等。
  • DER: Distinguished Encoding Rules
    • 是BER的一個子集拣宰,為更嚴(yán)格的一個變種版本党涕。
    • 和BER相比,DER的編碼格式只有固定一種巡社。比如BER的Boolean變量編碼值是可以1~255的任意值膛堤,而DER只能是1。
    • DER使用在有數(shù)據(jù)簽名的場合晌该,以保證數(shù)據(jù)原文編碼后可以保持一致肥荔。
    • X.509證書都是DER編碼。
  • CER: Canonical Encoding Rules
    • CER和DER一樣朝群,都是BER的限定編碼規(guī)則的子集燕耿。
    • CER和DER不同在于它是不定長編碼,可以用于大數(shù)據(jù)塊的封裝姜胖。
    • PKCS#7數(shù)字信封可以用DER編碼誉帅,也可以用CER編碼。
  • Privacy Enhanced Mail: 安全增強郵件右莱,通過加密算法蚜锨、證書加密郵件。
    • 更常用的概念是一種文件格式慢蜓,該文件格式使用一個頭亚再、尾標(biāo)識文件的內(nèi)容,以方便解析胀瞪。如下:
    • 被加密的私鑰:
-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----

  • PEM格式的證書:
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
  • PEM格式的PKCS#10證書請求:
-----BEGIN CERTIFICATE REQUEST-----
...
-----END CERTIFICATE REQUEST-----
  • CER针余、DER饲鄙、CRT凄诞、PEM的關(guān)系

    • 所有X.509都是DER編碼,DER是指ASN.1的編碼規(guī)則忍级,.der證書文件一般是二進制文件帆谍。
    • CER可用于PKCS#7證書(p7b)的編碼,但一般是指證書的文件后綴轴咱,.cer證書可以是純BASE64文件或二進制文件汛蝙。
    • PEM通常也是指文件的后綴烈涮,為內(nèi)容使用BASE64編碼且?guī)ь^帶尾的特定格式,二進制的文件不應(yīng)該命名為pem窖剑。
    • CRT是微軟的證書后綴名坚洽,和.CER是一回事。
    • 微軟的CryptAPI很強大西土,證書的各種格式都可以識別讶舰,比如純BASE64編碼的、標(biāo)準(zhǔn)PEM格式的需了、非標(biāo)識PEM格式的(不是64字節(jié)換行跳昼、沒有頭尾等)、二進制格式的肋乍。
    • 但openssl鹅颊、JCE則不行,必須是標(biāo)準(zhǔn)的PEM格式和DER格式墓造。
    • references:
  • PFX

    • Personal Information Exchange
    • PKCS#12是PFX的后續(xù)版本堪伍,一般情況二者為等同概念。
    • PFX或PKCS#12觅闽,是包括私鑰的個人證書杠娱,通過口令保護私鑰。
    • 后綴名為.pfx或.p12
    • 使用openssl谱煤、keytool摊求、Portecle(KeyStore工具)都可以很方便生成PFX證書。
    • references:

1.14 CRL

證書撤銷列表(Certificate Revocation List刘离,簡稱 CRL)室叉,是一種包含撤銷的證書列表的簽名數(shù)據(jù)結(jié)構(gòu)×蛱瑁基本的 CRL 信息有:被撤銷證書序列號茧痕、撤銷時間、撤銷原因恼除、簽名者以及 CRL 簽名等信息踪旷。

被撤銷證書的信息:X509_REVOKED

typedef struct X509_revoked_st
{
    ASN1_INTEGER *serialNumber;
    ASN1_TIME *revocationDate;
    STACK_OF(X509_EXTENSION) *extensions;
    int sequence;
} X509_REVOKED; 
  • serialNumber:被撤銷證書的序列號;
  • revocationDate:撤銷時間豁辉;
  • extensions:擴展項令野,可選;
  • sequence:順序號徽级,用于排序气破,表示當(dāng)前被撤銷證書信息在 crl 中的順序。

crl信息主體:

typedef struct X509_crl_info_st
{
    ASN1_INTEGER *version;
    X509_ALGOR *sig_alg;
    X509_NAME *issuer;
    ASN1_TIME *lastUpdate;
    ASN1_TIME *nextUpdate;
    STACK_OF(X509_REVOKED) *revoked; 
    STACK_OF(X509_EXTENSION) *extensions;
    ASN1_ENCODING enc;
} X509_CRL_INFO;
  • version:crl 版本餐抢;
  • sig_alg:crl 簽名法现使;
  • issuer:簽發(fā)者信息低匙;
  • lastUpdate:上次更新時間;
  • nextUpdate:下次更新時間碳锈;
  • revoked:被撤銷證書信息顽冶;
  • extensions:擴展項,可選售碳。

完整crl數(shù)據(jù)結(jié)構(gòu):

struct X509_crl_st
{
    X509_CRL_INFO *crl;
    X509_ALGOR *sig_alg;
    ASN1_BIT_STRING *signature;
    int references;
} ; 
  • crl:crl 信息主體渗稍;

  • sig_alg:簽名算法,與 X509_CRL_INFO 中的一致团滥;

  • signature:簽名值竿屹;

  • references:引用

附3 LDAP

輕量目錄訪問協(xié)議(Lightweight Directory Access Protocol),運行于TCP/IP之上灸姊。

目錄的信息按照樹型結(jié)構(gòu)組織拱燃,數(shù)據(jù)結(jié)構(gòu):

條目entry->區(qū)別名DN->屬性Attribute->類型Type
                                |
                                ->值Values

附4 OCSP

在線證書狀態(tài)協(xié)議(Online Certificate Status Protocol)

數(shù)據(jù)格式:

  • 協(xié)議版本
  • 服務(wù)請求
  • 目標(biāo)證書標(biāo)識
  • 可能被OCSP響應(yīng)器處理的可選擴展

OCSP響應(yīng)端檢測:

  • 信息正確格式化
  • 響應(yīng)器被配置提供請求服務(wù)而且
  • 請求包含了響應(yīng)器需要的信息,返回一個確定的回復(fù)力惯,OCSP響應(yīng)端回復(fù)的加密消息中包含證書的狀態(tài)可以是’good’,’revoked’或者’unknown’
  • 如果任何一個先決條件沒有滿足碗誉,那么OCSP響應(yīng)器將產(chǎn)生一個錯誤信息,錯誤碼可能包含以下內(nèi)容:
    • 未正確格式化的請求(malformedRequest)
    • 內(nèi)部錯誤(internalError)
    • 請稍后再試(trylater)
    • 需要簽名(sigRequired)
    • 未授權(quán)(unauthorized)

1.15 數(shù)字證書

發(fā)證流程:

  • 申請者將合法的身份信息(參考X509章節(jié))以PKCS#10格式通過SCEP(簡單證書頒發(fā)協(xié)議父晶,工作在HTTP之上)發(fā)送給CA哮缺,
  • CA驗證申請者的合法性,滿足條件就會產(chǎn)生一個合法的證書甲喝,內(nèi)容包括身份信息尝苇、公鑰、CA信息埠胖、CA簽名糠溜、有效時間、序列號直撤、CRL表的下載地址或查詢地址
  • CA使用申請者公鑰將X.509v3加密得到密文格式證書非竿,使用SCEP協(xié)議頒發(fā)給申請者
  • 申請者使用自己的私鑰解密得到X.509v3證書并保存

雙證書:

雙證書即雙密鑰(簽名密鑰對,加密密鑰對)

  • 簽名密鑰對用于數(shù)據(jù)完整性檢測谋竖,保證放偽造與防抵賴红柱,若遺失,不影響以前數(shù)據(jù)的驗證蓖乘。因此不需要第三方管理锤悄。
  • 加密密鑰對用于數(shù)據(jù)的加密保護,若遺失驱敲,將導(dǎo)致之前加密的數(shù)據(jù)無法解密铁蹈。因此加密密鑰對應(yīng)有可信第三方(CA)產(chǎn)生備份宽闲。

(附:我曾今將整理的文件使用一款加密軟件加密众眨,選擇加密密碼的時候由于自己記不住長密碼握牧,又不想將長密碼以任何形式記錄下來,于是決定使用自認(rèn)為固定的文件作為密鑰娩梨,然后當(dāng)再次使用文件解密的時候沿腰,被告知不是該文件。才想起狈定,這個當(dāng)時在我看來是固定的文件颂龙,由于版本需要被我修改了!整理的三個月的文件就這樣脫胎換骨成了0110...)

驗證過程

  1. 拆封證書
  • 目的:獲取證書中的公鑰
  1. 驗證證書鏈
  • 目的:驗證簽發(fā)用戶實體證書的CA是否是權(quán)威可信的CA
  • 操作:使用每級CA的公鑰驗證每級數(shù)字簽名
  1. 驗證序列號
  • 目的:檢查實體證書中的簽名實體序列號是否與簽發(fā)者證書的序列號相一致
  • 操作:用戶實體證書中的Authority Key Identifier擴展項Cert Serial Number,即簽發(fā)證書的序列號與CA證書中的Certificate Serial Number 證書序列號是否一致
  1. 證書廢止列表查詢(黑名單查詢纽什,CRL)
  • 目的:檢查用戶證書是否作廢

2 OpenSSL

2.1 命令行

構(gòu)建數(shù)字證書

主要操作包括產(chǎn)生私鑰(key)措嵌,構(gòu)造證書請求(req),簽發(fā)用戶證書芦缰,自簽發(fā)根證書企巢。

  • 1.產(chǎn)生私鑰(帶密碼保護):openssl genrsa -out mysite.key -des3 -passout pass:123456 1024
  • 2.構(gòu)造證書請求
    • 交互式輸入:openssl req -key mysite.key -passin pass:123456 -new -out mysite.req
    • 非交互式輸入,先編輯配置文件mysite.conf让蕾,然后生成請求:openssl req -key mysite.key -passin pass:123456 -new -config mysite.conf -out mysite.req
  • 3.簽發(fā)用戶證書:openssl x509 -req -in mysite.req -CA testca.pem -CAkey testca.key -out mysite.pem -passin pass:abcdef -CAcreateserial-days指定證書有效期
  • 當(dāng)然浪规,簽發(fā)用戶證書的前提是已經(jīng)自簽發(fā)根證書,先執(zhí)行1,2步生成根證書申請探孝,然后自簽發(fā):openssl x509 -req -in testCA.req -signkey testca.key -out testca.pem -passin pass:abcdef

2.2 編程

對稱算法和摘要算法全局初始化:OpenSSL_add_all_algorithms();

釋放句柄:EVP_MD_CTX_cleanup(&ctx);

2.2.1 加解密

int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, unsigned char *key, unsigned char *iv, int enc)
int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, unsigned char *in, int inl);
int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);

2.2.2 摘要

int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type);
int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt);
int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s);

2.2.3 簽名驗簽(RSA/ECDSA)

EVP_SignInit ( &md_sign_ctx, md )
EVP_SignUpdate(&md_sign_ctx, data, data_cb)
EVP_SignFinal (&md_sign_ctx, sign, psign_cb, pPriKey )

EVP_VerifyInit( &md_verify_ctx, md )
EVP_VerifyUpdate(&md_verify_ctx, data, data_cb)
EVP_VerifyFinal(&md_verify_ctx, sign, sign_cb, pPubKey)

2.2.4 公鑰加密與私鑰解密(RSA算法)

int EVP_PKEY_encrypt    (   EVP_PKEY_CTX *  ctx, unsigned char *    out, size_t *   outlen, const unsigned char *   in, size_t  inlen ) 

2.2.5 PKCS7簽名驗簽(RSA/ECDSA)

p7 = PKCS7_sign(x, pPriKey, NULL, in, PKCS7_BINARY)
PKCS7_verify(p7, NULL, NULL, in, NULL, PKCS7_BINARY|PKCS7_NOVERIFY)

2.2.6 PKCS7數(shù)字信封加密解密(RSA)

p7 = PKCS7_encrypt(certs, in, EVP_des_cbc(), PKCS7_BINARY)
PKCS7_decrypt(p7, pPriKey, x, out, PKCS7_BINARY)

2.2.7解密公司的加密郵件(SMIME)

公司加密郵件為標(biāo)準(zhǔn)SMIME格式笋婿,導(dǎo)出后得到.eml文件
使用PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont)將bio讀取到的SMIME格式保存在PKCS7格式內(nèi),然后通過PKCS7_dncrypt接口解密

2.2.8錯誤處理

錯誤處理應(yīng)該盡可能多的包含各種信息顿颅,包括:

  • 錯誤碼缸濒;
  • 出錯文件以及行號;
  • 錯誤原因粱腻;
  • 出錯函數(shù)绍填;
  • 出錯庫;
  • 出錯模塊與類別信息栖疑;
  • 錯誤堆棧信息等讨永。

ERR_get_error獲取第一個錯誤號

ERR_error_string根據(jù)錯誤碼獲取具體的錯誤信息,包括出錯的庫遇革、出錯的函數(shù)以及出錯原因

ERR_print_errors_fp將錯誤打印到FILE中

3 SSL與TLS協(xié)議

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卿闹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子萝快,更是在濱河造成了極大的恐慌锻霎,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揪漩,死亡現(xiàn)場離奇詭異旋恼,居然都是意外死亡,警方通過查閱死者的電腦和手機奄容,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門冰更,熙熙樓的掌柜王于貴愁眉苦臉地迎上來产徊,“玉大人,你說我怎么就攤上這事蜀细≈弁” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵奠衔,是天一觀的道長谆刨。 經(jīng)常有香客問我,道長归斤,這世上最難降的妖魔是什么痊夭? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮脏里,結(jié)果婚禮上生兆,老公的妹妹穿的比我還像新娘。我一直安慰自己膝宁,他們只是感情好鸦难,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著员淫,像睡著了一般合蔽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上介返,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天拴事,我揣著相機與錄音,去河邊找鬼圣蝎。 笑死刃宵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的徘公。 我是一名探鬼主播牲证,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼关面!你這毒婦竟也來了坦袍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤等太,失蹤者是張志新(化名)和其女友劉穎捂齐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缩抡,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡奠宜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片压真。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡娩嚼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出榴都,到底是詐尸還是另有隱情待锈,我是刑警寧澤漠其,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布嘴高,位于F島的核電站,受9級特大地震影響和屎,放射性物質(zhì)發(fā)生泄漏拴驮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一柴信、第九天 我趴在偏房一處隱蔽的房頂上張望套啤。 院中可真熱鬧,春花似錦随常、人聲如沸潜沦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唆鸡。三九已至,卻和暖如春枣察,著一層夾襖步出監(jiān)牢的瞬間争占,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工序目, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留臂痕,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓猿涨,卻偏偏與公主長得像握童,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子叛赚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容