OAM 和 STS 中的密钥和证书管理和滚动更新

简介

作为联邦和 WS-Trust 协议交互的一部分,OAM/OSTS 需要使用 PKI 密钥和证书,通过数字加密使用数字签名和机密性来实现非拒绝和完整性。

本文讨论了密钥和证书管理,包括如何:

在联盟/WS-Trust 交换中,会发生以下情况:

具有 XML 数字签名的 SAML 消息示例:

 <samlp:Response ...>
   <saml:Issuer>https://idp.com</saml:Issuer>
   <samlp:Status>...</samlp:Status>
   <saml:Assertion ...>
     <saml:Issuer>https://idp.com</saml:Issuer>
     <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
       <ds:SignedInfo>
         <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-excc14n#"/>
         <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsasha1"/>
         <ds:Reference URI="#idhmf9KzAhxleuJ-L3vaVr979Ffa0">
           <ds:Transforms>
             <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#envelopedsignature"/>
             <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>           </ds:Transforms>
         <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
           <ds:DigestValue>JGvBqil/NXa6dlMOn5ZhmBbOie8=</DigestValue>
         </ds:Reference>
       </ds:SignedInfo>

 <ds:SignatureValue>VgOrU79ZJO4rzHiFTCDCGNmkb0...Y776QM4vEBBybIpbCCUih7I0aA==
 </ds:SignatureValue>
     </ds:Signature>
     <saml:Subject>
       <saml:NameID>alice@acme.com</saml:NameID>
       ...
     </saml:Subject>
     ...
     </saml:Assertion>
 </samlp:Response>

具有查询字符串签名的 SAML 消息示例(通常由 SP 使用 AuthnRequest 将用户发送到 IdP):

https://idp.com/saml20sso?SAMLRequest=hZJRT8IwFIX%2FStP3sW5BTW7YEhRREtQFplHeytZBQ9fW3i7Kv3cUTdAHfL09t985J3eEvFUV47wR68tkqjRAeMto5DYajRNC8FQi%2BguX4YQ7pgIF1xpvKKEom%2FZ7U3EujM7r13iLEsaztoDItJVPjKhEQGW24QkHJbLtTFyuuS7bbsLVcpK92OmdN8XYb9SLETsw0eq59RlOWDCOWRikrkytIhsAuV5QU3x6upa6l3pw3vD6KEO7LsoiKp2VJyYtDrEhgN1JEee%2F5YjCHbKHqC335%2BWHSZ%2B9CVIQ2ku%2Fp%2FlPaxhKG8UnRo6uLDz2i7NJYZSs9mSslPm4cYJ7kVkf%2BCdRisq2UhR0zg%2FQn9fQ%2F4F&RelayState=id-mAK1whfUGrvoLqqhU2ysXLWSIw-&SigAlg=http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23rsa-sha1&Signature=S5TZ0uwK9SMZUgBfDaipbNhlLqbbSG9t4rgA9n3%2FwxFsK7H66IoK6G%2BDfaIUvc5bLtTrwmxsa2iB2gjFx8pQ6%2FgH8OtFbT7mKZ7z8FihgxxTKjHJ2FQocOEn%2FrkcRKAAq%2Blig5xVSlR%2BzLq1vkQzIMNOrfLw%2FM6uk3i%2Fk

SAMLRequest:SAML AuthnRequest 消息

RelayState:SAML 2.0 中继状态参数

SigAlg:签名算法

Signature:包含 SAMLRequest、RelayState 和 SigAlg 参数的签名字节

OAM/OSTS PKI 密钥和证书存储在 $DOMAIN_HOME/config/fmwconfig/.oamkeystore Java 密钥库文件中(:此密钥库的类型为 JCEKS,不是 JKS),而 OAM/OSTS 设置引用 .oamkeystore 中的密钥条目,以便这些密钥和证书可供 SAML 操作的组件使用。

安装

在 OAM 的安装阶段,将生成密钥对和自签名证书,并将 OAM/OSTS 配置为将其用于签名和解密操作。

设置新密钥条目

在 OAM/OSTS 中使用新的 PKI 密钥和证书之前创建这些密钥和证书的过程包含两方面:

:密钥和证书需要存储在 .oamkeystore 中;不支持 HSM。

在 .oamkeystore 中创建新的密钥条目

如前所述,管理员不知道 .oamkeystore 密钥库的密码,需要重置该密码才能进行修改。此操作通过 WLST 命令完成:

  1. 通过执行 $IAM_ORACLE_HOME/common/bin/wlst.sh 进入 WLST 环境。

  2. 连接到 WLS 管理服务器:connect()

  3. 导航到域运行时分支:domainRuntime()

  4. 重置 .oamkeystore 密码:resetKeystorePassword()

  5. 退出 WLST 环境:exit()

在 .oamkeystore 中创建新密钥项的一种方法是使用 JDK 的 KeyTool 应用程序。在此示例中,创建了两个包含自签名证书的密钥条目,一个包含别名 samlsigning,另一个包含别名 samlencryption(用正确的路径替换 $JDK_HOME$DOMAIN_HOME;对于密钥库密码,输入您在重置操作期间选择的密钥条目):

$JDK_HOME/bin/keytool -genkeypair -alias samlsigning -keyalg RSA -keysize 2048-sigalg sha1withrsa -dname cn="ACME SAML Signing" -validity 1000 -keystore $DOMAIN_HOME/config/fmwconfig/.oamkeystore -storetype JCEKS
$JDK_HOME/bin/keytool -genkeypair -alias samlencryption -keyalg RSA -keysize 2048 -sigalg sha1withrsa -dname cn="ACME SAML Encryption" -validity 1000-keystore $DOMAIN_HOME/config/fmwconfig/.oamkeystore -storetype JCEKS

更新 OAM/OSTS 设置

在 .oamkeystore 中创建密钥条目后,必须在 OAM/OSTS 中创建新的 SAML 密钥条目,然后才能在 SAML 协议交换期间使用这些密钥。

要在 OAM/OSTS 中创建新的 SAML 密钥条目:

  1. 转到 OAM 管理控制台:http(s)://oam-admin-host:oam-adminport/oamconsole

  2. 导航到配置联盟设置或安全令牌服务设置

  3. 创建新条目:

    1. 在 "Keystore" 部分中,单击 "+" 按钮。

    2. 为新条目输入 KeyID(例如 saml-signing)。

    3. 从列出 .oamkeystore 中密钥条目的下拉列表中选择新密钥条目的别名(例如 samlsigning)。

    4. 输入在上一节中创建密钥时设置的密钥条目的密码。

    5. 如果需要,对其他条目重复该过程。

  4. 单击应用

插图 Federation_Settings.jpg 的说明

注:不同的密钥 ID 可以引用 OAM 密钥库中的相同密钥条目

使用新密钥条目

全局设置

要更新全局 OAM 设置以使用新密钥和证书对 SAML 消息进行签名和解密,请执行以下操作:

  1. 转到 OAM 管理控制台:http(s)://oam-admin-host:oam-admin-port/oamconsole

  2. 导航到配置联盟设置

  3. 从键项的下拉列表中选择 "Signing Key"(签名密钥)(这些条目在 "Keystore"(密钥库)部分中定义)。例如,选择 saml-signing

  4. 从密钥条目的下拉列表中选择加密密钥(这些条目在“密钥库”部分中定义)。例如,选择 saml-encryption

  5. 单击应用

注:应用后,您可能需要向合作伙伴重新分发证书和/或 SAML 2.0 元数据 )

插图 Global_Settings.jpg 的说明

要更新全局 OSTS 设置以使用新密钥和证书对 SAML 消息解密,请执行以下操作:

  1. 转到 OAM 管理控制台:http(s)://oam-admin-host:oam-adminport/oamconsole

  2. 导航到 ConfigurationSecurity Token Service Settings

  3. 从密钥条目的下拉列表中选择默认加密模板(这些条目在“密钥库”部分中定义)。例如,选择 samlencryption

  4. 单击应用

注意:申请后,您可能需要将证书重新分发给合作伙伴

插图 Security_Token_Service_Settings.jpg 的说明

要更新 OSTS 设置以使用新密钥和证书对 SAML 消息签名,请执行以下操作:

  1. 转到 OAM 管理控制台:http(s)://oam-admin-host:oam-admin- port/oamconsole

  2. 导航到 Security Token ServiceToken Issuance Templates

  3. 单击要更新的 SAML 发布模板。

  4. 单击“安全性”选项卡

  5. 从密钥条目的下拉列表中选择对密钥库访问模板 ID 进行签名(这些条目在“密钥库”部分中定义)。例如,选择 saml-signing

  6. 单击应用

注意:申请后,您可能需要将证书重新分发给合作伙伴

插图 Issuance_Template.jpg 的说明

按合作方的密钥滚转

当 OAM/OSTS 部署涉及众多合作伙伴时,可能很难同时更改全局签名/加密密钥/证书,因为这需要同时通知所有合作伙伴更改,并让他们使用新的证书/SAML 2.0 元数据更新其配置。

:更新 OAM/OSTS 中的密钥/证书后,联盟/WS-Trust 流在合作伙伴系统中上载新证书之前不会与合作伙伴一起工作。

OAM/OSTS 提供了一种在每个合作伙伴的基础上执行密钥滚转的简单方法,从而允许 OAM 管理员计划如何以及何时将密钥和证书更改通知特定合作伙伴。

注意:通过使用 OAM 配置中的合作伙伴概要信息,可以通过一组合作伙伴完成 OAM 密钥滚转。

OAM 密钥滚动更新

为特定合作伙伴执行密钥滚转时,首先需要通过 WLST 命令更新 OAM 中的 IdP 或 SP 合作伙伴配置:

  1. 通过执行 $IAM_ORACLE_HOME/common/bin/wlst.sh 进入 WLST 环境。

  2. 连接到 WLS 管理服务器:connect()

  3. 导航到域运行时分支:domainRuntime()

  4. 更新伙伴配置,将“签名密钥”属性(由 signingkeystoreaccesstemplateid 引用)设置为“联盟设置,密钥库”部分中定义的密钥条目 ID(在本例中,saml-signing 是密钥条目 ID;将 <PARTNER_NAME> 替换为 OAM 中的伙伴名称;将 <IDP_OR_SP> 替换为 IDP 或 SP,即伙伴的类型):

  5. updatePartnerProperty("<PARTNER_NAME>", "<IDP_OR_SP>","signingkeystoreaccesstemplateid", "saml-signing", "string")
    
  6. 更新伙伴配置,将 "Encryption Key"(加密密钥)属性(由 encryptionkeystoreaccesstemplateid 引用)设置为 "Association Settings"(联盟设置)、"Keystore"(密钥库)部分中定义的密钥条目 ID(在本示例中,saml-encryption 是密钥条目 ID;将 <PARTNER_NAME> 替换为 OAM 中的伙伴名称;将 <IDP_OR_SP> 替换为 IDP 或 SP(伙伴的类型):
  7. updatePartnerProperty("<PARTNER_NAME>", "<IDP_OR_SP>", "encryptionkeystoreaccesstemplateid", "saml-encryption", "string")
    
  8. 退出 WLST 环境:exit()

更新合作伙伴配置后,合作伙伴需要使用 SAML 2.0 元数据或证书信息。要生成此信息:

例如:http://oam.com/oamfed/idp/cert?id=saml-signing

注:在更新合作伙伴配置之前,可以先生成 SAML 2.0 元数据/证书并将其提供给合作伙伴。

OSTS 密钥滚动更新

要说明 OSTS 密钥滚转,请举例说明:

结转包括先切换 RP1,然后切换 RP2,再切换 RP3,以使这些伙伴使用新的 saml-signing 证书。

要切换 RP1,必须执行以下操作:

  1. 转到 OAM 管理控制台:http(s)://oam-admin-host:oam-admin- port/oamconsole

  2. 定位至安全令牌服务合作伙伴概要信息依赖方概要信息

  3. 创建名为 NewRPprofileA 的新依赖方配置文件,副本为 RPprofileA

  4. 导航到 Security Token ServiceToken Issuance Templates

  5. 创建名为 NewSAMLIssuanceA 的新 SAML 发布模板,副本为 SAMLIssuanceA

  6. 更新 NewRPprofileA 以引用 NewSAMLIssuanceA SAML 2.0 发布模板。

  7. 插图 New_RPProfile_A.jpg 的说明

  8. 在“安全性”选项卡中更新 NewSAMLIssuanceA SAML 2.0 发布模板以使用新的密钥条目。
  9. 插图 New_SAMLIssuanceA.jpg 的说明

  10. 导航到安全标记服务合作伙伴依赖方

  11. 打开 RP1 并将其配置为使用 NewRPprofileA 依赖方配置文件:从那时起,OSTS 使用新的密钥条目 saml-signing 为 RP1 依赖方合作伙伴签署传出 SAML 2.0 断言。

  12. 插图 Configure_RP1.jpg 的说明

  13. 通过打开浏览器从 OSTS 下载新证书,并使用以下 URL 以 PEM 格式生成证书。
  14. http://oam-runtime-host:oam-runtime-port/sts/servlet/samlcert?id=<KEYENTRY_ID>

  15. ID 查询参数包含证书的密钥条目 ID。

  16. 替换 <KEYENTRY_ID>

  17. 例如:http://oam.com/sts/servlet/samlcert?id=saml-signing

  18. 向合作伙伴提供证书。

将 RP2 切换到新证书会更快,因为已创建新的依赖方配置文件和 SAML 发布模板。

要切换 RP2,必须执行以下操作:

  1. 转到 OAM 管理控制台:http(s)://oam-admin-host:oam-adminport/oamconsole

  2. 导航到安全标记服务合作伙伴依赖方

  3. 打开 RP1 并将其配置为使用 NewRPprofileA 依赖方配置文件:从那时起,OSTS 使用新的密钥条目 saml-signing 为 RP1 依赖方合作伙伴签署传出 SAML 2.0 断言。

  4. 向合作伙伴提供证书。

将 RP3 切换到新证书包括重复对 RP1 执行的操作,因为尚未为 RP3 创建新的依赖方配置文件和 SAML 发布模板。

注:在更新 OSTS 配置之前,可以先向合作伙伴提供新证书。

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或在 Oracle Learning YouTube 频道上访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心