微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在golang中生成x5t标头值

如何解决如何在golang中生成x5t标头值

我有一个bash命令(来自medium)来生成证书指纹的base64。

echo $(openssl x509 -in cert.pem -fingerprint -noout) | sed 's/SHA1 Fingerprint=//g' | sed 's/://g' | xxd -r -ps | base64

我想用golang编写类似的代码。我在xxd -r -ps中遇到问题,如何在golang中实现此xxd?

命令的输出用作Azure中的x5t标头。

已实现的代码-

data := `-----BEGIN CERTIFICATE-----
MIIDazCCAlOgAwIBAgIUDXiUCBmejBrKJeaF5xUltTKShokwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDA5MjAxMjA1MzdaFw0zMDA5
MTgxMjA1MzdamEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQDgZq1ucYX2Oi63TilhD8YPImV7CGPsjcpuirsgaEV6
0fLVMp0lvDtnVsDWu4QGeBQN8cusOQclOje43AVmvUpaxKcXTRRvhxURpxnZqxXM
yYN7S+X5mO7sEj0DsAxpH8/Mo5awMi9e7rdEu2Q+IBQI0gZu+d3gv/svcKzPtwAj
kaZdsBhZr55vRigEJSaWTq8oRUdihQZVz9wqvwdIehh0SU61Awk8jmoDQ3+SocZo
cFEqsCqHasjKhXUOdQw24AsgiPjVN7IpBBWsQBgSVRY683ERKXE/pjGUDQJDuoEh
QVnWa3sf9/18tlnk+faCUjGAGsxZg1WJUez7fygQ+h0rAgMBAAGjUzBRMB0GA1Ud
DgQWBbroF0gDDord4phH0R8mtd/vTF2SgDAfBgNVHSMEGDAWgbroF0gDDord4phH
0R8mtd/vTF2SgDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDQ
hHU8RaekKQ332pq09TqIU1PvYb5/DTkPTftPX32g5/QPrIu1lSxdkByO1jK9MI/w
JECViCjdiSK2FxW/74meXt4kALrebLc6HrLwYTqOR8PTAdtrGaPinKzrcjjB3oDK
Ni+qtW2GOGQ4MIqIgcVIqWNyuzVQ22BpKVbEvpzoMV1AcFAaHv4GpFxlKYrpxy4G
u0D84FHf95DPx6Jf79MRVh1WiEbsdWak8W1KAokRMp1AFktkZYDPGZvjuYD7jNfx
vcMgUpzdA0MYq54/OzypmN1tZ658EBkH6pCS8abtv6cZbEggQWI47TVov/THtBls
ySRtrOZbmIvnSs2ZMMsz
-----END CERTIFICATE-----
`
    derBytes,_ := pem.Decode([]byte(data))
    cert,err := x509.ParseCertificate(derBytes.Bytes)
    if err != nil {
        fmt.Println("err ParseCertificate",err)
    }
    fingerprint := sha1.Sum(cert.Raw)

    var buf bytes.Buffer
    for i,f := range fingerprint {
        if i > 0 {
            fmt.Fprintf(&buf,"")
        }
        fmt.Fprintf(&buf,"%02X",f)
    }
    fp := buf.String()
    fmt.Printf("Fingerprint : %s\n",fp) //04B9B0BCB18EF20440DE0ACEC010F6AD9F1B3A94

    // convert fp to byte and then enc in b64
    sEnc := base64.StdEncoding.EncodetoString([]byte(fp))
    fmt.Println(sEnc) //MDRCOUIwQkNCMThFRjIwNDQwREUwQUNFQzAxMEY2QUQ5RjFCM0E5NA==

openssl cmd的输出BLmwvLGO8gRA3grOwBD2rZ8bOpQ= 程序的输出MDRCOUIwQkNCMThFRjIwNDQwREUwQUNFQzAxMEY2QUQ5RjFCM0E5NA==

解决方法

您正在建立一个十六进制表示形式的字节缓冲区,并对该字符串进行base64编码。相反,您需要对指纹的原始字节进行base64编码。

openssl的十六进制表示法很不错,对数据的十六进制表示法不做任何操作。

计算指纹后,使用以下代码替换代码:

fingerprint := sha1.Sum(cert.Raw)

fmt.Printf("%x\n",fingerprint)
// 04b9b0bcb18ef20440de0acec010f6ad9f1b3a94

b64 := base64.StdEncoding.EncodeToString(fingerprint[:])
fmt.Println(b64)
// BLmwvLGO8gRA3grOwBD2rZ8bOpQ=

我们仍然可以用十六进制表示法打印指纹,我们只使用%x动词。唯一有点烦人的事情是,我们需要使用fingerprint[:]将数组变成切片。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。