golang解析数字证书

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

时间: 2024-09-21 14:03:51

golang解析数字证书的相关文章

阿里云服务器LAMP环境搭建及Let’s Encrypt数字证书配置

阿里云服务器LAMP环境搭建及Let's Encrypt数字证书配置 云主机供应商:阿里云服务器ESC 云数据库供应商:阿里云RDS 服务器系统:Ubuntu 16.04 64位 服务器登录软件:WinSCP 服务器管理终端(SSH):Xshell 5(此工具可以复制.粘贴需要的代码) 因使用了阿里云便于管理数据的云数据库,本实例仅仅安装Apache.PHP. 1.通过SSH终端登录服务器并安装Apache $ sudo apt-get update(更新系统安装源) $ sudo apt-ge

全域数字证书详解二---------------身份标识

问题描述 数字证书安全产品当前使用状况目前使用的数字证书产品,基本是在作为安全产品使用.大部分只是用到了非对称算法,产生数字签名,验证签名,以保证原文信息不被篡改.当前身份信任域问题每个人在现实世界中,都有作为一个自然人的身份认可,例如:张三,在现实生活中大家都知道你是张三,承认你是张三的身份,只要你本人拿着"张三"的身份证,就可以去办理诸多服务.而在虚拟网络中却没有一个可以真正作为身份的象征.现在大部分网站采用的都是"userName"和"passwor

数字证书怎么在webseal中使用

问题描述 我看是用cert方式可以去webseal认证,但是格式要求比较严格,不知道IBM是怎么对证书进行解析的. 解决方案 解决方案二:一般来说数字证书在国内使用较多第三方认证机构如iTruschina他们这方面做的比较多要不咨询一下他们吧解决方案三:通过IBM的GSK

在ASP/ASP.NET 中处理客户端数字证书

asp.net|客户端    客户端数字证书与基本身份验证(Basic).域服务器的摘要式身份验证.集成 Windows 身份认证或自定义的 Form 认证等方式相比,虽然部署和管理方面稍微复杂一些,但安全性也更好一些,应用上也较为灵活.  在 ASP 和 ASP.NET 中处理和识别客户端数字证书是非常容易的,代码如下: ASP (VBscript)语法:     Dim subject   subject=Request.ServerVariables("CERT_SUBJECT"

C#编程总结(十一)数字证书

这里来讲述数字证书的概念.作用.工作原理以及具体应用.希望能够给大家一个清晰的认识. 一.概念 数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在Internet上验证通信实 体身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证.它是由一个由权威机构-----CA机 构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份. 数字证书是一种数字标识,提供用户在互联网上的身份认证,它是一个经证书授权中心数字签名的包含

在ASP及ASP.NET中处理客户端数字证书

客户端数字证书与基本身份验证(Basic).域服务器的摘要式身份验证.集成 Windows 身份认证或自定义的 Form 认证等方式相比,虽然部署和管理方面稍微复杂一些,但安全性也更好一些,应用上也较为灵活. 在 ASP 和 ASP.NET 中处理和识别客户端数字证书是非常容易的,代码如下: ASP (VBscript)语法: Dim subject   subject=Request.ServerVariables("CERT_SUBJECT") 或   subject=Reques

木马很猖狂:网银大盗开始攻数字证书

昨天,中国金融认证中心(CFCA)副总经理曹小青透露,据CFCA的最新监控发现,网银大盗对网银的攻击手段.技术有加快更新的趋势,已经从攻击密码转向攻击数字证书.网银用户如果只将数字证书下载后存放在电脑的IE浏览器上,那么其网银账户仍存在风险---数字证书可能因电脑染上木马病毒而被盗取. CFCA监测发现,目前网上银行交易面临的不安全隐患主要有两种:一种是在未申请数字证书的前提下,网银用户密码被盗取,导致资金被盗:另一种是,虽然申请了数字证书,但由于没有妥善保管,被网银大盗用木马病毒攻破载有数字证

Java安全通信、数字证书及应用实践

摘要: 在本文中,我用详细的语言和大量的图片及完整的程序源码向你展示了在 JAVA中如何实现通过消息摘要.消息验证码达到安全通信.以及用Java的工具生成数字证书,和用程序给数字证书签名.以及用签名后的数学证书签名applet突破applet的访问权限的过程,给出了全部例子的详细代码. 通过本文中你可以学到以下知识: ● 程序间如何安全通信 ● 什么是 及 如何生成消息摘要 ● 什么是 及 如何生成消息验证码 ● 如何使用 Java工具生成和维护数字证书库 ● 如何用程序给数字证书验证签名 ●

win8上安装win7系统提示无法验证winloader数字证书

如果你在重新安装win7系统之后重启电脑提示的话,那么还是老方法,先将电脑重新启动下,查看是否还有提示无法验证winloader数字证书.如果没有的话,说明故障就解除了. 但是如果故障依旧的话,建议你去买一张windows的系统安装光盘,将光盘插入驱动盘中,然后将电脑重新启动,之后在电脑重启之后对电脑进行修复处理,会弹出一个窗口,在窗口上选择"修复计算机",选择修复工具,修复完成后在查看电脑重启还会不会出现提示的现象.或者是将电脑重启,然后在按住F8键,再之后弹出的窗口上选择"