Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Golang1.7.3使用x509标准库创建自签名证书和签发名其他证书大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
代码:
package rsa

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/x509"
    "crypto/x509/pkix"
    "encoding/pem"
    "io/IoUtil"
    "math/big"
    rd "math/rand"
    "os"
    "time"
)

func init() {
    rd.Seed(time.Now().UnixNano())
}

type CerTinformation struct {
    Country            []String
    Organization       []String
    OrganizationalUnit []String
    EmailAddress       []String
    province           []String
    Locality           []String
    CommonName         String
    CrtName,KeyName   String
    IsCA               bool
    Names              []pkix.AttributeTypeAndValue
}

func CreateCRT(RootCa *x509.Certificate,RootKey *rsa.PrivateKey,info CerTinformation) error {
    Crt := newCertificate(info)
    Key,err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        return err
    }

    var buf []byte
    if RootCa == nil || RootKey == nil {
        //创建自签名证书
        buf,err = x509.CreateCertificate(rand.Reader,Crt,&Key.PublicKey,Key)
    } else {
        //使用根证书签名
        buf,RootCa,RootKey)
    }
    if err != nil {
        return err
    }

    err = write(info.CrtName,"CERTIFICATE",buf)
    if err != nil {
        return err
    }

    buf = x509.MarshalPKCS1PrivateKey(Key)
    return write(info.KeyName,"PRIVATE KEY",buf)
}
//编码写入文件
func write(filename,Type String,p []byte) error {
    File,err := os.Create(fileName)
    defer File.Close()
    if err != nil {
        return err
    }
    var b *pem.block = &pem.block{Bytes: p,Type: TypE}
    return pem.Encode(File,b)
}

func Parse(crtPath,keyPath String) (rootcertificate *x509.Certificate,rootPrivateKey *rsa.PrivateKey,err error) {
    rootcertificate,err = ParseCrt(crtPath)
    if err != nil {
        return
    }
    rootPrivateKey,err = ParseKey(keyPath)
    return
}

func ParseCrt(path String) (*x509.Certificate,error) {
    buf,err := IoUtil.ReadFile(path)
    if err != nil {
        return nil,err
    }
    p := &pem.block{}
    p,buf = pem.Decode(buf)
    return x509.ParseCertificate(p.bytes)
}

func ParseKey(path String) (*rsa.PrivateKey,err
    }
    p,buf := pem.Decode(buf)
    return x509.ParsePKCS1PrivateKey(p.bytes)
}

func newCertificate(info CerTinformation) *x509.Certificate {
    return &x509.Certificate{
        serialnumber: big.NewInt(rd.Int63()),Subject: pkix.Name{
            Country:            info.Country,Organization:       info.organization,OrganizationalUnit: info.organizationalUnit,province:           info.province,CommonName:         info.CommonName,Locality:           info.Locality,ExtraNames:         info.Names,},NotBefore:             time.Now(),//证书的开始时间
        NotAfter:              time.Now().AddDate(20, 0, 0),//证书的结束时间
        BasicConsTraintsValid: true,//基本的有效性约束
        IsCA:           info.IsCA,//是否是根证书
        ExtKeyUsage:    []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth,x509.ExtKeyUsageServerAuth},//证书用途
        KeyUsage:       x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,EmailAddresses: info.EmailAddress,}
}
测试代码:
package rsa

import (
    "crypto/x509/pkix"
    "encoding/asn1"
    "os"
    "tesTing"
)

func test_crt(t *tesTing.T) {
    baseinfo := CerTinformation{Country: []String{"CN"},Organization: []String{"WS"},IsCA: true,OrganizationalUnit: []String{"work-stacks"},EmailAddress: []String{"czxichen@163.com"},Locality: []String{"SuZhou"},province: []String{"JiangSu"},CommonName: "Work-Stacks",CrtName: "test_root.crt",KeyName: "test_root.key"}

    err := CreateCRT(nil,nil,baseinfo)
    if err != nil {
        t.Log("Create crt error,Error info:",err)
        return
    }
    crTinfo := baseinfo
    crTinfo.IsCA = false
    crTinfo.CrtName = "test_server.crt"
    crTinfo.KeyName = "test_server.key"
    crTinfo.Names = []pkix.AttributeTypeAndValue{{asn1.objectIdentifier{2,1,3},"MAC_ADDR"}} //添加扩展字段用来做自定义使用

    crt,pri,err := Parse(baseinfo.CrtName,baseinfo.KeyName)
    if err != nil {
        t.Log("Parse crt error,err)
        return
    }
    err = CreateCRT(crt,crTinfo)
    if err != nil {
        t.Log("Create crt error,err)
    }
    os.Remove(baseinfo.CrtName)
    os.Remove(baseinfo.KeyName)
    os.Remove(crTinfo.CrtName)
    os.Remove(crTinfo.KeyName)
}

大佬总结

以上是大佬教程为你收集整理的Golang1.7.3使用x509标准库创建自签名证书和签发名其他证书全部内容,希望文章能够帮你解决Golang1.7.3使用x509标准库创建自签名证书和签发名其他证书所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。