提取与golang的主题密钥标识符

问题描述:

我想使用golang crypto/tls库为服务器返回的链中的所有证书提取SubjectKeyIdentifiers。提取与golang的主题密钥标识符

package main 

import (
    "crypto/tls" 
    "fmt" 
) 

func main() { 
    conn, err := tls.Dial("tcp", "mail.google.com:443", &tls.Config{ 
     InsecureSkipVerify: true, 
    }) 
    if err != nil { 
      panic("failed to connect: " + err.Error()) 
     } 
    state := conn.ConnectionState() 
     if err != nil { 
        panic("failed to get ConnState: " + err.Error()) 
      } 
    for _, cert := range state.PeerCertificates { 
     fmt.Printf("%s\n", cert.Subject.CommonName) 
     fmt.Printf("%X\n", cert.SubjectKeyId) 
    } 
    conn.Close() 
} 

根据文档SubjectKeyId应该已经填充了ASN1分析数据。 的问题是,我得到 4E16C14EFCD46B0A09F8090F1C00278C6F992C65

而真正的一个是

30:A1:48:01:DB:2B:C3:EE:D3:84:54:4B:66:AF: 0C:4C:66:F7:69:47

我在这里做错了什么?

+0

你如何知道30:A1:48:01:DB:2B:C3:EE:D3:84:54:4B:66:AF:0C:4C :66:F7:69:47是正确的吗? – reticentroot

+0

运行你的代码,我得到'4ADD06161BBCF668B576F581B6BB621ABA5A812F',其匹配,看着谷歌谷歌的证书铬工具,我得到 '4A DD 06 16 1B BC F6 68 B5 76 F5 81 B6 BB 62 1A BA 5A 81 2F' 他们比赛。 – reticentroot

+1

另请参阅 https://security.stackexchange.com/questions/41578/why-does-google-ssl-cert-change-so-times- – reticentroot

问题是我在使用openssl进行检查时未指定SNI。 结论是:始终设置SNI中的ClientHello

$ echo q |openssl s_client -showcerts -connect mail.google.com:443 -servername mail.google.com -showcerts 2>/dev/null | sed -n '/-----BEGIN/,/-----END/p' | openssl x509 -text -noout | grep -P -A1 'Subject Key' 
      X509v3 Subject Key Identifier: 
       4E:16:C1:4E:FC:D4:6B:0A:09:F8:09:0F:1C:00:27:8C:6F:99:2C:65 
$ echo q |openssl s_client -showcerts -connect mail.google.com:443 -showcerts 2>/dev/null | sed -n '/-----BEGIN/,/-----END/p' | openssl x509 -text -noout | grep -P -A1 'Subject Key' 
      X509v3 Subject Key Identifier: 
       30:A1:48:01:DB:2B:C3:EE:D3:84:54:4B:66:AF:0C:4C:66:F7:69:47 
$