【问题标题】:How can I calculate the thumbprint of an OpenID Connect server?如何计算 OpenID Connect 服务器的指纹?
【发布时间】:2021-11-13 18:04:08
【问题描述】:

在创建 OpenID Connect 提供程序(例如 AWS)时,我需要为连接器指定一个 thumbprint。它是什么,我如何获得它?

例如来自How can I connect GitHub actions with AWS deployments without using a secret key?

resource "aws_iam_openid_connect_provider" "github" {
  url = "https://token.actions.githubusercontent.com"
  client_id_list = [
    "githubactions",
  ]
  thumbprint_list = [
    "6938fd4d98bab03faadb97b34396831e3780aea1",
  ]
}

【问题讨论】:

    标签: amazon-web-services jwt openid-connect github-actions


    【解决方案1】:

    Open ID 连接器的指纹是主机公共证书的 SHA1 哈希。计算它需要获取服务的证书,然后使用openssl之类的工具计算hash。

    考虑为 GitHub 操作 https://token.actions.githubusercontent.com 的 GitHub OpenID 连接器创建指纹(例如,因为您有兴趣将 GitHub 操作与 AWS 连接起来)。

    您可以运行以下脚本来计算指纹:

    % HOST=$(curl https://vstoken.actions.githubusercontent.com/.well-known/openid-configuration \
    | jq -r '.jwks_uri | split("/")[2]')
    % echo | openssl s_client -servername $HOST -showcerts -connect $HOST:443 2> /dev/null \
    | sed -n -e '/BEGIN/h' -e '/BEGIN/,/END/H' -e '$x' -e '$p' | tail +2 \
    | openssl x509 -fingerprint -noout \
    | sed -e "s/.*=//" -e "s/://g" \
    | tr "ABCDEF" "abcdef"
    6938fd4d98bab03faadb97b34396831e3780aea1
    

    这一切意味着什么?

    OpenID 配置“众所周知的服务”,位于https://.../.well-known/openid-configuration,提供了已知服务的列表,包括.jwks_uri,如下所示:

    {
      "issuer": "https://token.actions.githubusercontent.com",
      "jwks_uri": "https://token.actions.githubusercontent.com/.well-known/jwks",
      "subject_types_supported": [
        "public",
        "pairwise"
      ],
      "response_types_supported": [
        "id_token"
      ],
      "claims_supported": [
        "sub",
        "aud",
        "exp",
        "iat",
        "iss",
        "jti",
        "nbf",
        "ref",
        "repository",
        "repository_owner",
        "run_id",
        "run_number",
        "run_attempt",
        "actor",
        "workflow",
        "head_ref",
        "base_ref",
        "event_name",
        "ref_type",
        "environment",
        "job_workflow_ref"
      ],
      "id_token_signing_alg_values_supported": [
        "RS256"
      ],
      "scopes_supported": [
        "openid"
      ]
    }
    

    在这种情况下,它告诉客户端 Json Web 密钥服务 URI 要连接的主机位于 https://token.actions.githubusercontent.com/.well-known/jwks,但我们唯一需要的(对于 SSL 证书)是主机名 token.actions.githubusercontent.com .我们可以使用 JQ 将其通过管道传递给 split("/") 函数并获取 [2] 元素,在本例中它只是主机名。

    在本例中,主机名与我们最初查询的主机名相同,但也可能不同。

    从主机获取证书可以通过 OpenSSL 完成;我们使用openssl s_client -servername $HOST -showcerts -connect $HOST:443 与主机建立 TLS 连接并转储其证书。由于我们实际上不需要发送任何数据,因此我们通过管道输出echo 来启动会话通信。

    这将导致输出如下所示:

    CONNECTED(00000005)
    ---
    Certificate chain
     0 s:/C=US/ST=California/L=San Francisco/O=GitHub, Inc./CN=*.actions.githubusercontent.com
       i:/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1
    -----BEGIN CERTIFICATE-----
    MIIG9jCCBd6gAwIBAgIQCFCR4fqbkQJJbzQZsc87qzANBgkqhkiG9w0BAQsFADBP
    MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSkwJwYDVQQDEyBE
    aWdpQ2VydCBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTAeFw0yMjAxMTEwMDAwMDBa
    Fw0yMzAxMTEyMzU5NTlaMHsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9y
    bmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRUwEwYDVQQKEwxHaXRIdWIsIElu
    Yy4xKDAmBgNVBAMMHyouYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wggEi
    MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCcHl5GgNgXYUI5Zz085Ar9wSiI
    gdDnOkaXof2u3pcJ1138Tlz6aheVqXfJ8MOAups0LTr9j/dTHAGWKQz0qdyUdYIJ
    FwiOlkmphoP+a4xVJXbdVVN7qvmfV8f0YnG5oGVyx9hDl/30JReVIYPbC8JNSiIW
    2jMYnjqPu41tPclNNroW9K8gJUzT/WE4LRHohOmR1GbC1xQ8YlFS6pFs+Xuznou8
    TzO8PsXRdaDe/7pYZgR/Otv5XLY5siCBraMuxtj1g4Z/Tz8d2Z+sMPIxtHZjxmcu
    LPfIix6cARSpJFgGF7Yh9vgLK9jEkgfuU1Nnshv7S6ylIn5SfHNToQjCRSPJAgMB
    AAGjggOgMIIDnDAfBgNVHSMEGDAWgBS3a6LqqKqEjHnqtNoPmLLFlXa59DAdBgNV
    HQ4EFgQUibMM9Yecb/WbuZDkxiGVR39k0QMwSQYDVR0RBEIwQIIfKi5hY3Rpb25z
    LmdpdGh1YnVzZXJjb250ZW50LmNvbYIdYWN0aW9ucy5naXRodWJ1c2VyY29udGVu
    dC5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
    BQcDAjCBjwYDVR0fBIGHMIGEMECgPqA8hjpodHRwOi8vY3JsMy5kaWdpY2VydC5j
    b20vRGlnaUNlcnRUTFNSU0FTSEEyNTYyMDIwQ0ExLTQuY3JsMECgPqA8hjpodHRw
    Oi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRUTFNSU0FTSEEyNTYyMDIwQ0Ex
    LTQuY3JsMD4GA1UdIAQ3MDUwMwYGZ4EMAQICMCkwJwYIKwYBBQUHAgEWG2h0dHA6
    Ly93d3cuZGlnaWNlcnQuY29tL0NQUzB/BggrBgEFBQcBAQRzMHEwJAYIKwYBBQUH
    MAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBJBggrBgEFBQcwAoY9aHR0cDov
    L2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExTUlNBU0hBMjU2MjAyMENB
    MS0xLmNydDAMBgNVHRMBAf8EAjAAMIIBfQYKKwYBBAHWeQIEAgSCAW0EggFpAWcA
    dQCt9776fP8QyIudPZwePhhqtGcpXc+xDCTKhYY069yCigAAAX5IjyPvAAAEAwBG
    MEQCIDxMGruNl33xLmOdh2UdMxA3aiuIX3vgeXSuXRce6sqBAiApoOxk2sfxfZdw
    cMxXuM0B8bfgGiQ7IlG14wRa7KQioAB3ADXPGRu/sWxXvw+tTG1Cy7u2JyAmUeo/
    4SrvqAPDO9ZMAAABfkiPI8kAAAQDAEgwRgIhAJJmNVWqVfFlQLdX8sbbQ9VmJA5K
    28ldvwLQpnJopgFzAiEAsGYoIzVOBazT96kGYIuJ3k+Zya7PsFtPVyUbOom55PcA
    dQCzc3cH4YRQ+GOG1gWp3BEJSnktsWcMC4fc8AMOeTalmgAAAX5IjyPnAAAEAwBG
    MEQCIE0NMqwPjqYJwxYqrh7CVueH1rWvKYvRj8cvv3fr7Ku5AiBGFfeJ+Nsy3VCW
    TAih+ito29SvJ0TJrDsyHy3PhkmZ6jANBgkqhkiG9w0BAQsFAAOCAQEAih09kwU8
    8j/R3/xDkV/2Td/ZbgzUPrrjnMqL32Kv8zqPb0AnaOZbA9XqMuQimLDPqr7fTtKR
    BRhXStaNT5s7zZm3g9P+Xsxl2XSiuTbR0Y9MOmfgWA0Jv3vw8zq/etdGBrV0stQ/
    JB2GKteYl9hP7eOj0xaNg/ylaCDONG084lqVlugggmsW9RgN3zAESmALahezuzlN
    G5asPhNDCIRyo3mm0hHCV4/Kvoura/bGVkc7Wkk6q/cplN5VCSq9wYk2ugEaxsc1
    YeqXpxQtRVJTF/UtuNpWS+Tp1COx3DiaoTjCmEImSzYarfZ7QIMR9opxJEPAB52h
    s/oLX5ruUXwvIw==
    -----END CERTIFICATE-----
     1 s:/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1
       i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
    -----BEGIN CERTIFICATE-----
    MIIE6jCCA9KgAwIBAgIQCjUI1VwpKwF9+K1lwA/35DANBgkqhkiG9w0BAQsFADBh
    MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
    d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
    QTAeFw0yMDA5MjQwMDAwMDBaFw0zMDA5MjMyMzU5NTlaME8xCzAJBgNVBAYTAlVT
    MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxKTAnBgNVBAMTIERpZ2lDZXJ0IFRMUyBS
    U0EgU0hBMjU2IDIwMjAgQ0ExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
    AQEAwUuzZUdwvN1PWNvsnO3DZuUfMRNUrUpmRh8sCuxkB+Uu3Ny5CiDt3+PE0J6a
    qXodgojlEVbbHp9YwlHnLDQNLtKS4VbL8Xlfs7uHyiUDe5pSQWYQYE9XE0nw6Ddn
    g9/n00tnTCJRpt8OmRDtV1F0JuJ9x8piLhMbfyOIJVNvwTRYAIuE//i+p1hJInuW
    raKImxW8oHzf6VGo1bDtN+I2tIJLYrVJmuzHZ9bjPvXj1hJeRPG/cUJ9WIQDgLGB
    Afr5yjK7tI4nhyfFK3TUqNaX3sNk+crOU6JWvHgXjkkDKa77SU+kFbnO8lwZV21r
    eacroicgE7XQPUDTITAHk+qZ9QIDAQABo4IBrjCCAaowHQYDVR0OBBYEFLdrouqo
    qoSMeeq02g+YssWVdrn0MB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFV
    MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
    EgYDVR0TAQH/BAgwBgEB/wIBADB2BggrBgEFBQcBAQRqMGgwJAYIKwYBBQUHMAGG
    GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBABggrBgEFBQcwAoY0aHR0cDovL2Nh
    Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNydDB7BgNV
    HR8EdDByMDegNaAzhjFodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRH
    bG9iYWxSb290Q0EuY3JsMDegNaAzhjFodHRwOi8vY3JsNC5kaWdpY2VydC5jb20v
    RGlnaUNlcnRHbG9iYWxSb290Q0EuY3JsMDAGA1UdIAQpMCcwBwYFZ4EMAQEwCAYG
    Z4EMAQIBMAgGBmeBDAECAjAIBgZngQwBAgMwDQYJKoZIhvcNAQELBQADggEBAHer
    t3onPa679n/gWlbJhKrKW3EX3SJH/E6f7tDBpATho+vFScH90cnfjK+URSxGKqNj
    OSD5nkoklEHIqdninFQFBstcHL4AGw+oWv8Zu2XHFq8hVt1hBcnpj5h232sb0HIM
    ULkwKXq/YFkQZhM6LawVEWwtIwwCPgU7/uWhnOKK24fXSuhe50gG66sSmvKvhMNb
    g0qZgYOrAKHKCjxMoiWJKiKnpPMzTFuMLhoClw+dj20tlQj7T9rxkTgl4ZxuYRiH
    as6xuwAwapu3r9rxxZf+ingkquqTgLozZXq8oXfpf2kUCwA/d5KxTVtzhwoT0JzI
    8ks5T1KESaZMkE4f97Q=
    -----END CERTIFICATE-----
    ---
    Server certificate
    subject=/C=US/ST=California/L=San Francisco/O=GitHub, Inc./CN=*.actions.githubusercontent.com
    issuer=/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1
    ---
    No client certificate CA names sent
    Server Temp Key: ECDH, P-384, 384 bits
    ---
    SSL handshake has read 3571 bytes and written 398 bytes
    ---
    New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
    Server public key is 2048 bit
    Secure Renegotiation IS supported
    Compression: NONE
    Expansion: NONE
    No ALPN negotiated
    SSL-Session:
        Protocol  : TLSv1.2
        Cipher    : ECDHE-RSA-AES256-GCM-SHA384
        Session-ID: 223C0000364B663D9E1AD1A1287F2F351C1E6D66075F206C8802B43EC6110B7A
        Session-ID-ctx: 
        Master-Key: BBA59654810DE8EF29C2CEBB9CD1D4B886D2FF89359F24A664B31B7F71E7F1CFE719734548216CFC626EC39498EC4BE9
        Start Time: 1642416883
        Timeout   : 7200 (sec)
        Verify return code: 0 (ok)
    ---
    

    还有一些额外的消息从这里打印到stderr,我们不需要,所以使用2> /dev/null 将其重定向到null。

    这里我们真正需要的内容只是BEGIN和END部分之间的内容;具体来说,最后一个。如果您安装了tac,一个简单的方法是简单地向后转储它,打印出 END 和 BEGIN 证书之间的内容,然后停止;然后再次使用tac 反转它。

    由于tac 在 macOS 上不存在,因此可以使用本机 sed 来完成这项工作:

    • sed -n -- 运行 sed,但默认不打印任何输出
      • -e '/BEGIN/h' -- 看到 BEGIN 时,将 sed 保持缓冲区 设置为该行
      • -e '/BEGIN/,/END/H' -- 对于 BEGIN 和 END 之间的所有行,将它们附加到保持缓冲区(h 设置值,H 附加它,但我们最终在这里有两个 BEGINs)
      • -e '$x' -e '$p' -- 当你到达文件末尾时 ($) 将保持缓冲区换成输出缓冲区 (x) 然后打印出来 (p)
    • tail +2 -- 从第 2 行开始打印,以避免上面重复的 BEGIN
    • openssl x509 -fingerprint -noout -- 将输出通过管道传输到 openssl,这将给出SHA1 Fingerprint= 69:38:FD:4D:98:BA:B0:3F:AA:DB:97:B3:43:96:83:1E:37:80:AE:A1 形式的指纹结果
    • sed -e "s/.*=//" -e "s/://g" -- 删除直到并包括 = 符号的所有内容,然后从输出中删除所有冒号 (:)
    • tr "ABCDEF" "abcdef" -- 将A 替换为a,将B 替换为b 等。(技术上不需要,但看起来不那么喧哗

    这个的最终结果,6938fd4d98bab03faadb97b34396831e3780aea1,就是在配置你的 OpenID 客户端时可以使用的指纹,比如How can I connect GitHub actions with AWS deployments without using a secret key?

    注意GitHub(无意中)updated their thumbprint recently,所以结果从a031c46782e6e6c662c2c87c76da9aa62ccabd8e变了 给6938fd4d98bab03faadb97b34396831e3780aea1

    【讨论】:

    • 这是否意味着当此证书到期并发布新证书时,整个事情都会崩溃?
    • 如果即将发生变化,那么 GitHub 很可能会宣布它,您可以提前输入指纹。但如果你不这样做,或者它只是改变了,那么它就会停止工作。
    • 很好奇 - 为什么这是 vstoken 而不仅仅是令牌?
    • 在 beta 环境中,GitHub 使用 vstoken,因为它来自 Visual Studio Code 后端。但是,它后来添加了一个别名 token,以强调这不是特定于 VS Code 的 API。
    猜你喜欢
    • 2021-01-09
    • 1970-01-01
    • 2016-12-18
    • 2016-11-19
    • 2015-04-29
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2016-12-18
    相关资源
    最近更新 更多