5

我试图使用Certificate credentials for application authentication从 Microsoft Azure Active Directory 获取 JWT 令牌。

我对弄清楚“x5t”的价值感到震惊。

我试过了

  • 公共证书中可用的 SHA-1 指纹值。
  • 使用 FVIC 的公共证书的 SHA-1 哈希。

但是当我将请求发送到 MSA 登录端点时,我总是遇到错误

{
    "error": "invalid_client",
    "error_description": "AADSTS70002: Error validating credentials. AADSTS50012: Client assertion contains an invalid signature. [Reason - The key was not found., Thumbprint of key used by client: '6F67F76B96F6FBBDF9D3EE1DDF7F9A7B877EE9C75DEDBD3DE9C7FB', Configured keys: [Key0:Start=06/01/2018, End=12/31/2099, Thumbprint=6WGktXA64QmA9TPv;Key1:Start=06/01/2018, End=12/31/2099, Thumbprint=rD9Q10sR6Q6ZkDVw;]]\r\nTrace ID: d9e3e276-e878-4b8a-b08b-10c82a0b0600\r\nCorrelation ID: 48ec889d-2376-45a6-9bf0-01b22b0e0c17\r\nTimestamp: 2018-06-01 09:38:24Z",
    "error_codes": [
        70002,
        50012
    ],
    "timestamp": "2018-06-01 09:38:24Z",
    "trace_id": "d9e3e276-e878-4b8a-b08b-10c82a0b0600",
    "correlation_id": "48ec889d-2376-45a6-9bf0-01b22b0e0c17"
}

如何获得“x5t”的值?

4

2 回答 2

11

我发现这个站点和这个站点对于解决 x5t 问题非常宝贵最简单的方法是手动获取指纹:

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

上述命令中的值是您在 JWT 的 x5t 字段中输入的值。在此之前,我从 azure 收到无效的指纹错误。

如果您使用的是 Ruby,您可以按照这个答案获得:

p12 = OpenSSL::PKCS12.new(File.read(CERT_FILE), '')
x509_sha1_thumbprint = Base64.encode64(OpenSSL::Digest::SHA1.new(p12.certificate.to_der).to_s.upcase.scan(/../).map(&:hex).pack("c*")).strip
jwt_token = JWT.encode payload, p12.key, 'RS256', { typ: 'JWT', x5t: x509_sha1_thumbprint }
于 2018-10-03T10:35:54.990 回答
2

x5t应该是 X509 证书的 SHA-1 指纹,base64url 编码:

4.1.7. “x5t”(X.509 证书 SHA-1 指纹)标头参数

“x5t”(X.509 证书 SHA-1 指纹)标头参数是 X.509 证书 [RFC5280] 的 DER 编码的 base64url 编码的 SHA-1 指纹(又名摘要),对应于用于数字签名的密钥JWS。请注意,证书指纹有时也称为证书指纹。此标头参数的使用是可选的。

来源:RFC7515 — https://www.rfc-editor.org/rfc/rfc7515#section-4.1.7

于 2018-06-03T09:40:16.347 回答