天天看點

數字證書及go解析證書

數字證書基本介紹

  • 由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)

}
           

繼續閱讀