go - 使用 Go 从 PEM 格式的 Google "oauth2/v1/certs"证书中提取公钥

标签 go rsa google-oauth urlfetch openid-connect

我从以下位置获取了 Google 证书:

https://www.googleapis.com/oauth2/v1/certs

但我不知道如何在 Go 中解析证书并提取公钥并使其适用于 rsa.VerifyPKCS1v15() 以验证 ID token (openID 连接)签名。如果有人可以建议我,我将不胜感激。这是我已有的代码:

res, err := http.Get("https://www.googleapis.com/oauth2/v1/certs")
if err != nil {
    log.Fatal(err)
    return 
}

certs, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
    log.Fatal(err)
    return 
}
//extract kid from token header
var header interface{}
log.Printf("Oauth header: %v", headerOauth)
err = json.Unmarshal([]byte(headerOauth), &header)

token_kid := header.(map[string]interface{})["kid"]
//get modulus and exponent from the cert

var goCertificate interface{}

err = json.Unmarshal(certs, &goCertificate)    

k := goCertificate.(map[string]interface{})[token_kid.(string)]

google_cert := k.(string)
block_pub, _ := pem.Decode([]byte(google_cert))
certInterface, err := x509.ParseCertificates(block_pub.Bytes)
log.Printf("certInterface: %v", *certInterface.PublicKey)
//I know the line below is wrong but thats how I usualy parse public keys
pubkeyInterface, err := x509.ParsePKIXPublicKey(certInterface.Bytes)
pKey, ok := pubkeyInterface.(*rsa.PublicKey)

最佳答案

我可能跑题了(不熟悉 x509/rsa)但是 ParseCertificates 返回了所有的键:

func main() {
    res, err := http.Get("https://www.googleapis.com/oauth2/v1/certs")
    if err != nil {
        log.Fatal(err)
        return
    }

    var header = map[string]string{
        "kid": "ef9007a67db85f13ed67462abe2df63145c09aaf",
    }

    token_kid := header["kid"]

    defer res.Body.Close()
    var certs map[string]string
    dec := json.NewDecoder(res.Body)
    dec.Decode(&certs)
    // add error checking
    google_cert := certs[token_kid]
    block_pub, _ := pem.Decode([]byte(google_cert))
    certInterface, err := x509.ParseCertificates(block_pub.Bytes)
    log.Printf("certInterface: %#v", certInterface)
    pkey := certInterface[0].PublicKey.(*rsa.PublicKey)
    log.Printf("pkey: %v", pkey)
}

关于go - 使用 Go 从 PEM 格式的 Google "oauth2/v1/certs"证书中提取公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26237283/

相关文章:

go - ssh 以用户身份登录并更改为 root,无需 sudo

C# 使用 RSA DER 格式公钥解密文件

licensing - PHP 中的 RSA_sign 或 DSA_sign!

android - 我是否应该使用 GoogleAuthUtil 调用我的后端来保护通信,即使我不需要使用已登录的 Google 用户?

google-calendar-api - 如何使用谷歌日历 v3 访问其他用户的日历?

sockets - 没有可用的缓冲区空间(tcp.cpp :69) when setting SNDBUF and RCVBUF ZeroMQ, golang,MacOSX

go - 返回的接口(interface){}类型断言

linux - 键盘输入解析算法的引用资料?

cryptography - Windows CryptoAPI : CryptSignHash with CALG_SHA_256 and private key from MY keystore

java - 如何成功运行 Google Drive API 的 "Java Quickstart"示例?