获取 OpenID Connect 身份提供者的指纹
在 IAM 中创建 OpenID Connect(OIDC)身份提供商时,IAM 需要对外部身份提供者(IdP)使用的证书进行签名的顶级中间证书颁发机构(CA)的指纹。该指纹是用于为 OIDC 兼容 IdP 颁发证书的 CA 证书的签名。在创建 IAM OIDC 身份提供程序时,您信任该 IdP 验证的身份有权访问您的 AWS 账户。通过使用 CA 的证书指纹,您信任该 CA 颁发的任何证书,并且其 DNS 名称与注册的名称相同。这样,在续订 IdP 的签名证书时,无需在每个账户中更新信任关系。
重要
在大多数情况下,联合身份验证服务器使用两个不同的证书:
-
第一个证书将在 AWS 与您的 IdP 之间建立 HTTPS 连接。这应由已知公有根 CA(如 AWS Certificate Manager)发布。这使客户端能够检查证书的可靠性和状态。
-
第二个证书将用于加密令牌,且应由私有或公有根 CA 签署。
您可以使用 AWS Command Line Interface、Tools for Windows PowerShell 或 IAM API 创建一个 IAM OIDC 身份提供程序。使用这些方法时,您可以选择手动提供指纹。如果您选择不包含指纹,IAM 将检索 OIDC IdP 服务器证书的顶级中间 CA 指纹。如果您选择包含指纹,则必须手动获取指纹并将它提供给 AWS。
当您使用 IAM 控制台创建 OIDC 身份提供者时,IAM 会尝试为您检索 OIDC IdP 服务器证书的顶级中间 CA 指纹。
此外,建议您手动获取 OIDC IdP 的指纹,并验证 IAM 是否检索了正确的指纹。有关获取证书指纹的更多信息,请参阅以下部分:
注意
AWS 使用我们的受信任根证书颁发机构(CA)库来保护与 OIDC 身份提供者(IdP)之间的通信,从而验证JSON Web 密钥集(JWKS)端点的 TLS 证书。如果您的 OIDC IdP 依赖的证书不是由其中某个受信任的 CA 签名,则仅在此时我们会使用 IdP 配置中设置的指纹来保护通信。如果我们无法检索 TLS 证书或需要 TLS v1.3,则 AWS 将回退到指纹验证。
获取证书指纹
您可以使用 Web 浏览器和 OpenSSL 命令行工具获取 OIDC 提供者的证书指纹。但是,您无需手动获取证书指纹即可创建 IAM OIDC 身份提供者。您可以使用以下过程获取 OIDC 提供者。
获取 OIDC IdP 的指纹
-
您需要先获取 OpenSSL 命令行工具,然后才能获取 OIDC IdP 的指纹。您可使用此工具下载 OIDC IdP 的证书链并生成证书链中最终证书的指纹。如果需要安装和配置 OpenSSL,请遵循安装 OpenSSL 和配置 OpenSSL 中的说明。
-
从 OIDC IdP 的 URL 开始(例如,
https://server.example.com
),然后添加/.well-known/openid-configuration
以构成该 IdP 的配置文档的 URL,如下所示:https://
server.example.com
/.well-known/openid-configuration在 Web 浏览器中打开此 URL,将
server.example.com
替换为 IdP 的服务器名称。 -
在显示的文档中,使用 Web 浏览器 Find(查找)功能来定位文本
"jwks_uri"
。"jwks_uri"
文本后面会跟有一个冒号 (:),然后是一个 URL。复制 URL 的完全限定域名。不包括https://
或在顶级域后的任何路径。{ "issuer": "https://accounts.example.com", "authorization_endpoint": "https://accounts.example.com/o/oauth2/v2/auth", "device_authorization_endpoint": "https://oauth2.exampleapis.com/device/code", "token_endpoint": "https://oauth2.exampleapis.com/token", "userinfo_endpoint": "https://openidconnect.exampleapis.com/v1/userinfo", "revocation_endpoint": "https://oauth2.exampleapis.com/revoke", "jwks_uri": "https://
www.exampleapis.com
/oauth2/v3/certs", ... -
使用 OpenSSL 命令行工具可运行以下命令。将
keys.example.com
替换为您在步骤 3 中获取的域名。openssl s_client -servername
keys.example.com
-showcerts -connectkeys.example.com
:443 -
在命令窗口中向上滚动,直至看到类似于以下示例的证书。如果您查看多个证书,请找到显示的最后一个证书(在命令输出底部)。这包含证书颁发机构链中的顶级中间的 CA 的证书。
-----BEGIN CERTIFICATE----- MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6 b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ 21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4 nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE= -----END CERTIFICATE-----
复制证书(包括
-----BEGIN CERTIFICATE-----
和-----END CERTIFICATE-----
行)并将其粘贴到文本文件中。然后使用文件名certificate.crt
保存该文件。注意
OIDC 身份提供者的证书链必须以域或颁发者 URL 开始,包含任何中间证书(如果有),然后以根证书结尾。如果证书链顺序不同或者包含重复证书或其他证书,您将收到签名不匹配错误,并且 STS 无法验证 JSON Web 令牌(JWT)。更正服务器返回的链中证书的顺序以解决错误。有关证书链标准的更多信息,请参阅 RFC Series 网站上的 RFC 5246 中的 certificate_list
。 -
使用 OpenSSL 命令行工具可运行以下命令。
openssl x509 -in certificate.crt -fingerprint -sha1 -noout
您的命令窗口将显示类似于以下示例的证书指纹:
SHA1 Fingerprint=99:0F:41:93:97:2F:2B:EC:F1:2D:DE:DA:52:37:F9:C9:52:F2:0D:9E
请从此字符串中去掉冒号 (:) 字符以生成最终指纹,如:
990F4193972F2BECF12DDEDA5237F9C952F20D9E
-
如果要使用 AWS CLI、Tools for Windows PowerShell 或 IAM API 创建 IAM OIDC 身份提供者,则提供指纹是可选的。如果您选择在创建过程中不包含指纹,IAM 将检索 OIDC IdP 服务器证书的顶级中间 CA 指纹。创建 IAM OIDC 身份提供者后,您可以将此指纹与 IAM 检索到的指纹进行比较。
如果您在 IAM 控制台中创建 IAM OIDC 身份提供者,则控制台会尝试为您检索 OIDC IdP 服务器证书的顶级中间 CA 指纹。您可以将此指纹与 IAM 检索到的指纹进行比较。创建 IAM OIDC 身份提供者后,您可以在 OIDC 提供者摘要控制台页面的端点验证选项卡中查看IAM OIDC 身份提供者的指纹。
重要
如果您获得的指纹与您在 IAM OIDC 身份提供者指纹详细信息中看到的指纹不匹配,则不应使用 OIDC 提供者。相反,您应该删除已创建的 OIDC 提供者,然后在一段时间后再次尝试创建 OIDC 提供者。在使用提供者之前,请验证指纹是否匹配。如果第二次尝试后指纹仍然不匹配,请使用 IAM 论坛
联系 AWS。
安装 OpenSSL
如果您没有安装 OpenSSL,请按照本部分中的说明执行操作。
在 Linux 或 Unix 系统上安装 OpenSSL
-
转到 OpenSSL:源、Tarball
(https://openssl.org/source/)。 -
下载最新源并构建包。
如要在 Windows 系统上安装 OpenSSL
-
转到 OpenSSL:二进制分布
(https://wiki.openssl.org/index.php/Binaries),了解您可以从中安装 Windows 版本的站点列表。 -
按照所选站点上的说明开始安装。
-
如果系统要求您安装 Microsoft Visual C++ 2008 Redistributables 并且该程序尚未安装在您的系统上,请选择适合您环境的下载链接。按照 Microsoft Visual C++ 2008 Redistributable 安装向导中的说明操作。
注意
如果您不确定您的系统上是否已安装 Microsoft Visual C++ 2008 Redistributables,则可以尝试先安装 OpenSSL。如果尚未安装 Microsoft Visual C++ 2008 Redistributables,OpenSSL 安装程序将显示提示。请确保安装与您安装的 OpenSSL 版本匹配的体系架构(32 位或 64 位)。
-
在安装 Microsoft Visual C++ 2008 Redistributables 后,为您的环境选择适当的 OpenSSL 二进制版本,然后在本地保存该文件。启动 OpenSSL 设置向导。
-
按照 OpenSSL 设置向导中的说明进行操作。
配置 OpenSSL
在使用 OpenSSL 命令之前,您必须配置操作系统,使其具有有关 OpenSSL 安装位置的信息。
要在 Linux 或 Unix 上配置 OpenSSL
-
在命令行中,将
OpenSSL_HOME
变量设置为 OpenSSL 安装的位置:$
export OpenSSL_HOME=path_to_your_OpenSSL_installation
-
设置包含 OpenSSL 安装的路径:
$
export PATH=$PATH:$OpenSSL_HOME/bin注意
通过使用
export
命令行对环境变量所做的任何更改只对当前的会话有效。通过在 shell 配置文件中设置环境变量,可对环境变量进行持续更改。有关更多信息,请参阅您的操作系统文档。
要在 Windows 上配置 OpenSSL
-
打开 Command Prompt(命令提示符窗口)。
-
将
OpenSSL_HOME
变量设置为 OpenSSL 安装的位置:C:\>
set OpenSSL_HOME=path_to_your_OpenSSL_installation
-
将
OpenSSL_CONF
变量设置为 OpenSSL 安装中配置文件的位置:C:\>
set OpenSSL_CONF=path_to_your_OpenSSL_installation
\bin\openssl.cfg -
设置包含 OpenSSL 安装的路径:
C:\>
set Path=%Path%;%OpenSSL_HOME%\bin注意
通过 Command Prompt(命令提示符)对 Windows 环境变量所做的任何更改只对当前的命令行会话有效。您可以通过将环境变量设置为系统属性来对其进行持久性更改。确切的流程取决于您使用的 Windows 版本。(例如,在 Windows 7 中,打开 Control Panel(控制面板)、System and Security(系统和安全性)、System(系统)。然后选择 Advanced system settings(高级系统设置)、Advanced(高级)选项卡,Environment Variables(环境变量)。) 有关更多信息,请参阅 Windows 文档。