简体   繁体   English

以人类可读的格式解码X509证书-Golang

[英]Decoding a X509 Certificate in Human readable format - Golang

I have the following code: 我有以下代码:

package main

import (
    "crypto/dsa"
    "crypto/ecdsa"
    "crypto/rsa"
    "crypto/x509"
    "encoding/pem"
    "fmt"
)

func main() {
    // Verifying with a custom list of root certificates.

    const rootPEM = `
-----BEGIN CERTIFICATE-----
MIIEBDCCAuygAwIBAgIDAjppMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMTMwNDA1MTUxNTU1WhcNMTUwNDA0MTUxNTU1WjBJMQswCQYDVQQG
EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy
bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP
VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv
h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE
ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ
EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC
DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB+zCB+DAfBgNVHSMEGDAWgBTAephojYn7
qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wEgYD
VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMwMTAvoC2g
K4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Jscy9ndGdsb2JhbC5jcmwwPQYI
KwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vZ3RnbG9iYWwtb2NzcC5n
ZW90cnVzdC5jb20wFwYDVR0gBBAwDjAMBgorBgEEAdZ5AgUBMA0GCSqGSIb3DQEB
BQUAA4IBAQA21waAESetKhSbOHezI6B1WLuxfoNCunLaHtiONgaX4PCVOzf9G0JY
/iLIa704XtE7JW4S615ndkZAkNoUyHgN7ZVm2o6Gb4ChulYylYbc3GrKBIxbf/a/
zG+FA1jDaFETzf3I93k9mTXwVqO94FntT0QJo544evZG0R0SnU++0ED8Vf4GXjza
HFa9llF7b1cq26KqltyMdMKVvvBulRP/F/A8rLIQjcxz++iPAsbw+zOzlTvjwsto
WHPbqCRiOwY1nQ2pM714A5AuTHhdUDqB1O6gyHA43LL5Z/qHQF1hwFGPa4NrzQU6
yuGnBXj8ytqU0CwIPX4WecigUCAkVDNx
-----END CERTIFICATE-----`

    const certPEM = `
-----BEGIN CERTIFICATE-----
MIIDujCCAqKgAwIBAgIIE31FZVaPXTUwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
cm5ldCBBdXRob3JpdHkgRzIwHhcNMTQwMTI5MTMyNzQzWhcNMTQwNTI5MDAwMDAw
WjBpMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEYMBYGA1UEAwwPbWFp
bC5nb29nbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfRrObuSW5T7q
5CnSEqefEmtH4CCv6+5EckuriNr1CjfVvqzwfAhopXkLrq45EQm8vkmf7W96XJhC
7ZM0dYi1/qOCAU8wggFLMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAa
BgNVHREEEzARgg9tYWlsLmdvb2dsZS5jb20wCwYDVR0PBAQDAgeAMGgGCCsGAQUF
BwEBBFwwWjArBggrBgEFBQcwAoYfaHR0cDovL3BraS5nb29nbGUuY29tL0dJQUcy
LmNydDArBggrBgEFBQcwAYYfaHR0cDovL2NsaWVudHMxLmdvb2dsZS5jb20vb2Nz
cDAdBgNVHQ4EFgQUiJxtimAuTfwb+aUtBn5UYKreKvMwDAYDVR0TAQH/BAIwADAf
BgNVHSMEGDAWgBRK3QYWG7z2aLV29YG2u2IaulqBLzAXBgNVHSAEEDAOMAwGCisG
AQQB1nkCBQEwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29nbGUuY29t
L0dJQUcyLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAH6RYHxHdcGpMpFE3oxDoFnP+
gtuBCHan2yE2GRbJ2Cw8Lw0MmuKqHlf9RSeYfd3BXeKkj1qO6TVKwCh+0HdZk283
TZZyzmEOyclm3UGFYe82P/iDFt+CeQ3NpmBg+GoaVCuWAARJN/KfglbLyyYygcQq
0SgeDh8dRKUiaW3HQSoYvTvdTuqzwK4CXsr3b5/dAOY8uMuG/IAR3FgwTbZ1dtoW
RvOTa8hYiU6A475WuZKyEHcwnGYe57u2I2KbMgcKjPniocj4QzgYsVAVKW3IwaOh
yE+vPxsiUkvQHdO2fojCkY8jg70jxM+gu59tPDNbw3Uh/2Ij310FgTHsnGQMyA==
-----END CERTIFICATE-----`

    // First, create the set of root certificates. For this example we only
    // have one. It's also possible to omit this in order to use the
    // default root set of the current operating system.
    roots := x509.NewCertPool()
    ok := roots.AppendCertsFromPEM([]byte(rootPEM))
    if !ok {
        panic("failed to parse root certificate")
    }

    block, _ := pem.Decode([]byte(certPEM))
    if block == nil {
        panic("failed to parse certificate PEM")
    }
    cert, err := x509.ParseCertificate(block.Bytes)
    if err != nil {
        panic("failed to parse certificate: " + err.Error())
    }

    // I want to print cert.Raw in human readable format
    fmt.Println(string(cert.Raw))
}

