golang解析數字證書
基礎知識
在解析數字證書之前我們要學習一下數字證書的知識,明白一下數字證書中的一些概念。
下面這些知識是你所要了解的,PKCS#8、 PKCS#1、Certificate Chan、Openssl 將PKCS#1和PKCS#8進行轉換 等等,基礎我就不多聊了下面給幾篇文章用於快速掃盲:pkcs1與pkcs8格式RSA私鑰互相轉換
證書鏈-Digital Certificates
數字證書、公鑰和私鑰這三者之間的關係是什麼
證書鏈-Digital Certificates
數字簽名是什麼?
PKCS簡介
golang解析數字證書和PKCS#1&PKCS#8格式的私鑰
直接貼代碼,下面代碼以及我生成的證書、PKCS#1、pkcs#8格式的私鑰連同項目一起打包在後面
package main
import (
// "crypto/rsa"
"crypto/tls"
"crypto/x509"
"encoding/pem"
"fmt"
"io/ioutil"
)
func parseCert(crt, privateKey string) *tls.Certificate {
var cert tls.Certificate
//加載PEM格式證書到字節數組
certPEMBlock, err := ioutil.ReadFile(crt)
if err != nil {
return nil
}
//獲取下一個pem格式證書數據 -----BEGIN CERTIFICATE----- -----END CERTIFICATE-----
certDERBlock, restPEMBlock := pem.Decode(certPEMBlock)
if certDERBlock == nil {
return nil
}
//附加數字證書到返回
cert.Certificate = append(cert.Certificate, certDERBlock.Bytes)
//繼續解析Certifacate Chan,這裏要明白證書鏈的概念
certDERBlockChain, _ := pem.Decode(restPEMBlock)
if certDERBlockChain != nil {
//追加證書鏈證書到返回
cert.Certificate = append(cert.Certificate, certDERBlockChain.Bytes)
fmt.Println("存在證書鏈")
}
//讀取RSA私鑰進文件到字節數組
keyPEMBlock, err := ioutil.ReadFile(privateKey)
if err != nil {
return nil
}
//解碼pem格式的私鑰------BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----
keyDERBlock, _ := pem.Decode(keyPEMBlock)
if keyDERBlock == nil {
return nil
}
//打印出私鑰類型
fmt.Println(keyDERBlock.Type)
fmt.Println(keyDERBlock.Headers)
var key interface{}
var errParsePK error
if keyDERBlock.Type == "RSA PRIVATE KEY" {
//RSA PKCS1
key, errParsePK = x509.ParsePKCS1PrivateKey(keyDERBlock.Bytes)
} else if keyDERBlock.Type == "PRIVATE KEY" {
//pkcs8格式的私鑰解析
key, errParsePK = x509.ParsePKCS8PrivateKey(keyDERBlock.Bytes)
}
if errParsePK != nil {
return nil
} else {
cert.PrivateKey = key
}
//第一個葉子證書就是我們https中使用的證書
x509Cert, err := x509.ParseCertificate(certDERBlock.Bytes)
if err != nil {
fmt.Println("x509證書解析失敗")
return nil
} else {
switch x509Cert.PublicKeyAlgorithm {
case x509.RSA:
{
fmt.Println("Plublic Key Algorithm:RSA")
}
case x509.DSA:
{
fmt.Println("Plublic Key Algorithm:DSA")
}
case x509.ECDSA:
{
fmt.Println("Plublic Key Algorithm:ECDSA")
}
case x509.UnknownPublicKeyAlgorithm:
{
fmt.Println("Plublic Key Algorithm:Unknow")
}
}
}
return &cert
}
func main() {
fmt.Println("---------pkcs8 private key ---------------")
parseCert("./server.crt", "pkcs8_server.key")
fmt.Println("---------pkcs1 private key ---------------")
parseCert("./server.crt", "server.key")
}
附上代碼下載地址: 代碼下載
最近在寫基於golang的https和https反向代理服務,ActivedRouter,大家可以去github 幫我start一下謝謝, 萬分感謝。