当前位置:网站首页>基於GO語言實現的X.509證書
基於GO語言實現的X.509證書
2022-07-07 00:17:00 【biyezuopinvip】
資源下載地址:https://download.csdn.net/download/sheziqiong/85926996
資源下載地址:https://download.csdn.net/download/sheziqiong/85926996
一、X.509證書描述
在密碼學中,X.509是公鑰證書的格式標准,在許多互聯網協議中得到應用。X.509對公鑰證書的格式,撤銷證書列錶(CRLs),證書驗證路徑算法等進行了規定。
一個X.509證書中包含了其版本號,證書序列號,簽名算法,簽發者,證書主體,有效期,公鑰,公鑰密鑰等信息。證書中的信息使用 ASN.1進行編碼,ASN.1中數據以tag,長度,值的方式進行編碼。證書的基本結構在RFC 5280中4.1節進行了如下的規定:
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue 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 v2 or v3
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
extensions [3] EXPLICIT Extensions OPTIONAL
-- If present, version MUST be v3
}
(證書主體,包含版本號,序列號,簽名算法標識,簽發者信息,有效期,證書主體,證書公鑰信息,簽發者 ID,主體 ID 以及擴展段)
Version ::= INTEGER { v1(0), v2(1), v3(2) }
(證書版本,值可為0,1,2,分別代錶版本1,2,3)
CertificateSerialNumber ::= INTEGER
(證書序列號)
Validity ::= SEQUENCE {
notBefore Time,
notAfter Time
}
(證書有效期,由開始和結束時間組成)
Time ::= CHOICE {
utcTime UTCTime,
generalTime GeneralizedTime
}
UniqueIdentifier ::= BIT STRING
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING
}
(公鑰信息包含公鑰算法和公鑰數據)
Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING
-- contains the DER encoding of an ASN.1 value
-- corresponding to the extension type identified
-- by extnID
}
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
二、讀取 X.509證書
提交的程序中使用 Go 語言編寫讀取 X.509的程序,調用了 Go 語言的encoding/asn1庫進行 ASN.1編碼內容的讀取以及crypto/x509/pkix庫進行對簽發者與證書主體信息的讀取。
在代碼中根據上面的 X.509證書結構定義了如下的結構體用於ASN.1讀取:
- CertificateData, 對應上述結構中的 Certificate:
type CertificateData struct {
TBSCertificate tbsCertificate
SignatureAlgorithm AlgorithmIdentifier
SignatureValue asn1.BitString
}
- TbsCertificate, 對應上述結構中的 TBSCertificate:
type tbsCertificate struct {
Version int `asn1:"optional,explicit,default:0,tag:0"`
SerialNumber *big.Int
Signature AlgorithmIdentifier
Issuer asn1.RawValue
Validity timeSpan
Subject asn1.RawValue
PublicKey publicKeyInfo
UniqueId asn1.BitString `asn1:"optional,tag:1"`
SubjectUniqueId asn1.BitString `asn1:"optional,tag:2"`
Extensions []extension `asn1:"optional,explicit,tag:3"`
}
- timeSpan, 對應上述結構的Validity:
type timeSpan struct {
NotBefore, NotAfter time.Time
}
- publicKeyInfo, 對應上述的 SubjectPublicKeyInfo:
type publicKeyInfo struct {
Algorithm AlgorithmIdentifier
PublicKey asn1.BitString
}
- extension, 對應上述結構的Extension
type extension struct {
ExtnID asn1.ObjectIdentifier
Critical bool `asn1:"default:false"`
ExtnValue []byte
}
- AlgorithmIdentifier, 對應上述的 AlgorithmIdentifier:
type AlgorithmIdentifier struct {
Algorithm asn1.ObjectIdentifier
Parameters asn1.RawValue `asn1:"optional"`
}
三、程序結構簡述
提交的代碼中包含三個代碼文件:x509cert/certificate.go 為證書結構體的定義以及對證書中算法的識別函數,並定義了如下的certInfo 結構方便其他代碼獲取證書信息:
type CertInfo struct {
Version int
Serial *big.Int
Signature AlgorithmIdentifier
Issuer IssuerType
Validity timeSpan
Subject IssuerType
PublicKey publicKeyInfo
UniqueId asn1.BitString
SubjectUniqueId asn1.BitString
Extensions []extension
SignatureAlgorithm AlgorithmIdentifier
SignatureValue asn1.BitString
}
type IssuerType struct {
Country string
Province string
City string
Organization string
Unit string
}
x509cert/static.go 文件包含了證書讀取過程中的一些靜態數據如算法的名稱與 oid 等。
main.go 文件包含程序的主函數,將根據 pem 格式或 DER 格式讀取文件並將證書信息打印至標准輸出。
四、程序編譯運行結果
程序使用go 進行編譯,在代碼目錄下執行命令go build –o x509即可編譯生成命名為 x509的可執行文件。提交的 bin 文件夾中已包含了使用go1.11.1編譯獲得的 Windows,MacOS 以及 Linux 下的可執行文件。
程序的使用方法為:
./x509 [--DER] filename
其中若指定了 DER 選項,則程序將會使用 DER 方式讀取證書,若未指定則程序會使用 PEM 方式讀取證書。
測試運行使用的證書使用 openssl 生成自簽名根證書,命令如下:
openssl req -new -x509 -days 365 -keyout rsa.key -out rsa.pem
命令執行後需要輸入證書主體信息:
使用該命令會使用RSA 算法簽名生成有效期為365天的根證書,使用系統自帶證書工具查看證書信息如下:
使用如下命令將上面命令生成的 pem 證書轉換為DER 證書進行測試:
openssl x509 -in rsa.pem -outform der -out rsa.crt
轉換後生成 rsa.crt 證書文件,查看結果與原證書相同。
使用如下命令生成ECDSA簽名算法的證書用於測試:
openssl ecparam -name secp256k1 -genkey -param_enc explicit -out ecparam.pem
openssl req -new -x509 -key ecparam.pem -out ec.pem -days 365
輸入證書主體信息後生成證書:
使用編寫的程序在證書目錄下執行的效果如圖:
- rsa.pem
./…/bin/x509-darwin-amd64 rsa.pem
程序顯示內容為證書的版本號,序列號,簽名算法,簽發者,主體,有效期,公鑰信息,RSA 公鑰數據以及證書簽名,與系統工具顯示的證書內容相同。
- 使用 DER 證書文件進行讀取的結果如圖:
與 PEM 模式下證書讀取獲得的結果相同。
- 讀取ecdsa 加密的證書結果如下:
與生成證書時的信息相同。
資源下載地址:https://download.csdn.net/download/sheziqiong/85926996
資源下載地址:https://download.csdn.net/download/sheziqiong/85926996
边栏推荐
猜你喜欢
DAY THREE
Cas d'essai fonctionnel universel de l'application
GPIO简介
Devops can help reduce technology debt in ten ways
2022 latest blind box mall complete open source operation source code / docking visa free payment interface / building tutorial
What is AVL tree?
37 pages Digital Village revitalization intelligent agriculture Comprehensive Planning and Construction Scheme
自动化测试工具Katalon(Web)测试操作说明
app通用功能测试用例
【精品】pinia 基于插件pinia-plugin-persist的 持久化
随机推荐
DAY FIVE
Introduction au GPIO
华为mate8电池价格_华为mate8换电池后充电巨慢
【2022全网最细】接口测试一般怎么测?接口测试的流程和步骤
okcc呼叫中心的订单管理时怎么样的
微信小程序uploadfile服务器,微信小程序之wx.uploadFile[通俗易懂]
《LaTex》LaTex数学公式简介「建议收藏」
DAY FOUR
GPIO简介
Random类的那些事
37 pages Digital Village revitalization intelligent agriculture Comprehensive Planning and Construction Scheme
iMeta | 华南农大陈程杰/夏瑞等发布TBtools构造Circos图的简单方法
Google, Baidu and Yahoo are general search engines developed by Chinese companies_ Baidu search engine URL
基于SSM框架实现的房屋租赁管理系统
TypeScript中使用类型别名
MySQL主从之多源复制(3主1从)搭建及同步测试
2022年PMP项目管理考试敏捷知识点(9)
【自动化测试框架】关于unittest你需要知道的事
DAY TWO
准备好在CI/CD中自动化持续部署了吗?