golang解析数字证书
发布时间:2020-12-16 18:14:05 所属栏目:大数据 来源:网络整理
导读:golang解析数字证书 基础知识 在解析数字证书之前我们要学习一下数字证书的知识,明白一下数字证书中的一些概念。 下面这些知识是你所要了解的,PKCS#8、 PKCS#1、Certificate Chan、Openssl 将PKCS#1和PKCS#8进行转换 等等,基础我就不多聊了下面给几篇文章
golang解析数字证书基础知识
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")
}
附上代码下载地址: 代码下载 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |