亚洲av超清无码不卡在线网络,又粗又猛又黄又爽无遮挡,亚洲AV综合AV成人小说,成人免费毛片AAAAAA片

歡迎來(lái)到黑龍江省數(shù)字證書(shū)認(rèn)證有限公司官方網(wǎng)站

數(shù)字證書(shū)

什么是.X509及如何解析X509證書(shū)

作者:admin 發(fā)布時(shí)間:2017-12-03

x509


  X.509是一種非常通用的證書(shū)格式。所有的證書(shū)都符合ITU-T X.509國(guó)際標(biāo)準(zhǔn);因此(理論上)為一種應(yīng)用創(chuàng)建的證書(shū)可以用于任何其他符合X.509標(biāo)準(zhǔn)的應(yīng)用。在一份證書(shū)中,必須證明公鑰及其所有者的姓名是一致的。對(duì)X.509證書(shū)來(lái)說(shuō),認(rèn)證者總是 CA或由CA指定的人,一份X.509證書(shū)是一些標(biāo)準(zhǔn)字段的集合,這些字段包含有關(guān)用戶或設(shè)備及其相應(yīng)公鑰的信息。X.509標(biāo)準(zhǔn)定義了證書(shū)中應(yīng)該包含哪些信息,并描述了這些信息是如何編碼的(即數(shù)據(jù)格式),所有的X.509證書(shū)包含以下數(shù)據(jù): 1、X.509版本號(hào):指出該證書(shū)使用了哪種版本的X.509標(biāo)準(zhǔn),版本號(hào)會(huì)影響證書(shū)中的一些特定信息。目前的版本是3。
 
  2、證書(shū)持有人的公鑰:包括證書(shū)持有人的公鑰、算法(指明密鑰屬于哪種密碼系統(tǒng))的標(biāo)識(shí)符和其他相關(guān)的密鑰參數(shù)。
 
  3、證書(shū)的序列號(hào):由CA給予每一個(gè)證書(shū)分配的唯一的數(shù)字型編號(hào),當(dāng)證書(shū)被取消時(shí),實(shí)際上是將此證書(shū)序列號(hào)放入由CA簽發(fā)的CRL(Certificate Revocation List證書(shū)作廢表,或證書(shū)黑名單表)中。這也是序列號(hào)唯一的原因。
 
  4、主題信息:證書(shū)持有人唯一的標(biāo)識(shí)符(或稱DN-distinguished name)這個(gè)名字在 Internet上應(yīng)該是唯一的。DN由許多部分組成,看起來(lái)象這樣:
 
  CN=Bob Allen, OU=Total Network Security Division
 
  O=Network Associates, Inc.
 
  C=US
 
  這些信息指出該科目的通用名、組織單位、組織和國(guó)家或者證書(shū)持有人的姓名、服務(wù)處所等信息。
 
  5、證書(shū)的有效期:證書(shū)起始日期和時(shí)間以及終止日期和時(shí)間;指明證書(shū)在這兩個(gè)時(shí)間內(nèi)有效。
 
  6、認(rèn)證機(jī)構(gòu):證書(shū)發(fā)布者,是簽發(fā)該證書(shū)的實(shí)體唯一的CA的X.500名字。使用該證書(shū)意味著信任簽發(fā)證書(shū)的實(shí)體。(注意:在某些情況下,比如根或頂級(jí)CA證書(shū),發(fā)布者自己簽發(fā)證書(shū))
 
  7、發(fā)布者的數(shù)字簽名:這是使用發(fā)布者私鑰生成的簽名,以確保這個(gè)證書(shū)在發(fā)放之后沒(méi)有被撰改過(guò)。
 
  8、簽名算法標(biāo)識(shí)符:用來(lái)指定CA簽署證書(shū)時(shí)所使用的簽名算法。算法標(biāo)識(shí)符用來(lái)指定CA簽發(fā)證書(shū)時(shí)所使用的公開(kāi)密鑰算法和HASH算法。
 
  X.509證書(shū)格式
 
   為了利用公共密鑰這種密碼系統(tǒng),必須將公共密鑰分發(fā)出去。最通用的一種簽名證書(shū)格式被稱為X.509格式。X.509格式的證書(shū)被VeriSign、微軟、網(wǎng)景和其他許多公司廣泛應(yīng)用于對(duì)電子郵件消息進(jìn)行簽名,對(duì)程序代碼進(jìn)行認(rèn)證,以及對(duì)許多其他類型的數(shù)據(jù)進(jìn)行認(rèn)證等等。X.509標(biāo)準(zhǔn)是由國(guó)際電話標(biāo)準(zhǔn)機(jī)構(gòu),即國(guó)際電報(bào)電話咨詢委員會(huì)(CCITT)提出的用于目錄服務(wù)的X.500系列建議的組成部分。
 
  X.509證書(shū)的具體結(jié)構(gòu)是用一種形式化表示來(lái)描述的,稱為"抽象語(yǔ)法表示法#1"(abstract syntax notation)即ASN.1。圖9-13顯示了第三版X.509格式的ASN.1定義。雖然具體的語(yǔ)法對(duì)我們并不重要,但是你可以看到,ASN.1為證書(shū)文件的結(jié)構(gòu)給出了精確的定義。"基本編碼規(guī)則"(basic encoding rules),即BER,精確地描述了如何將該結(jié)構(gòu)保存為二進(jìn)制文件。也就是說(shuō),BER描述了如何對(duì)整數(shù)、字符串、位串以及諸如SEQUENCE、CHOICE和OPTIONAL的結(jié)構(gòu)進(jìn)行編碼的方法。
 
  
[Certificate ::= SEQUENCE {
 
  tbsCertificate TBSCertificate,
 
  signatureAlgorithm AlgorithmIdentifier,
 
  signature BIT STRING
 
  }
 
  TBSCertificate ::= SEQUENCE {
 
  version [0] EXPLICIT Version DEFAULT v1,
 
  serialNumber CertificateSerialNumber,
 
  signature AlgorithmIdentifier,
 
  issuer Name,
 
  validity Validity,
 
  subject Name,
 
  subjectPublicKeyInfo SubjectPublicKeyInfo,
 
  issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
 
  -- If present, version must be v2or v3
 
  subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
 
  -- If present, version must be v2or v3
 
  extensions [3] EXPLICIT Extensions OPTIONAL
 
  -- If present, version must be v3
 
  }
 
  Version ::= INTEGER {
 
  v1(0), v2(1), v3(2)
 
  }
 
  CertificateSerialNumber ::= INTEGER
 
  Validity ::= SEQUENCE {
 
  notBefore CertificateValidityDate,
 
  notAfter CertificateValidityDate
 
  }
 
  CertificateValidityDate ::= CHOICE {
 
  utcTime UTCTime,
 
  generalTime GeneralizedTime
 
  }
 
  UniqueIdentifier ::= BIT STRING
 
  SubjectPublicKeyInfo ::= SEQUENCE {
 
  algorithm AlgorithmIdentifier,
 
  subjectPublicKey BIT STRING
 
  }
 
  Extensions ::= SEQUENCE OF Extension
 
  Extension ::= SEQUENCE {
 
  extnID OBJECT IDENTIFIER,
 
  critical BOOLEAN DEFAULT FALSE,
 
  extnValue OCTET STRING
 
  }
 
  解析X509證書(shū)
 
  1.從磁盤上的證書(shū)文件中讀取證書(shū)數(shù)據(jù)
 
  unsigned char* pbX509Data; // 證書(shū)數(shù)據(jù)
 
  unsigned long ulX509DataLen; // 證書(shū)數(shù)據(jù)長(zhǎng)度
 
  2.獲取CertContext
 
  PCCERT_CONTEXT pCertContext = CertCreateCertificateContext(X509_ASN_ENCODING, pbX509Data, ulX509DataLen);
 
  3.獲取證書(shū)信息
 
  pCertContext->pCertInfo->dwVersion; // 證書(shū)版本號(hào)
 
  CRYPT_INTEGER_BLOB snBlob = pCertContext->pCertInfo->SerialNumber; // 證書(shū)SN
 
  CERT_NAME_BLOB issuerBlob = pCertContext->pCertInfo->Issuer; // 證書(shū)頒發(fā)者
 
  CERT_NAME_BLOB subjectBlob = pCertContext->pCertInfo->Subject; // 證書(shū)主題
 
  // 證書(shū)有效起始日期
 
  SYSTEMTIME sysTime;
 
  memset(&sysTime, 0, sizeof(sysTime));
 
  FileTimeToSystemTime(&pCertContext->pCertInfo->NotBefore, &sysTime);
 
  char szTime[128] = {0};
 
  sprintf_s(szTime, 128, "%d年%d月%d日 %d:%d:%d", sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
 
  // 證書(shū)有效終止日期
 
  memset(&sysTime, 0, sizeof(sysTime));
 
  FileTimeToSystemTime(&pCertContext->pCertInfo->NotAfter, &sysTime);
 
  memset(szTime, 0, sizeof(szTime));
 
  sprintf_s(szTime, 128, "%d年%d月%d日 %d:%d:%d", sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
 
  4.創(chuàng)建臨時(shí)密鑰容器
 
  HCRYPTPROV hTmpProv = NULL;
 
  CryptAcquireContext(&hTmpProv, "My_Temporary_Container", NULL, PROV_RSA_AES, 0); // NULL表示使用系統(tǒng)默認(rèn)CSP
 
  5.向容器中導(dǎo)入公鑰,獲取公鑰句柄
 
  HCRYPTKEY hKey = NULL;
 
  CERT_PUBLIC_KEY_INFO certPubKeyInfo = pCertContext->pCertInfo->SubjectPublicKeyInfo;
 
  CryptImportPublicKeyInfo(hTmpProv, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, &certPubKeyInfo, &hKey);
 
  6.導(dǎo)出公鑰(最好采用二次調(diào)用方式)
 
  unsigned char* pBuf = NULL;
 
  unsigned long ulBufLen = 0;
 
  CryptExportKey(hKey, 0, PUBLICKEYBLOB, 0, pBuf, &ulBufLen);
 
  pBuf = new unsigned char[ulBufLen];
 
  memset(pBuf, 0, ulBufLen);
 
  CryptExportKey(hKey, 0, PUBLICKEYBLOB, 0, pBuf, &ulBufLen);
 
  7.獲取公鑰信息
 
  unsigned char* p = pBuf + sizeof(PUBLICKEYSTRUC);
 
  (*(RSAPUBKEY*)p).bitlen; // 公鑰模長(zhǎng)(以bit為單位)
 
  (*(RSAPUBKEY*)p).pubexp; // 公鑰的e(注意字節(jié)順序)
 
  p += sizeof(RSAPUBKEY); // 公鑰的n(注意字節(jié)順序)
 
  8.清理工作
 
  delete[] pBuf;
 
  pBuf = NULL;
 
  CryptDestroyKey(hKey);
 
  CryptReleaseContext(hTmpProv, 0);
 
  CertFreeCertificateContext(pCertContext);