开发者社区> usher.yue> 正文

golang解析数字证书

简介: golang解析数字证书 基础知识 在解析数字证书之前我们要学习一下数字证书的知识,明白一下数字证书中的一些概念。 下面这些知识是你所要了解的,PKCS#8、 PKCS#1、Certificate Chan、Openssl 将PKCS#1和PKCS#8进行...
+关注继续查看

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一下谢谢, 万分感谢。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何使用go做命令行flag解析
如何使用go做命令行flag解析
15 0
Go ---Go语言高级编程中订阅/发布模型例子解析
Go ---Go语言高级编程中订阅/发布模型例子解析
37 0
Go语言——快速使用Markdown解析库
Go语言——快速使用Markdown解析库
79 0
Go语言之自定义模板,函数体解析到HTML模板
Go语言之自定义模板,函数体解析到HTML模板
71 0
从源码的角度看Go语言flag库如何解析命令行参数!
从源码的角度看Go语言flag库如何解析命令行参数
81 0
三分钟学 Go 语言——函数深度解析(下) 可变参数
三分钟学 Go 语言——函数深度解析(下) 可变参数
30 0
三分钟学 Go 语言——函数深度解析(中)
三分钟学 Go 语言——函数深度解析(中)
42 0
三分钟学Go语言——函数深度解析(上)
三分钟学Go语言——函数深度解析(上)
50 0
三分钟学 Go 语言——range深度解析
三分钟学 Go 语言——range深度解析
33 0
【力扣】1106. 解析布尔表达式(C++/Go 栈的应用)
【力扣】1106. 解析布尔表达式(C++/Go 栈的应用)
37 0
【Golang实战】——XPath解析网页
【Golang实战】——XPath解析网页
130 0
知识分享之Golang——Bleve官方案例解析
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
88 0
知识分享之Golang——go mod常用命令解析
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
83 0
知识分享之Golang——Bleve的NewIndexMapping解析
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
51 0
Go 网络库 Gnet 解析
Go 网络库 Gnet 解析
172 0
+关注
usher.yue
算法相关技术专家
文章
问答
视频
相关电子书
更多
Go构建日请求千亿级微服务实践
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关镜像