數字證書基本介紹
- 由CA簽發,證明證書持有人身份的,包含證書持有人公鑰,及其他認證資訊(DN)的實體。
- 證書 = 中繼資料(資訊)+簽名密文(對資訊的摘要,使用CA私鑰加密)
- 證書内容
- 證書的版本資訊
- 證書的序列号,每個證書都有一個唯一的證書序列号
- 證書所使用的簽名算法
- 證書的發行機構名稱
- 證書的有效期,UTC時間格式
- 證書所有人的名稱
- 證書所有人的公開密鑰
- 證書發行者對證書的簽名
- 證書鍊
- 以根CA,向下多級擴充
- 證書鍊上的證書,簽發驗簽逐級進行
證書簽發(openssl)
- 準備RSA私鑰(作為CA私鑰):
- openssl genrsa -out rsa_private.key 2048
- 建立證書請求:
- openssl req -new -key rsa_private.key -out user.req
- 使用私鑰自簽(當作根CA,使用CA的私鑰)
- openssl x509 -req -days 3650 -signkey rsa_private.key -in user.req -out cert.pem
- 檢視證書内容
- openssl x509 -in cert.pem -text
go 解析證書
package main
import (
"crypto/x509"
"encoding/pem"
"fmt"
"io/ioutil"
)
func main() {
//讀驗證書并解碼
pemTmp, err := ioutil.ReadFile("cert.pem")
if err != nil {
fmt.Println(err)
return
}
certBlock, restBlock := pem.Decode(pemTmp)
if certBlock == nil {
fmt.Println(err)
return
}
//可從剩餘判斷是否有證書鍊等,繼續解析
fmt.Println(restBlock)
//證書解析
certBody, err := x509.ParseCertificate(certBlock.Bytes)
if err != nil {
fmt.Println(err)
return
}
//可以根據證書結構解析
fmt.Println(certBody.SignatureAlgorithm)
fmt.Println(certBody.PublicKeyAlgorithm)
}