However, I keep getting something like: 但是,我不断得到类似的东西:

0I10??}E*?H??0
   0    UUS10U

140529000000Z0i1oogle Internet Authority G20
                0   UUS10U

California10U
Mountain View10U


Google Inc10U
             mail.google.com0Y0*?H?*?H?=B}?n??>??)???kG? ???DrK????
7վ??h?y
       ??9  ??I??oz\?B?4u?????O0?K0U%+0U0?mail.google.com0
                                                              U?0+\0Z0+0?http://pki.google.com/GIAG2.crt0+0?http://clients1.google.com/ocsp0U??m?`.M??-~T`??*?0
                U?00U#0?J??h?v????b?Z?/0U 00

??X?pjL?Q7??s??v??!6??,</i.google.com/GIAG2.crl0
ͦ``?jT+?I7?V??&2??*?(D?"im?A*?;?N???^??o???<?ˆ???X0M?uv?F?k?X?N??V???w0?f绶#b?2
?????C8?P)m?????O??RK?Ӷ~??#??#?Ϡ??m<3[?u!?b#?]?1?d
                                                   ?

How can I get the human readable format for the certificate? 如何获得证书的可读格式?

There is no String() string member function in x509.Certificate so you will need to write one yourself. x509.Certificate没有String() string成员函数,因此您需要自己编写一个。

eg 例如

fmt.Println(cert.Subject)
fmt.Println(cert.Issuer)
fmt.Println(decodeAlgorithm(cert.PublicKeyAlgorithm))


func decodeAlgorithm(code x509.PublicKeyAlgorithm) string {
    var s string
    switch code {
    case x509.RSA:
            s = "RSA"
    case x509.DSA:
            s = "DSA"
    case x509.ECDSA:
            s = "ECDSA"
    default:
            s = "oops"
    }
    return s
}

When I ran this on *.google.com PEM, I get 当我在* .google.com PEM上运行此命令时,

{[US] [Google Inc] [] [] [] [] []  Google Internet Authority G2 [{2.5.4.6 US} {2.5.4.10 Google Inc} {2.5.4.3 Google Internet Authority G2}] []}
{[US] [GeoTrust Inc.] [] [] [] [] []  GeoTrust Global CA [{2.5.4.6 US} {2.5.4.10 GeoTrust Inc.} {2.5.4.3 GeoTrust Global CA}] []}
RSA

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Golang X509 证书如何编组目标信息扩展 - Golang X509 certificate how to marshal target information extension Golang HTTP x509:由未知权限签名的证书错误 - Golang HTTP x509: certificate signed by unknown authority error 使用 Golang 从 Docker 连接到雪花数据库时出现错误“x509:证书由未知机构签名” - Error "x509: certificate signed by unknown authority" while connecting to Snowflake Database from Docker Using Golang 由于 x509 证书依赖于旧的 Common Name 字段,因此无法使用 Golang 连接到服务器 - Failed to connect to a server with Golang due x509 certificate relies on legacy Common Name field Golang:使用与指定公钥对应的私钥验证x509证书是否已签名 - Golang: verify x509 certificate was signed using private key that corresponds to the specified public key 在 Go 中解析 X509 证书 - Parsing X509 certificate in Go 由未知授权机构签署的x509证书 - x509 certificate signed by unknown authority 从人类可读格式golang转换日期 - Convert date from human readable format golang 通过在 GoLang 中删除标头并将块解析为单行来格式化 x509 PEM - Format x509 PEM by removing headers and parsing block into a single line in GoLang 如何在golang中解码x509证书中的复合自定义扩展? 当前代码错误是:asn1:结构错误:序列标签不匹配 - How to Decode composite custom extensions in x509 certificate in golang? With current code Error is : asn1: structure error: sequence tag mismatch
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM