1.2. 如何保护管理接口

以下小节介绍了如何执行与保护 JBoss EAP 管理接口和相关子系统相关的各种操作。

注意

显示的管理 CLI 命令假定您正在运行 JBoss EAP 单机服务器。有关为 JBoss EAP 受管域使用管理 CLI 的详情,请查看 JBoss EAP 管理 CLI 指南

使用管理 CLI 集成 Elytron

可以使用来自 elytron 子系统的资源来保护管理界面,其方式与旧的安全域相同。

连接的 SSL 配置来自以下位置之一:

  • 特定于 CLI 配置中的任何 SSL 配置。
  • 自动提示用户接受服务器证书的默认 SSL 配置。
  • java 系统属性。

可使用 wildfly-config.xml 文件修改客户端配置。

注意

如果设置 -Dwildfly.config.url 属性,客户端都可以使用任何文件进行配置。

1.2.1. 配置联网和端口

根据主机的配置,可将 JBoss EAP 配置为使用各种网络接口和端口。这使得 JBoss EAP 能够处理不同的主机、网络和防火墙要求。

其他资源

1.2.2. 禁用管理控制台

其他客户端(如 JBoss 运营网络)操作使用 HTTP 接口来管理 JBoss EAP。为了继续使用这些服务,可能只禁用基于 Web 的管理控制台本身。这可以通过将 console-enabled 属性设置为 false 来完成。

流程

  • 在 JBoss EAP 中禁用基于 Web 的管理控制台:

    /core-service=management/management-interface=http-interface/:write-attribute(name=console-enabled,value=false)

1.2.3. 禁用对 JMX 的远程访问

通过远程访问 jmx 子系统,可以远程触发 JDK 和应用程序管理操作。

流程

  • 要在 JBoss EAP 中禁止远程访问 JMX,请删除 jmx 子系统中的补救连接器:

    /subsystem=jmx/remoting-connector=jmx/:remove

1.2.4. silent 身份验证

JBoss EAP 的默认安装包含本地管理 CLI 用户的内部身份验证方法。这允许本地用户在不进行用户名或密码身份验证的情况下访问管理 CLI。可以启用此功能,以便本地用户在不需要身份验证的情况下运行管理 CLI 脚本。它被视为一个有用的功能,因为访问本地配置通常也让用户能够添加他们自己的用户详情或者禁用安全检查。

可在需要更大的安全控制的情况下禁用静默身份验证。这可以通过删除配置文件的 security-realm 属性中的 local 元素来实现。这适用于独立实例和受管域。

重要

只有在对 JBoss EAP 实例的影响及其配置被完全理解时,才应执行本地元素删除。

流程

  1. 使用 elytron 子系统时删除静默身份验证:

    [standalone@localhost:9990 /] /subsystem=elytron/sasl-authentication-factory=managenet-sasl-authentication:read-resource
    {
        "outcome" => "success",
        "result" => {
            "mechanism-configurations" => [
                {
                    "mechanism-name" => "JBOSS-LOCAL-USER",
                    "realm-mapper" => "local"
                },
                {
                    "mechanism-name" => "DIGEST-MD5",
                    "mechanism-realm-configurations" => [{"realm-name" => "ManagementRealm"}]
                }
            ],
            "sasl-server-factory" => "configured",
            "security-domain" => "ManagementDomain"
        }
    }
    
    [standalone@localhost:9990 /] /subsystem=elytron/sasl-authentication-factory=managenet-sasl-authentication:list-remove(name=mechanism-configurations, index=0)
    
    [standalone@localhost:9990 /] reload
  2. 使用旧安全域时移除静默身份验证:

    /core-service=management/security-realm=<realm_name>/authentication=local:remove

1.2.5. 使用 Elytron 子系统进行管理接口的单向 SSL/TLS

在 JBoss EAP 中,您可以使用 JBoss EAP 管理 CLI 或管理控制台为管理接口启用单向 SSL/TLS。

在管理 CLI 中,可以通过两种方式启用单向 SSL/TLS:

在管理控制台中,可以启用单向 SSL/TLS,如下所示:

1.2.5.1. 使用安全命令启用单向 SSL/TLS

security enable-ssl-management 命令可以用来为管理接口启用单向 SSL/TLS。

流程

  • 在 CLI 中输入 security enable-ssl-management --interactive 命令。

    示例

    security enable-ssl-management --interactive
    
    Please provide required pieces of information to enable SSL:
    Key-store file name (default management.keystore): keystore.jks
    Password (blank generated): secret
    What is your first and last name? [Unknown]: localhost
    What is the name of your organizational unit? [Unknown]:
    What is the name of your organization? [Unknown]:
    What is the name of your City or Locality? [Unknown]:
    What is the name of your State or Province? [Unknown]:
    What is the two-letter country code for this unit? [Unknown]:
    Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct y/n [y]?
    Validity (in days, blank default): 365
    Alias (blank generated): localhost
    Enable SSL Mutual Authentication y/n (blank n): n
    
    SSL options:
    key store file: keystore.jks
    distinguished name: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
    password: secret
    validity: 365
    alias: localhost
    Server keystore file keystore.jks, certificate file keystore.pem and keystore.csr file
    will be generated in server configuration directory.
    Do you confirm y/n :y

注意
  • 执行命令后,管理 CLI 将重新加载服务器并重新连接该服务器。
  • 您可以使用 disable-ssl-management 命令为管理接口禁用单向 SSL/TLS。

    security disable-ssl-management

    此命令不会删除 Elytron 资源。它将系统配置为使用 ApplicationRealm legacy security realm 进行其 SSL 配置。

1.2.5.2. 使用 Elytron 子系统命令启用单向 SSL/TLS

您可以使用 elytron 子系统命令为管理接口启用单向 SSL/TLS。

流程

  1. 配置 密钥存储

    /subsystem=elytron/key-store=httpsKS:add(path=keystore.jks,relative-to=jboss.server.config.dir,credential-reference={clear-text=secret},type=JKS)
    注意

    以上命令使用 relative-to 来引用密钥存储文件的位置。或者,您也可以指定 路径中的 密钥存储的完整路径,省略 relative-to

    如果密钥存储文件尚不存在,则可以使用下列命令来生成示例密钥对:

    /subsystem=elytron/key-store=httpsKS:generate-key-pair(alias=localhost,algorithm=RSA,key-size=1024,validity=365,credential-reference={clear-text=secret},distinguished-name="CN=localhost")
    
    /subsystem=elytron/key-store=httpsKS:store()
  2. 创建 key-managerserver-ssl-context

    /subsystem=elytron/key-manager=httpsKM:add(key-store=httpsKS,credential-reference={clear-text=secret})
    
    /subsystem=elytron/server-ssl-context=httpsSSC:add(key-manager=httpsKM,protocols=["TLSv1.2"])
    重要

    红帽没有指定上一命令中的 algorithm 属性,因为 Elytron 子系统使用 KeyManagerFactory.getDefaultAlgorithm() 来确定算法。但是,您可以指定 algorithm 属性。要指定 algorithm 属性,您需要知道您使用的 JDK 提供了哪些关键管理器算法。例如,使用 SunJSSE 的 JDK 提供了 PKIXSunX509 算法。

    在上一命令中,您可以指定 SunX509 作为密钥管理器算法属性。

    您还需要确定您要支持的 HTTPS 协议。上面的示例命令使用 TLSv1.2

    您可以使用 cipher-suite-filter 指定密码套件,使用-cipher-suites-order 参数来遵循服务器密码套件顺序。use-cipher-suites-order 属性默认设置为 true。这与旧的 security 子系统行为不同,它默认为遵循客户端密码套件顺序。

  3. 在管理界面中启用 HTTPS。

    /core-service=management/management-interface=http-interface:write-attribute(name=ssl-context, value=httpsSSC)
    
    /core-service=management/management-interface=http-interface:write-attribute(name=secure-socket-binding, value=management-https)
  4. 重新加载 JBoss EAP 实例。

    reload

现在为管理界面启用了单向 SSL/TLS。

重要

如果您同时定义了 security-realmssl-context,JBoss EAP 将使用 ssl-context 提供的 SSL/TLS 配置。

1.2.5.3. 使用管理控制台启用单向 SSL/TLS

您可以使用管理控制台中的 SSL 向导为管理控制台中使用的管理界面启用 SSL。

流程

  1. 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
  2. 进入到 Runtime,单击适当的服务器名称。
  3. 点服务器名称旁边的 View
  4. HTTP Manageme…​ 以打开 HTTP Management Interface 配置页面。
  5. 启用 SSL 以启动向导。

    向导可以帮助您在以下场景中启用 SSL:

    • 您需要创建证书存储并生成自签名证书。
    • 您需要从 Let 的加密证书颁发机构获取证书。
    • 您已将证书存储在文件系统中,但没有密钥存储配置。
    • 您已经拥有使用有效证书存储的密钥存储配置。

使用向导,您可以选择性地为 mutual 验证创建信任存储。

1.2.6. 使用 Elytron 子系统进行管理接口的双向 SSL/TLS

在 JBoss EAP 中,可以使用安全命令或使用 elytron 子系统命令启用用于管理接口的双向 SSL/TLS。

要启用双向 SSL/TLS,首先您必须获取或生成客户端证书。您可以按照以下流程生成客户端证书:

然后您可以使用以下方法之一为管理接口启用双向 SSL/TLS:

1.2.6.1. 生成客户端证书

您可以在 CLI 中使用 keytool 命令生成客户端证书。

流程

  1. 生成客户端证书:

    $ keytool -genkeypair -alias client -keyalg RSA -keysize 1024 -validity 365 -keystore client.keystore.jks -dname "CN=client" -keypass secret -storepass secret
  2. 导出客户端证书:

    $ keytool -exportcert  -keystore client.keystore.jks -alias client -keypass secret -storepass secret -file /path/to/client.cer

1.2.6.2. 使用安全命令启用双向 SSL/TLS

security enable-ssl-management 命令可以用来为管理接口启用双向 SSL/TLS。

注意

以下示例没有信任链的验证证书。如果您使用可信证书,则在没有问题的情况下可以验证客户端证书。

先决条件

流程

  • 在 CLI 中输入 security enable-ssl-management --interactive 命令。

    示例

    security enable-ssl-management --interactive
    
    Please provide required pieces of information to enable SSL:
    Key-store file name (default management.keystore): server.keystore.jks
    Password (blank generated): secret
    What is your first and last name? [Unknown]: localhost
    What is the name of your organizational unit? [Unknown]:
    What is the name of your organization? [Unknown]:
    What is the name of your City or Locality? [Unknown]:
    What is the name of your State or Province? [Unknown]:
    What is the two-letter country code for this unit? [Unknown]:
    Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct y/n [y]?
    Validity (in days, blank default): 365
    Alias (blank generated): localhost
    Enable SSL Mutual Authentication y/n (blank n): y
    Client certificate (path to pem file): /path/to/client.cer
    Validate certificate y/n (blank y): n
    Trust-store file name (management.truststore): server.truststore.jks
    Password (blank generated): secret
    
    SSL options:
    key store file: server.keystore.jks
    distinguished name: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
    password: secret
    validity: 365
    alias: localhost
    client certificate: /path/to/client.cer
    trust store file: server.trustore.jks
    trust store password: secret
    Server keystore file server.keystore.jks, certificate file server.pem and server.csr file will be generated in server configuration directory.
    Server truststore file server.trustore.jks will be generated in server configuration directory.
    Do you confirm y/n: y

    注意
    • 执行命令后,管理 CLI 将重新加载服务器并尝试重新连接该服务器。

      要完成双向 SSL/TLS 身份验证,您需要将服务器证书导入到客户端信任存储中,并将您的客户端配置为显示客户端证书。

    • 您可以使用 disable-ssl-management 命令为管理接口禁用双向 SSL/TLS。

      security disable-ssl-management

      此命令不会删除 Elytron 资源。它将系统配置为使用 ApplicationRealm legacy security realm 进行其 SSL 配置。

1.2.6.3. 使用 Elytron 子系统命令启用双向 SSL/TLS

您可以使用 elytron 子系统命令为管理接口启用双向 SSL/TLS。

先决条件

流程

  1. 获取或生成密钥存储。

    在 JBoss EAP 中启用单向 SSL/TLS 之前,您必须获取或生成您计划使用的密钥存储、信任存储和证书。若要生成一组密钥存储、truststores 和证书的示例,可使用以下命令:

    1. 配置 密钥存储

      /subsystem=elytron/key-store=twoWayKS:add(path=server.keystore.jks,relative-to=jboss.server.config.dir,credential-reference={clear-text=secret},type=JKS)
      
      /subsystem=elytron/key-store=twoWayKS:generate-key-pair(alias=localhost,algorithm=RSA,key-size=1024,validity=365,credential-reference={clear-text=secret},distinguished-name="CN=localhost")
      
      /subsystem=elytron/key-store=twoWayKS:store()
      注意

      以上命令使用 relative-to 来引用密钥存储文件的位置。或者,您也可以指定 路径中的 密钥存储的完整路径,省略 relative-to

    2. 导出您的服务器证书。

      /subsystem=elytron/key-store=twoWayKS:export-certificate(alias=localhost,path=/path/to/server.cer,pem=true)
    3. 为服务器信任 存储 创建一个密钥存储,并将客户端证书导入到服务器信任存储中。

      注意

      以下示例没有信任链的验证证书。如果您使用可信证书,则在没有问题的情况下可以验证客户端证书。

      /subsystem=elytron/key-store=twoWayTS:add(path=server.truststore.jks,relative-to=jboss.server.config.dir,credential-reference={clear-text=secret},type=JKS)
      
      /subsystem=elytron/key-store=twoWayTS:import-certificate(alias=client,path=/path/to/client.cer,credential-reference={clear-text=secret},trust-cacerts=true,validate=false)
      
      /subsystem=elytron/key-store=twoWayTS:store()
  2. 为服务器密钥存储和 truststore 配置 key-managertrust-managerserver-ssl-context

    /subsystem=elytron/key-manager=twoWayKM:add(key-store=twoWayKS,credential-reference={clear-text=secret})
    
    /subsystem=elytron/trust-manager=twoWayTM:add(key-store=twoWayTS)
    
    /subsystem=elytron/server-ssl-context=twoWaySSC:add(key-manager=twoWayKM,protocols=["TLSv1.2"],trust-manager=twoWayTM,want-client-auth=true,need-client-auth=true)
    重要

    红帽没有在前面的命令中指定 algorithm 属性,因为 Elytron 子系统使用 KeyManagerFactory.getDefaultAlgorithm()TrustManagerFactory.getDefaultAlgorithm() 来确定算法。但是,您可以指定 algorithm 属性。要指定 algorithm 属性,您需要知道您使用的 JDK 提供了哪些关键管理器算法。例如,使用 SunJSSE 的 JDK 提供了 PKIXSunX509 算法。

    在上一命令中,您可以指定 SunX509 作为密钥管理器算法属性,将 PKIX 指定为信任管理器算法属性。

    您还需要确定您要支持的 HTTPS 协议。上面的示例命令使用 TLSv1.2

    您可以使用 cipher-suite-filter 指定密码套件,使用-cipher-suites-order 参数来遵循服务器密码套件顺序。use-cipher-suites-order 属性默认设置为 true。这与旧的 security 子系统行为不同,它默认为遵循客户端密码套件顺序。

  3. 在管理界面中启用 HTTPS。

    /core-service=management/management-interface=http-interface:write-attribute(name=ssl-context, value=twoWaySSC)
    
    /core-service=management/management-interface=http-interface:write-attribute(name=secure-socket-binding, value=management-https)
  4. 重新加载 JBoss EAP 实例。

    reload
    注意

    要完成双向 SSL/TLS 身份验证,您需要将服务器证书导入到客户端信任存储中,并将您的客户端配置为显示客户端证书。

  5. 将您的客户端配置为使用客户端证书。

    您需要将客户端配置为向服务器提供可信客户端证书,以完成双向 SSL/TLS 身份验证。例如,如果使用浏览器,您需要将可信证书导入到浏览器的信任存储中。

    这会导致强制双向 SSL/TLS 身份验证,而不将原始身份验证改为服务器管理。

    如果要更改原始身份验证方法,请参阅 JBoss EAP 的 How to Configure Identity Management 中的 Configure Authentication with Certificates 部分。

现在为管理界面启用了双向 SSL/TLS。

重要

如果您同时定义了 security-realmssl-context,JBoss EAP 将使用 ssl-context 提供的 SSL/TLS 配置。

1.2.7. 使用 CLI 安全性命令进行管理接口的 SASL 身份验证

您可以使用 CLI security 命令为管理界面启用和禁用 SASL 身份验证。您还可以使用命令对 SASL 机制重新排序。

启用 SASL 身份验证

在 JBoss EAP 中,使用 elytron SASL 身份验证程序(使用 elytron SASL 身份验证工厂)可使用 security enable-sasl-management 命令启用管理界面。此命令创建配置身份验证所需的所有非现有资源。默认情况下,此命令将包含的 SASL 工厂与 http-interface 相关联。

示例:启用 SASL 身份验证

security enable-sasl-management

Server reloaded.
Command success.
Authentication configured for management http-interface
sasl authentication-factory=management-sasl-authentication
security-domain=ManagementDomain

注意

执行命令后,管理 CLI 将重新加载服务器并重新连接该服务器。

如果 SASL 工厂已存在,则工厂将更新为使用 --mechanism 参数定义的机制。

如需参数列表,请参阅授权安全参数

禁用 SASL 身份验证

要删除活动 SASL 身份验证工厂,请使用以下命令:

security disable-sasl-management

另外,要从活跃的 SASL 身份验证工厂中删除特定机制,请使用以下命令:

security disable-sasl-management --mechanism=MECHANISM
重新排序 SASL 机制

定义 SASL 机制的顺序规定服务器如何对请求进行身份验证,并提供第一个匹配机制发送到客户端。

您可以通过将逗号分隔传递给 安全 reorder-sasl-management 命令来改变这个顺序,例如:

security reorder-sasl-management --mechanisms-order=MECHANISM1,MECHANISM2,...

其他资源

1.2.8. 使用 CLI 安全性命令对管理接口进行 HTTP 身份验证

您可以使用 CLI security 命令为管理界面启用和禁用 HTTP 身份验证。

启用 HTTP 验证

在 JBoss EAP 中,可通过 安全性 enable-http-auth-management 命令,为管理接口启用 HTTP 身份验证。这个命令只能将 http-interface 作为目标,并且没有附加参数,其中包含的 HTTP 身份验证工厂将与此接口相关联。

示例:启用 HTTP 身份验证

security enable-http-auth-management

Server reloaded.
Command success.
Authentication configured for management http-interface
http authentication-factory=management-http-authentication
security-domain=ManagementDomain

注意

执行命令后,管理 CLI 将重新加载服务器并重新连接该服务器。

如果 HTTP 工厂已存在,则工厂将更新为使用 --mechanism 参数定义的机制。

如需参数列表,请参阅授权安全参数

禁用 HTTP 身份验证

要删除活动的 HTTP 身份验证工厂,请使用以下命令。

security disable-http-auth-management

或者,您可以使用以下命令从活跃的 HTTP 验证工厂中删除特定机制。

security disable-http-auth-management --mechanism=MECHANISM

其他资源

1.2.9. 使用旧的内核管理验证为单向 SSL/TLS 配置管理接口

仅使用单向 SSL/TLS 为通信配置 JBoss EAP 管理接口可以提供更高的安全性。客户端和管理界面之间的所有网络流量都是加密的,这降低了安全攻击的风险,比如中间人攻击。

在此过程中,禁用与 JBoss EAP 实例的未加密通信。此流程适用于独立服务器和受管域配置。对于受管域,使用主机名称作为管理 CLI 命令前缀,例如: /host=master

重要

在在管理界面中启用单向 SSL/TLS 的步骤时,除非明确指示,否则不要重新加载配置。这样做可能会导致您被锁定在管理界面中。

  1. 创建密钥存储来保护管理接口。

    如需更多信息,请参阅创建密钥存储来保护管理界面

  2. 确保管理接口绑定到 HTTPS。

    如需更多信息,请参阅确保管理接口绑定到 HTTPS

  3. 可选: 实施自定义 socket-binding-group

    如需更多信息,请参阅自定义 socket-binding-group

  4. 创建新的安全域。

    如需更多信息,请参阅创建新的安全域

  5. 配置管理接口以使用新的安全域。

    如需更多信息,请参阅配置管理界面以使用安全域

  6. 配置管理接口以使用密钥存储。

    如需更多信息,请参阅配置管理接口以使用密钥存储

  7. 更新 jboss-cli.xml

    如需更多信息,请参阅更新 jboss-cli.xml 文件

1.2.9.1. 创建密钥存储来保护管理接口

创建密钥存储来保护管理接口。

此密钥存储必须采用 JKS 格式,因为管理接口与 JCEKS 格式的密钥存储不兼容。

流程

  • 使用以下 CLI 命令创建密钥存储:

    将参数的示例值(如 别名,keypass,keystore,storepassdname )替换为环境的正确值。

    $ keytool -genkeypair -alias appserver -storetype jks -keyalg RSA -keysize 2048 -keypass password1 -keystore EAP_HOME/standalone/configuration/identity.jks -storepass password1 -dname "CN=appserver,OU=Sales,O=Systems Inc,L=Raleigh,ST=NC,C=US" -validity 730 -v
注意

参数 validity 指定密钥有效的天数。730 等于两年。

1.2.9.2. 确保管理接口绑定到 HTTPS

配置 JBoss EAP 以确保管理界面绑定到 HTTPS。

流程

  • 运行独立服务器时的配置

    要确保管理接口绑定到 HTTPS,您必须添加 management-https 配置并移除 management-http 配置。

    使用以下 CLI 命令,将管理接口绑定到 HTTPS:

    /core-service=management/management-interface=http-interface:write-attribute(name=secure-socket-binding, value=management-https)
    
    /core-service=management/management-interface=http-interface:undefine-attribute(name=socket-binding)
  • 运行受管域时的配置

    通过添加 secure-port 和删除端口配置来更改 management-interface 属性中的 socket 元素。

    使用以下命令将管理接口绑定到 HTTPS:

    /host=master/core-service=management/management-interface=http-interface:write-attribute(name=secure-port,value=9993)
    
    /host=master/core-service=management/management-interface=http-interface:undefine-attribute(name=port)

1.2.9.3. 自定义 socket-binding-group

如果要使用自定义 socket-binding-group,您必须确保定义了 management-https 绑定,默认绑定到端口 9993。您可以从服务器配置文件的 socket-binding-group 属性或使用管理 CLI 验证这一点:

/socket-binding-group=standard-sockets/socket-binding=management-https:read-resource(recursive=true)

{
    "outcome" => "success",
    "result" => {
        "client-mappings" => undefined,
        "fixed-port" => false,
        "interface" => "management",
        "multicast-address" => undefined,
        "multicast-port" => undefined,
        "name" => "management-https",
        "port" => expression "${jboss.management.https.port:9993}"
    }
}

1.2.9.4. 创建新的安全域

创建新的安全域。

在此过程中,使用 HTTPS(ManagementRealmHTTPS)的新安全 realm 会使用位于 EAP_HOME/standalone/configuration/ 目录中的名为 https-mgmt-users.properties 的属性文件来存储用户名和密码。

流程

  1. 创建用于存储用户名和密码的属性文件。

    可以稍后向文件中添加用户名和密码,但现在您需要创建一个名为 https-mgmt-users.properties 的空文件,并将它保存到该位置。以下示例显示使用 touch 命令,但也可以使用其他机制,如文本编辑器。

    示例:使用 touch 命令创建一个空文件

    $ touch EAP_HOME/standalone/configuration/https-mgmt-users.properties

  2. 接下来,使用以下管理 CLI 命令创建名为 ManagementRealmHTTPS 的新安全域:

    /core-service=management/security-realm=ManagementRealmHTTPS:add
    
    /core-service=management/security-realm=ManagementRealmHTTPS/authentication=properties:add(path=https-mgmt-users.properties,relative-to=jboss.server.config.dir)
  3. 将用户添加到属性文件中。

    此时,您已创建一个新的安全域,并将其配置为使用属性文件进行身份验证。现在,您必须使用 add-user 脚本将用户添加到属性文件,该文件位于 EAP_HOME/bin/ 目录中。在运行 add-user 脚本时,您必须分别使用 -up-r 选项指定属性文件和安全域。在那里,add-user 脚本将以互动方式提示您输入用户名和密码信息,以便存储在 https-mgmt-users.properties 文件中。

    $ EAP_HOME/bin/add-user.sh -up EAP_HOME/standalone/configuration/https-mgmt-users.properties -r ManagementRealmHTTPS
    ...
    Enter the details of the new user to add.
    Using realm 'ManagementRealmHTTPS' as specified on the command line.
    ...
    Username : httpUser
    Password requirements are listed below. To modify these restrictions edit the add-user.properties configuration file.
     - The password must not be one of the following restricted values {root, admin, administrator}
     - The password must contain at least 8 characters, 1 alphabetic character(s), 1 digit(s), 1 non-alphanumeric symbol(s)
     - The password must be different from the username
    ...
    Password :
    Re-enter Password :
    About to add user 'httpUser' for realm 'ManagementRealmHTTPS'
    ...
    Is this correct yes/no? yes
    ..
    Added user 'httpUser' to file 'EAP_HOME/configuration/https-mgmt-users.properties'
    ...
    Is this new user going to be used for one AS process to connect to another AS process?
    e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls.
    yes/no? no
    重要

    在配置使用属性文件存储用户名和密码的安全域时,建议每个域都使用一个不与其他域共享的不同属性文件。

1.2.9.5. 配置管理接口以使用安全域

您可以使用管理 CLI 命令将管理接口配置为使用安全域。

流程

  • 使用以下管理 CLI 命令:

    /core-service=management/management-interface=http-interface:write-attribute(name=security-realm,value=ManagementRealmHTTPS)

1.2.9.6. 配置管理接口以使用密钥存储

利用管理 CLI 命令,将管理接口配置为使用密钥存储。

流程

  1. 使用以下管理 CLI 命令,将管理接口配置为使用密钥存储:

    对于参数文件,密码和别名值必需是来自创建一个密钥存储来保护管理接口安全步骤。

    /core-service=management/security-realm=ManagementRealmHTTPS/server-identity=ssl:add(keystore-path=identity.jks,keystore-relative-to=jboss.server.config.dir,keystore-password=password1, alias=appserver)
    注意

    要更新密钥存储密码,请使用以下 CLI 命令:

    /core-service=management/security-realm=ManagementRealmHTTPS/server-identity=ssl:write-attribute(name=keystore-password,value=newpassword)
  2. 重新载入服务器的配置:

    reload

    重新载入服务器配置后,日志应包含以下内容,只有在文本前显示启动的服务数量:

    13:50:54,160 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0061: Http management interface listening on https://127.0.0.1:9993/management
    13:50:54,162 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0052: Admin console listening on https://127.0.0.1:9993

管理接口现在侦听端口 9993,这确认过程是否成功。

重要

此时,CLI 将断开连接,并且因为端口绑定已更改后无法重新连接。

继续下一步,以更新 jboss-cli.xml 文件,以允许管理 CLI 重新连接。

1.2.9.7. 更新 jboss-cli.xml 文件

如果使用管理 CLI 执行管理操作,您必须更新 EAP_HOME/bin/jboss-cli.xml 文件。

流程

  • 更新 EAP_HOME/bin/jboss-cli.xml 文件,如下所示:

    • <default-protocol> 的值更新为 https-remoting
    • <default-controller> 中,将 <protocol> 的值更新为 https-remoting
    • <default-controller> 中,将 <port> 的值更新为 9993

    示例: jboss-cli.xml

    <jboss-cli xmlns="urn:jboss:cli:2.0">
        <default-protocol use-legacy-override="true">https-remoting</default-protocol>
        <!-- The default controller to connect to when 'connect' command is executed w/o arguments -->
        <default-controller>
            <protocol>https-remoting</protocol>
            <host>localhost</host>
            <port>9993</port>
        </default-controller>
    ...

下次使用管理 CLI 连接到管理界面时,您必须接受服务器证书并根据 ManagementRealmHTTPS 安全域进行身份验证:

示例:接受服务器证书和身份验证

$ ./jboss-cli.sh -c
Unable to connect due to unrecognised server certificate
Subject    - CN=appserver,OU=Sales,O=Systems Inc,L=Raleigh,ST=NC,C=US
Issuer     - CN=appserver, OU=Sales, O=Systems Inc, L=Raleigh, ST=NC, C=US
Valid From - Tue Jun 28 13:38:48 CDT 2016
Valid To   - Thu Jun 28 13:38:48 CDT 2018
MD5 : 76:f4:81:8b:7e:c3:be:6d:ee:63:c1:7a:b7:b8:f0:fb
SHA1 : ea:e3:f1:eb:53:90:69:d0:c9:69:4a:5a:a3:20:8f:76:c1:e6:66:b6

Accept certificate? [N]o, [T]emporarily, [P]ermenantly : p
Authenticating against security realm: ManagementRealmHTTPS
Username: httpUser
Password:
[standalone@localhost:9993 /]

重要

如果您同时定义了 security-realmssl-context,JBoss EAP 将使用 ssl-context 提供的 SSL/TLS 配置。

1.2.10. 为使用旧核心管理身份验证的管理接口设置双向 SSL/TLS

双向 SSL/TLS 身份验证(也称为 客户端身份验证 )使用 SSL/TLS 证书验证客户端和服务器。这与 为单向 SSL/TLS 部分配置管理接口 不同,其中的客户端和服务器都有证书。这提供了保证,不仅显示它的服务器,而且客户端也表示它是什么。

本节使用以下惯例:

HOST1
JBoss 服务器主机名。例如: jboss.redhat.com
HOST2
适合客户端的名称。例如: myclient。请注意,这不一定是实际的主机名。
CA_HOST1
用于 HOST1 证书的 DN(区分名称)。例如: cn=jboss,dc=redhat,dc=com
CA_HOST2
用于 HOST2 证书的 DN(区分名称)。例如: cn=myclient,dc=redhat,dc=com
注意

如果使用了密码 vault 来存储密钥存储和信任存储密码,则应当已经创建密码 vault。有关密码库的更多信息,请参阅 Red Hat JBoss Enterprise Application Platform 7 安全架构指南中的 Password Vault 部分以及 Password Vault System 部分。

警告

红帽建议显式禁用 SSLv2、SSLv3 和 TLSv1.0,以便在所有受影响的软件包中明确禁用 TLSv1.1 或 TLSv1.2。

流程

  1. 生成密钥存储。

    $ keytool -genkeypair -alias HOST1_alias -keyalg RSA -keysize 1024 -validity 365 -keystore HOST1.keystore.jks -dname "CA_HOST1" -keypass secret -storepass secret
    
    $ keytool -genkeypair -alias HOST2_alias -keyalg RSA -keysize 1024 -validity 365 -keystore HOST2.keystore.jks -dname "CA_HOST2" -keypass secret -storepass secret
  2. 导出证书。

    $ keytool -exportcert  -keystore HOST1.keystore.jks -alias HOST1_alias -keypass secret -storepass secret -file HOST1.cer
    
    $ keytool -exportcert  -keystore HOST2.keystore.jks -alias HOST2_alias -keypass secret -storepass secret -file HOST2.cer
  3. 将证书导入到而非信任存储中。

    $ keytool -importcert -keystore HOST1.truststore.jks -storepass secret -alias HOST2_alias -trustcacerts -file HOST2.cer
    
    $ keytool -importcert -keystore HOST2.truststore.jks -storepass secret -alias HOST1_alias -trustcacerts -file HOST1.cer
  4. 定义证书。

    在服务器(host.xmlstandalone.xml)的配置中定义 CertificateRealm,并将接口指向该服务器。这可以通过以下命令完成:

    /core-service=management/security-realm=CertificateRealm:add()
    
    /core-service=management/security-realm=CertificateRealm/server-identity=ssl:add(keystore-path=/path/to/HOST1.keystore.jks, keystore-password=secret,alias=HOST1_alias)
    
    /core-service=management/security-realm=CertificateRealm/authentication=truststore:add(keystore-path=/path/to/HOST1.truststore.jks,keystore-password=secret)
  5. http-interfacesecurity-realm 更改为新的 CertificateRealm。

    /core-service=management/management-interface=http-interface:write-attribute(name=security-realm,value=CertificateRealm)
  6. 为 CLI 添加 SSL/TLS 配置。

    重要

    除了添加双向 SSL/TLS 外,还必须将管理接口配置为绑定到 HTTPS。详情请参阅 在标题为使用旧核心管理身份验证的 单向 SSL/TLS 中配置管理接口部分的管理接口(如网络接口绑定)部分的 HTTPS

    为 CLI 添加 SSL/TLS 配置,该配置使用 EAP_HOME/bin/jboss-cli.xml 作为设置文件。

    要将密钥存储和信任存储密码以纯文本形式存储,请编辑 EAP_HOME/bin/jboss-cli.xml 并使用变量的适当值添加 SSL/TLS 配置:

    示例:jboss-cli.xml 存储密钥存储和 Truststore Passwords(明文形式)

    <ssl>
      <alias>HOST2_alias</alias>
      <key-store>/path/to/HOST2.keystore.jks</key-store>
      <key-store-password>secret</key-store-password>
      <trust-store>/path/to/HOST2.truststore.jks</trust-store>
      <trust-store-password>secret</trust-store-password>
      <modify-trust-store>true</modify-trust-store>
    </ssl>

    要使用存储在密码库中的密钥存储和信任存储密码,您需要将 vault 配置和适当的 vault 值添加到 EAP_HOME/bin/jboss-cli.xml 中:

    示例:jboss-cli.xmltoring Keystore 和 Truststore Passwords(明文形式)

    <ssl>
      <vault>
        <vault-option name="KEYSTORE_URL" value="path-to/vault/vault.keystore"/>
        <vault-option name="KEYSTORE_PASSWORD" value="MASK-5WNXs8oEbrs"/>
        <vault-option name="KEYSTORE_ALIAS" value="vault"/>
        <vault-option name="SALT" value="12345678"/>
        <vault-option name="ITERATION_COUNT" value="50"/>
        <vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/>
      </vault>
      <alias>HOST2_alias</alias>
      <key-store>/path/to/HOST2.keystore.jks</key-store>
      <key-store-password>VAULT::VB::cli_pass::1</key-store-password>
      <key-password>VAULT::VB::cli_pass::1</key-password>
      <trust-store>/path/to/HOST2.truststore.jks</trust-store>
      <trust-store-password>VAULT::VB::cli_pass::1</trust-store-password>
      <modify-trust-store>true</modify-trust-store>
    </ssl>

重要

如果您同时定义了 security-realmssl-context,JBoss EAP 将使用 ssl-context 提供的 SSL/TLS 配置。

1.2.11. HTTPS Listener 参考

如需可用于 HTTPS 侦听器的属性的完整列表,请参阅 JBoss EAP 配置指南中的 Undertow 子系统属性 小节。

1.2.11.1. 关于 Cipher Suites

您可以配置允许的加密密码列表。对于 JSSE 语法,它必须用逗号分开的列表。对于 OpenSSL 语法,它必须是以冒号分隔的列表。确定只使用一个语法。默认为 JVM 默认。

重要

使用弱密码是一个重大安全风险。有关加密套件的 NIST 建议,请参阅 NIST 指南

有关可用 OpenSSL 密码列表,请查看 OpenSSL 文档。请注意,不支持以下内容:

  • @SECLEVEL
  • SUITEB128
  • SUITEB128ONLY
  • SUITEB192

有关 标准 JSSE 密码列表, 请参见 Java 文档。

要更新启用的密码套件的列表,请在 undertow 子系统中使用 HTTPS 侦听器的 enabled-cipher-suites 属性。

示例:更新 Enabled Cipher Suites 列表的管理 CLI 命令

/subsystem=undertow/server=default-server/https-listener=https:write-attribute(name=enabled-cipher-suites,value="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA")

注意

这个示例只列出两个可能的密码,但实际示例可能会使用更多。

1.2.12. 使用 OpenSSL 供应商启用对 TLS 1.3 协议的支持

您可以通过在 ssl-context 配置中配置 cipher-suite-names 属性,通过为 TLS 启用对 TLS 1.3 协议的支持。选择以下方法之一将 JBoss EAP 配置为使用 OpenSSL TLS 供应商:

  • 将 Elytron 子系统配置为使用 OpenSSL TLS 供应商。
  • 配置 server-ssl-context 组件的 provider 属性,或将 client-ssl-context 组件配置为使用 OpenSSL TLS 供应商。
重要

与 TLS 1.2 相比,在使用 JDK 11 运行 TLS 1.3 时您可能会体验到较低的性能。当客户端向服务器发出大量 TLS 1.3 请求时会出现这种情况。系统升级到较新的 JDK 版本可以提高性能。在生产环境中启用前,使用 TLS 1.3 测试您的设置是否出现性能下降的问题。

先决条件

  • 为应用程序启用单向 SSL/TLS 或双向 SSL/TLS。

流程

  1. 选择以下一种方法之一将 JBoss EAP 7.4 实例配置为使用 OpenSSL TLS 供应商:

    1. elytron 子系统配置为使用 OpenSSL TLS 供应商。要做到这一点,删除默认的 final-providers 配置,它会在所有全局注册的供应商后注册 OpenSSL TLS 供应商。

      /subsystem=elytron:undefine-attribute(name=final-providers)
      reload

      接下来,在所有全局注册的供应商前注册 OpenSSL TLS 供应商。

      /subsystem=elytron:write-attribute(name=initial-providers, value=combined-providers)
    2. 配置 server-ssl-contextclient-ssl-contextproviders 属性以使用 OpenSSL TLS 供应商。

      为名为 serverSSC 的现有 server-ssl-context 设置 providers 属性的示例。

      /subsystem=elytron/server-ssl-context=serverSSC:write-attribute(name=providers,value=openssl)
      reload

  2. 可选: 如果您将 ssl-context 配置为使用 TLS 1.3 协议以外的协议,您必须在 ssl-context 中配置 protocol 属性使其包含 TLS 1.3 协议:

    /subsystem=elytron/server-ssl-context=serverSSC:write-attribute(name=protocols,value=[TLSv1.3])
  3. 通过在 ssl-context 配置中配置 password -suite-names 属性,启用对 OpenSSL 供应商的 TLS 1.3 协议的支持。以下示例将 TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256 设置为 password -suite-names 属性的值:

    /subsystem=elytron/server-ssl-context=serverSSC:write-attribute(name=cipher-suite-names,value=TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256)
  4. 重新载入 JBoss EAP 实例:

    reload
  5. 可选: 测试您可以使用 TLS 1.3 协议和 TLS 1.3 密码套件成功与服务器建立 SSL 加密连接。使用 curl 等工具检查配置的输出:

    curl -v https://<ip_address>:<ssl_port>

    显示 TLS_AES_256_GCM_SHA384 带有 TLS 1.3 协议来保护 SSL 连接的输出示例。

    SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
    * ALPN, server accepted to use h2
    * Server certificate:
    *  subject: C=Unknown; ST=Unknown; L=Unknown; O=Unknown; OU=Unknown; CN=localhost
    *  start date: Oct  6 14:58:16 2020 GMT
    *  expire date: Nov  5 15:58:16 2020 GMT
    *  issuer: C=Unknown; ST=Unknown; L=Unknown; O=Unknown; OU=Unknown; CN=localhost
    *  SSL certificate verify result: self signed certificate (18), continuing anyway.

其他资源

1.2.13. FIPS 140-2 Compliant Cryptography

可使用以下任一方法在 Red Hat Enterprise Linux 上配置 FIPS 140-2 兼容加密。

1.2.13.1. 在 Red Hat Enterprise Linux 7 及之后的版本中为 SSL/TLS 启用 FIPS 140-2 Cryptography

您可以将 Undertow 配置为将 FIPS 140-2 兼容加密用于 SSL/TLS。此配置示例的范围仅限于 Red Hat Enterprise Linux 7 及之后的版本,在 FIPS 模式中使用 Mozilla NSS 库。

重要

安装的 Red Hat Enterprise Linux 必须已经配置为符合 FIPS 140-2。如需更多信息,请参阅标题为 How can make RHEL 6 或 RHEL 7 FIPS 140-2 的解决方案(在红帽客户门户网站中 )。

警告

在以 FIPS 模式运行时使用 TLS 1.2 协议可能会导致 NoSuchAlgorithmException。有关此问题的更多详细信息,请参阅标题为 NoSuchAlgorithmException: no such algorithm: SunTls12MasterSecret,它位于红帽客户门户网站。

因此,无法在 FIPS 模式中配置 HTTP/2,因为 HTTP/2 需要 TLS 1.2 协议。FIPS 模式(PKCS11)支持 TLS 1 和 TLS 1.1 协议,以便您可以使用:

  • Oracle/OpenJDK:TLS 1.1
  • IBM java:TLS 1

要将 Undertow 配置为对 SSL/TLS 使用 FIPS 140-2 兼容加密,您必须执行以下操作:

注意

OpenSSL 供应商需要一个私钥,但无法从 PKCS11 存储中检索私钥。FIPS 不允许从 FIPS 兼容的加密模块导出未加密的密钥。因此,对于 elytron 子系统和旧的安全性,在 FIPS 模式中无法将 OpenSSL 供应商用于 TLS。

配置 NSS 数据库
  1. 创建由适当用户拥有的目录,以存放 NSS 数据库。

    创建 NSS 数据库目录的命令示例

    $ mkdir -p /usr/share/jboss-as/nssdb
    $ chown jboss /usr/share/jboss-as/nssdb
    $ modutil -create -dbdir /usr/share/jboss-as/nssdb

    注意
    • DBM 文件格式,RHEL 7 及更早版本的默认数据库格式已被弃用。NSS 现在默认使用 SQL
    • jboss 用户只是一个示例。使用操作系统上的活跃用户替换它来运行 JBoss EAP。
  2. 创建 NSS 配置文件: /usr/share/jboss-as/nss_pkcsll_fips.cfg

    它必须指定:

    • 一个名称
    • NSS 库所在的目录
    • 上一步中创建的 NSS 数据库的目录

      示例: nss_pkcsll_fips.cfg

      name = nss-fips
      nssLibraryDirectory=/usr/lib64
      nssSecmodDirectory=/usr/share/jboss-as/nssdb
      nssDbMode = readOnly
      nssModule = fips

      注意

      如果您没有运行 64 位版本的 Red Hat Enterprise Linux 6,那么 nss1028Directory 设为 /usr/lib,而不是 /usr/lib64

  3. 编辑 Java 安全配置文件。此配置文件会影响整个 JVM,并可使用以下任一方式进行定义。

    • JDK 中提供了默认配置文件 java.security。如果没有指定其他安全配置文件,则使用此文件。有关此文件的位置,请查看 JDK 供应商的文档。
    • 定义自定义 Java 安全配置文件,并使用 -Djava.security.properties=/path/to/java.security.properties 来引用。以这种方式引用时,它会覆盖默认安全文件中的设置。在需要不同安全设置的同一主机上运行的多个 JVM 时,此选项很有用。

      在您的 Java 安全配置文件中添加以下行:

      示例: java.security

      security.provider.1=sun.security.pkcs11.SunPKCS11 /usr/share/jboss-as/nss_pkcsll_fips.cfg

      注意

      上述行中指定的 nss_pkcsll_fips.cfg 配置文件是上一步中创建的文件。

      您还需要从以下位置更新配置文件中的以下链接:

      security.provider.5=com.sun.net.ssl.internal.ssl.Provider

      security.provider.5=com.sun.net.ssl.internal.ssl.Provider SunPKCS11-nss-fips
      重要

      此文件中的任何其他 security.provider.X 行(如 security.provider.2)都必须增加其 X 的值,以确保此 provider 具有优先权。

  4. 在您在上一步中创建的 NSS 数据库目录上运行 modutil 命令以启用 FIPS 模式。

    modutil -fips true -dbdir /usr/share/jboss-as/nssdb
    注意

    此时您可能会收到一个安全库错误,要求您为某些 NSS 共享对象重新生成库签名。

  5. 在 FIPS 令牌中设置密码。

    令牌的名称必须NSS FIPS 140-2 Certificate DB

    modutil -changepw "NSS FIPS 140-2 Certificate DB" -dbdir /usr/share/jboss-as/nssdb
    重要

    用于 FIPS 令牌的密码必须是 FIPS 兼容密码。如果密码不够强,您可能会收到错误: ERROR: Unable to change password on token "NSS FIPS 140-2 Certificate DB"。

  6. 使用 NSS 工具创建证书。

    示例命令

    $ certutil -S -k rsa -n undertow -t "u,u,u" -x -s "CN=localhost, OU=MYOU, O=MYORG, L=MYCITY, ST=MYSTATE, C=MY" -d /usr/share/jboss-as/nssdb

  7. 运行以下命令,验证 JVM 是否可以从 PKCS11 密钥存储读取私钥:

    $ keytool -list -storetype pkcs11
重要

启用 FIPS 后,您可能会在启动 JBoss EAP 时看到以下错误:

10:16:13,993 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-1) MSC000001: Failed to start service jboss.server.controller.management.security_realm.ApplicationRealm.key-manager: org.jboss.msc.service.StartException in service jboss.server.controller.management.security_realm.ApplicationRealm.key-manager: WFLYDM0018: Unable to start service
	at org.jboss.as.domain.management.security.AbstractKeyManagerService.start(AbstractKeyManagerService.java:85)
	at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1963)
	at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1896)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.security.KeyStoreException: FIPS mode: KeyStore must be from provider SunPKCS11-nss-fips
	at sun.security.ssl.KeyManagerFactoryImpl$SunX509.engineInit(KeyManagerFactoryImpl.java:67)
	at javax.net.ssl.KeyManagerFactory.init(KeyManagerFactory.java:256)
	at org.jboss.as.domain.management.security.AbstractKeyManagerService.createKeyManagers(AbstractKeyManagerService.java:130)
	at org.jboss.as.domain.management.security.AbstractKeyManagerService.start(AbstractKeyManagerService.java:83)
	... 5 more

如果您已配置了任何现有的密钥管理器,如旧核心管理身份验证中的默认密钥管理器(不使用 FIPS 140-2 加密),则将显示此消息。

为 FIPS 140-2 Compliant Cryptography 配置管理 CLI

您必须将 JBoss EAP 管理 CLI 配置为在启用了 SSL/TLS 的 FIPS 140-2 兼容加密的环境中工作。默认情况下,如果您尝试在此类环境中使用管理 CLI,则会抛出以下异常: org.jboss.as.cli.CliProcessException: java.security.KeyManagementException: FIPS 模式: 只能使用 SunJSSE TrustManagers

  • 如果您使用传统的 security 子系统:

    更新 jboss-cli.sh 文件中的 javax.net.ssl.keyStorejavax.net.ssl.trustStore 系统属性,如下所示:

    JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.trustStore=NONE -Djavax.net.ssl.trustStoreType=PKCS11"
    JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.keyStore=NONE -Djavax.net.ssl.keyStoreType=PKCS11 -Djavax.net.ssl.keyStorePassword=P@ssword123"
  • 如果您使用 elytron 子系统:

    1. 使用以下内容为管理 CLI 创建 XML 配置文件:

      示例: cli-wildfly-config.xml

      <configuration>
        <authentication-client xmlns="urn:elytron:client:1.2">
          <key-stores>
            <key-store name="truststore" type="PKCS11">
              <key-store-clear-password password="P@ssword123"/>
            </key-store>
          </key-stores>
          <ssl-contexts>
            <ssl-context name="client-cli-context">
              <trust-store key-store-name="truststore"/>
              <cipher-suite selector="${cipher.suite.filter}"/>
              <protocol names="TLSv1.1"/>
            </ssl-context>
          </ssl-contexts>
          <ssl-context-rules>
            <rule use-ssl-context="client-cli-context"/>
          </ssl-context-rules>
        </authentication-client>
      </configuration>

      注意

      如果使用 IBM JDK,请参阅 IBM 管理 CLI 配置示例 以了解所需的具体配置。

    2. 启动管理 CLI 时,使用 -Dwildfly.config.url 属性将配置文件传递给管理 CLI 脚本。例如:

      $ jboss-cli.sh -Dwildfly.config.url=cli-wildfly-config.xml
配置 Elytron 和 Undertow 子系统
  1. 添加 FIPS 140-2 兼容加密密钥 存储key-managerssl-context

    /subsystem=elytron/key-store=fipsKS:add(type=PKCS11,provider-name="SunPKCS11-nss-fips",credential-reference={clear-text="P@ssword123"})
    
    /subsystem=elytron/key-manager=fipsKM:add(key-store=fipsKS,algorithm="SunX509",provider-name=SunPKCS11-nss-fips,credential-reference={clear-text="P@ssword123"})
    
    /subsystem=elytron/server-ssl-context=fipsSSC:add(key-manager=fipsKM,protocols=["TLSv1.1"])
  2. 更新 undertow 子系统,以使用新的 ssl-context

    注意

    https-listener 需要始终配置了 security-realmssl-context。在两个配置之间更改时,命令必须作为一个批处理来执行,如下所示。

    batch
    /subsystem=undertow/server=default-server/https-listener=https:undefine-attribute(name=security-realm)
    /subsystem=undertow/server=default-server/https-listener=https:write-attribute(name=ssl-context,value=fipsSSC)
    run-batch
    
    reload

elytron 子系统中,OpenJDK 和 Oracle JDK(在 FIPS 模式中)会限制任何基于提供自定义 KeyManagerTrustManager 实现的高级功能的使用。以下配置属性无法在服务器上工作:

  • server-ssl-context.security-domain
  • trust-manager.certificate-revocation-list
使用传统核心管理身份验证配置 Undertow

另外,您仍然可以使用传统的核心管理身份验证而不是 elytron 子系统完成对 SSL/TLS 的 FIPS 140-2 兼容加密设置:

  1. 配置 Undertow 以使用 SSL/TLS。

    注意

    以下命令必须在批处理模式下运行,或者在添加 ssl 服务器身份后重新加载服务器。下例中使用了批处理模式。

    batch
    
    /core-service=management/security-realm=HTTPSRealm:add
    
    /core-service=management/security-realm=HTTPSRealm/server-identity=ssl:add(keystore-provider=PKCS11, keystore-password="strongP@ssword1")
    
    /subsystem=undertow/server=default-server/https-listener=https:add(socket-binding=https, security-realm=HTTPSRealm, enabled-protocols="TLSv1.1")
    
    run-batch

    为应用设置 SSL/TLS部分介绍了将 Undertow 配置为 SSL/TLS 的基本信息。

  2. 配置 Undertow 使用的加密套件。

    配置了 SSL/TLS 后,您需要将 https 侦听程序和安全域配置为启用了特定的密码套件:

    所需的加密套件

    SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_anon_WITH_AES_128_CBC_SHA, TLS_ECDH_anon_WITH_AES_256_CBC_SHA

    关于为 https 侦听程序启用加密套件的基础知识,请参阅关于加密套件。在 https 监听器上启用密码套件:

    在 Https Listener 上启用 Cipher Suites 的命令示例

    /subsystem=undertow/server=default-server/https-listener=https:write-attribute(name=enabled-cipher-suites,value="SSL_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_anon_WITH_AES_128_CBC_SHA,TLS_ECDH_anon_WITH_AES_256_CBC_SHA")

  3. 在安全域中启用密码套件。

    在 Security Realm 上启用 Cipher Suites 的命令示例

    /core-service=management/security-realm=HTTPSRealm/server-identity=ssl:write-attribute(name=enabled-cipher-suites, value=[SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_anon_WITH_AES_128_CBC_SHA, TLS_ECDH_anon_WITH_AES_256_CBC_SHA])

1.2.13.2. 使用 Bouncy Castle 启用 FIPS 140-2 Cryptography for SSL/TLS

您可以将 Undertow 配置为将 FIPS 140-2 兼容加密用于 SSL/TLS。此配置示例的范围仅限于 Red Hat Enterprise Linux 7 及更新的版本。红帽不提供 Bouncy Castle JARs,它必须直接从 Bouncy Castle 获取。

先决条件
  • 确保您的环境 已配置为使用 BouncyCastle 提供商
  • 服务器上必须存在 Bouncy Castle 密钥存储。如果不存在,您可以使用以下命令创建。

    $ keytool -genkeypair -alias ALIAS -keyalg RSA -keysize 2048 -keypass PASSWORD -keystore KEYSTORE -storetype BCFKS -storepass STORE_PASSWORD
使用 Elytron 为 FIPS 140-2 Cryptography 配置管理 CLI

您必须将 JBoss EAP 管理 CLI 配置为在启用了 SSL/TLS 的 FIPS 140-2 兼容加密的环境中工作。

  1. 使用以下内容为管理 CLI 创建 XML 配置文件:

    示例: cli-wildfly-config.xml

    <configuration>
      <authentication-client xmlns="urn:elytron:client:1.2">
        <key-stores>
          <key-store name="truststore" type="BCFKS">
            <file name="${truststore.location}" />
            <key-store-clear-password password="${password}" />
          </key-store>
          <key-store name="keystore" type="BCFKS">
            <file name="${keystore.location}" />
            <key-store-clear-password password="${password}" />
          </key-store>
        </key-stores>
        <ssl-contexts>
          <ssl-context name="client-cli-context">
            <key-store-ssl-certificate algorithm="PKIX" key-store-name="keystore">
              <key-store-clear-password password="${password"} />
            </key-store-ssl-certificate>
            <trust-store key-store-name="truststore"/>
            <trust-manager algorithm="PKIX">
            </trust-manager>
            <cipher-suite selector="TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CCM,TLS_RSA_WITH_AES_128_CCM"/>
            <protocol names="TLSv1.2"/>
          </ssl-context>
        </ssl-contexts>
        <ssl-context-rules>
          <rule use-ssl-context="client-cli-context"/>
        </ssl-context-rules>
      </authentication-client>
    </configuration>

  2. 启动管理 CLI 时,使用 -Dwildfly.config.url 属性将配置文件传递给管理 CLI 脚本。例如:

    $ jboss-cli.sh -Dwildfly.config.url=cli-wildfly-config.xml
配置 Elytron 和 Undertow 子系统
  1. 添加 FIPS 140-2 兼容加密密钥 存储key-managerssl-context。在定义密钥存储时,类型必须是 BCFKS

    /subsystem=elytron/key-store=fipsKS:add(path=KEYSTORE,relative-to=jboss.server.config.dir,credential-reference={clear-text=STORE_PASSWORD},type="BCFKS")
    
    /subsystem=elytron/key-manager=fipsKM:add(key-store=fipsKS,algorithm="PKIX",credential-reference={clear-text=PASSWORD})
    
    /subsystem=elytron/server-ssl-context=fipsSSC:add(key-manager=fipsKM,protocols=["TLSv1.2"],cipher-suite-filter="TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CCM,TLS_RSA_WITH_AES_128_CCM")
  2. 更新 undertow 子系统,以使用新的 ssl-context

    注意

    https-listener 需要始终配置了 security-realmssl-context。在两个配置之间更改时,命令必须作为一个批处理来执行,如下所示。

    batch
    /subsystem=undertow/server=default-server/https-listener=https:undefine-attribute(name=security-realm)
    /subsystem=undertow/server=default-server/https-listener=https:write-attribute(name=ssl-context,value=fipsSSC)
    run-batch
    
    reload

1.2.14. IBM JDK 上的 FIPS 140-2 Compliant Cryptography

在 IBM JDK 上,IBM Java Cryptographic Extension(JCE)IBMJCEFIPS 供应商和 IBM Java Secure Sockets Extension(JSSE) FIPS 140-2 Cryptographic 模块(IBMJSSE2)提供 FIPS 140-2 兼容加密。

有关 IBMJCEFIPS 供应商的更多信息,请参阅 IBM Documentation for IBM JCEFIPSNIST IBMJCEFIPS – Security Policy。有关 IBMJSSE2 的更多信息,请参阅在 FIPS 模式中运行 IBMJSSE2

1.2.14.1. 密钥存储

IBM JCE 不提供密钥存储。密钥存储在计算机上,不会离开其物理边界。如果密钥在必须加密的计算机间移动。

要在 FIPS 兼容模式下运行 keytool,在每个命令中使用 -providerClass 选项,如下所示:

keytool -list -storetype JCEKS -keystore mystore.jck -storepass mystorepass -providerClass com.ibm.crypto.fips.provider.IBMJCEFIPS

1.2.14.2. 管理 CLI 配置

要在 IBM JDK 上为 FIPS 140-2 兼容加密配置管理 CLI,您必须使用专门用于 IBM JDK 的管理 CLI 配置文件,如下所示:

示例: cli-wildfly-config-ibm.xml

<configuration>
  <authentication-client xmlns="urn:elytron:client:1.2">
    <key-stores>
      <key-store name="truststore" type="JKS">
        <file name="/path/to/truststore"/>
        <key-store-clear-password password="P@ssword123"/>
      </key-store>
    </key-stores>
    <ssl-contexts>
      <ssl-context name="client-cli-context">
        <trust-store key-store-name="truststore"/>
        <cipher-suite selector="${cipher.suite.filter}"/>
        <protocol names="TLSv1"/>
      </ssl-context>
    </ssl-contexts>
    <ssl-context-rules>
      <rule use-ssl-context="client-cli-context"/>
    </ssl-context-rules>
  </authentication-client>
</configuration>

1.2.14.3. 检查 FIPS 提供者信息

要检查服务器使用的 IBMJCEFIPS 的信息,请通过将 -Djavax.net.debug=true 添加到 standalone.confdomain.conf 文件来启用调试级别日志。有关 FIPS 供应商的信息记录到 server.log 文件,例如:

04:22:45,685 INFO  [stdout] (http-/127.0.0.1:8443-1) JsseJCE:  Using MessageDigest SHA from provider IBMJCEFIPS version 1.7
04:22:45,689 INFO  [stdout] (http-/127.0.0.1:8443-1) DHCrypt:  DH KeyPairGenerator  from provider from init IBMJCEFIPS version 1.7
04:22:45,754 INFO  [stdout] (http-/127.0.0.1:8443-1) JsseJCE:  Using KeyFactory DiffieHellman from provider IBMJCEFIPS version 1.7
04:22:45,754 INFO  [stdout] (http-/127.0.0.1:8443-1) JsseJCE:  Using KeyAgreement DiffieHellman from provider IBMJCEFIPS version 1.7
04:22:45,754 INFO  [stdout] (http-/127.0.0.1:8443-1) DHCrypt:  DH KeyAgreement  from provider IBMJCEFIPS version 1.7
04:22:45,754 INFO  [stdout] (http-/127.0.0.1:8443-1) DHCrypt:  DH KeyAgreement  from provider from initIBMJCEFIPS version 1.7

1.2.15. 当 JVM 在 FIPS 模式中运行时启动受管域(Managed Domain)

更新每个主机控制器和主域控制器,以使用 SSL/TLS 进行通信。

先决条件

在开始之前,请确定您已完成以下先决条件。

警告

红帽建议明确禁用 SSLv2、SSLv3 和 TLSv1.0,而不是在所有受影响的软件包中替代 TLSv1.1。

  1. 在主域控制器上,创建一个 SSL/TLS 安全域,该域配置为使用 NSS 数据库作为 PKCS11 供应商。

    示例:主域控制器上的安全域控制器

    <security-realm name="HTTPSRealm">
        <server-identities>
            <ssl>
                <engine enabled-protocols="TLSv1.1"/>
                <keystore provider="PKCS11" keystore-password="strongP@ssword1"/>
            </ssl>
        </server-identities>
        <authentication>
            <local default-user="\$local"/>
            <properties path="https-users.properties" relative-to="jboss.domain.config.dir"/>
        </authentication>
    </security-realm>

  2. 在每个主机控制器中,创建一个使用 SSL/TLS 信任存储进行身份验证的安全域。

    示例:每个主机控制器上的安全性 Realm

    <security-realm name="HTTPSRealm">
      <authentication>
        <truststore provider="PKCS11" keystore-password="strongP@ssword1"/>
      </authentication>
    </security-realm>

    注意

    在每个主机上重复此过程。

  3. 使用您刚才创建的安全域,保护 master 域控制器上的 HTTP 接口。

    示例:HTTP 接口

    <management-interfaces>
        <http-interface security-realm="HTTPSRealm">
            <http-upgrade enabled="true"/>
            <socket interface="management" port="${jboss.management.http.port:9990}"/>
        </http-interface>
    </management-interfaces>

  4. 使用每个主机控制器上的 SSL/TLS 域连接到主域控制器。

    更新用于连接主域控制器的安全域。在服务器没有运行时,修改主机控制器的配置文件,如 host.xmlhost-slave.xml

    示例:主机操作系统配置文件

    <domain-controller>
      <remote security-realm="HTTPSRealm">
        <discovery-options>
          <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9990}"/>
        </discovery-options>
      </remote>
    </domain-controller>

  5. 更新每个服务器如何连接其主机控制器。

    示例:服务器配置

    <server name="my-server" group="my-server-group">
      <ssl ssl-protocol="TLS" trust-manager-algorithm="PKIX" truststore-type="PKCS11" truststore-password="strongP@ssword1"/>
    </server>

  6. 在受管域中配置双向 SSL/TLS。

    要启用双向 SSL/TLS,在 master 域控制器的 SSL/TLS 安全域中添加信任存储身份验证方法,请执行以下管理 CLI 命令:

    /host=master/core-service=management/security-realm=HTTPSRealm/authentication=truststore:add(keystore-provider="PKCS11",keystore-password="strongP@ssword1")
    
    reload --host=master

    您还需要更新每个主机控制器的安全域使其包含 SSL 服务器身份,请执行以下管理 CLI 命令:

    /host=host1/core-service=management/security-realm=HTTPSRealm/server-identity=ssl:add(keystore-provider=PKCS11, keystore-password="strongP@ssword1",enabled-protocols=["TLSv1.1"])
    
    reload --host=host1
    重要

    您还需要确保将每个主机的证书导入到域控制器的信任存储中。

1.2.16. 使用红帽单点登录保护管理控制台

您也可以使用 Red Hat Single Sign-On 来保护使用 elytron 子系统的 JBoss EAP 管理控制台。

注意

只有运行单机服务器时,此功能才可用,且在运行受管域时不支持此功能。不支持使用 Red Hat Single Sign-On 保护管理 CLI。

使用以下步骤设置 Red Hat Single Sign-On 以针对 JBoss EAP 管理控制台验证用户身份。

为 JBoss EAP 管理配置 Red Hat Single Sign-On 服务器
  1. 下载并安装 Red Hat Single Sign-On 服务器。有关基本说明,请参阅 Red Hat Single Sign-On 入门指南
  2. 启动 Red Hat Single Sign-On 服务器。

    这个步骤假设您使用端口偏移 100 启动服务器。

    $ RHSSO_HOME/bin/standalone.sh -Djboss.socket.binding.port-offset=100
  3. 登录位于 http://localhost:8180/auth/ 的 Red Hat Single Sign-On 管理控制台。

    如果这是您第一次访问红帽单点登录管理控制台,系统将提示您创建初始管理用户。

  4. 创建一个名为 wildfly-infra 的新域。

    1. 从域名旁边的下拉菜单中,点 Add realm,在 Name 字段中输入 wildfly-infra,然后点 Create
  5. 创建名为 wildfly-console 的客户端应用程序。

    重要

    此客户端应用程序的名称必须wildfly-console

    1. 选择 Clients 并点 Create
    2. Client ID 字段中输入 wildfly-console,然后点 Save
    3. 在出现的 Settings 屏幕中,将 Access Type 设置为 public,将Valid Redirect URIs 设置为 http://localhost:9990/console/*Web Origins 设为 http://localhost:9990,然后单击 Save
  6. 创建名为 wildfly-management 的客户端应用程序。

    1. 选择 Clients 并点 Create
    2. Client ID 字段中输入 wildfly-management,然后点 Save
    3. 在出现的 Settings 屏幕中,将 Access Type 设置为 bearer-only 并点 Save
  7. 创建角色来授予 JBoss EAP 管理控制台的访问权限。

    1. 选择 Roles,再单击 Add Role
    2. Role Name 字段中输入 ADMINISTRATOR,然后点击 Save

      此流程使用 ADMINISTRATOR 角色,但支持其他角色。如需更多信息,请参阅 JBoss EAP 安全架构中的基于角色的访问控制部分。

  8. 创建一个用户,并为他们分配 ADMINISTRATOR 角色。

    1. 选择 Users 并点 Add user
    2. Username 字段中输入 jboss,然后点 Save
    3. 选择 Credentials 选项卡并为这个用户设置密码。
    4. 选择 Role Mappings 选项卡,选择 ADMINISTRATOR 并点 Add selected 向此用户添加角色。
在 JBoss EAP 上安装 Red Hat Single Sign-On Client Adapter
  1. 软件下载页面,下载 JBoss EAP 7 的 Red Hat Single Sign-On 客户端适配器。
  2. 将此文件解压缩到 JBoss EAP 安装的根目录中。
  3. 执行 adapter-elytron-install-offline.cli 脚本来配置您的 JBoss EAP 安装。

    $ EAP_HOME/bin/jboss-cli.sh --file=adapter-elytron-install-offline.cli
    重要

    此脚本将 keycloak 子系统以及 elytronundertow 子系统中的其他资源添加到 standalone.xml。如果您需要使用不同的配置文件,请根据需要修改脚本。

配置 JBoss EAP 以使用 Red Hat Single Sign-On
  1. EAP_HOME/bin/ 目录中,创建包含以下内容的文件 protect-eap-mgmt-services.cli

    # Create a realm for both JBoss EAP console and mgmt interface
    /subsystem=keycloak/realm=wildfly-infra:add(auth-server-url=http://localhost:8180/auth,realm-public-key=REALM_PUBLIC_KEY)
    
    # Create a secure-deployment in order to protect mgmt interface
    /subsystem=keycloak/secure-deployment=wildfly-management:add(realm=wildfly-infra,resource=wildfly-management,principal-attribute=preferred_username,bearer-only=true,ssl-required=EXTERNAL)
    
    # Protect HTTP mgmt interface with Keycloak adapter
    /core-service=management/management-interface=http-interface:undefine-attribute(name=security-realm)
    /subsystem=elytron/http-authentication-factory=keycloak-mgmt-http-authentication:add(security-domain=KeycloakDomain,http-server-mechanism-factory=wildfly-management,mechanism-configurations=[{mechanism-name=KEYCLOAK,mechanism-realm-configurations=[{realm-name=KeycloakOIDCRealm,realm-mapper=keycloak-oidc-realm-mapper}]}])
    /core-service=management/management-interface=http-interface:write-attribute(name=http-authentication-factory,value=keycloak-mgmt-http-authentication)
    /core-service=management/management-interface=http-interface:write-attribute(name=http-upgrade, value={enabled=true, sasl-authentication-factory=management-sasl-authentication})
    
    # Enable RBAC where roles are obtained from the identity
    /core-service=management/access=authorization:write-attribute(name=provider,value=rbac)
    /core-service=management/access=authorization:write-attribute(name=use-identity-roles,value=true)
    
    # Create a secure-server in order to publish the JBoss EAP console configuration via mgmt interface
    /subsystem=keycloak/secure-server=wildfly-console:add(realm=wildfly-infra,resource=wildfly-console,public-client=true)
    
    # reload
    reload
  2. 在本文件中,将 REALM_PUBLIC_KEY 替换为公钥的值。要获取这个值,请登录 Red Hat Single Sign-On 管理控制台,选择 wildfly-infra realm,导航到 Realm SettingsKeys,然后点击 Public key
  3. 启动 JBoss EAP。

    $ EAP_HOME/bin/standalone.sh
  4. 执行 protect-eap-mgmt-services.cli 脚本。

    $ EAP_HOME/bin/jboss-cli.sh --connect --file=protect-eap-mgmt-services.cli

现在,当您访问位于 http://localhost:9990/console/ 的 JBoss EAP 管理控制台时,您会被重定向到 Red Hat Single Sign-On 以登录,然后在成功验证后重新重定向到 JBoss EAP 管理控制台。