1.11. 用于 SSL/TLS 的额外 Elytron 组件

以下介绍了配置单向 SSL/TLS 和双向 SSL/TLS 的基本概念:

Elytron 还提供用于配置 SSL/TLS 的一些其他组件。

1.11.1. 使用 ldap-key-store

ldap-key-store 允许您使用存储在 LDAP 服务器中的密钥存储。您可以像使用密钥存储一样使用 ldap- key-store

注意

无法使用 Jakarta Management ObjectName 来解密 LDAP 凭证。反之,可以使用凭证存储来保护凭证。有关凭证存储的详情,请参考 Elytron 中的凭证存储

要创建并使用 ldap-key-store

  1. 配置 dir-context

    要从 JBoss EAP 连接到 LDAP 服务器,您需要配置一个 dir-context,它提供 URL 以及用于连接服务器的主体。

    示例:dir-context

    /subsystem=elytron/dir-context=exampleDC:add(url="ldap://127.0.0.1:10389", principal="uid=admin,ou=system", credential-reference={clear-text="secret"})

  2. 配置 ldap-key-store

    当您配置 ldap-key-store 时,您需要指定用于连接 LDAP 服务器的 dir-context,以及如何定位存储在 LDAP 服务器中的密钥存储。至少,这需要您指定 search-path

    示例: ldap-key-store

    /subsystem=elytron/ldap-key-store=ldapKS:add(dir-context=exampleDC, search-path="ou=Keystores,dc=wildfly,dc=org")

  3. 使用 ldap-key-store

    定义了 ldap- key-store 后,您可以在可以使用密钥存储的同一位置使用它。例如,您可以在为应用程序配置 单向 SSL/TLS双向 SSL/TLS 时使用 ldap-key-store

有关 ldap-key-store 和其他 Elytron 组件的完整列表,请参阅 Elytron subsystem 组件参考

1.11.2. 使用 filtering-key-store

借助 filtering- key-store ,您可以从现有密钥存储 中公开别名的子集,并将其在同一位置使用 密钥存储。例如,如果密钥存储包含 alias1、 alias2alias3,但您只想公开 alias1alias3,则 filtering-key-store 可以为您提供多种操作方式。

创建 filtering-key-store

  1. 配置 密钥存储

    /subsystem=elytron/key-store=myKS:add(path=keystore.jks, relative-to=jboss.server.config.dir, credential-reference={clear-text=secret}, type=JKS)
  2. 配置 filtering-key-store

    当您配置 filtering-key-store 时,您可以指定要过滤的键值和用于过滤 key - store 中的别名的 key-store。过滤器可使用以下格式之一指定:

    • alias1,alias3,它是一个以逗号分隔的别名列表。
    • ALL:-alias2,它公开密钥存储中的所有别名,除了列出的别名之外。
    • NONE:+alias1:+alias3,该密钥存储中不会公开密钥存储中的别名,唯一的原因除外。

      这个示例使用逗号分隔的列表来公开 alias1alias3

      /subsystem=elytron/filtering-key-store=filterKS:add(key-store=myKS, alias-filter="alias1,alias3")
      注意

      alias-filter 属性区分大小写。由于使用混合案例或大写别名(如 elytronAppServer )可能无法被某些密钥存储提供程序识别,因此建议使用小写别名,如 elytronappserver

  3. 使用 filtering-key-store

    定义了 filtering-key-store 后,您可以在可以使用密钥存储的 同一位置 使用它。例如,您可以在为应用程序配置 单向 SSL/TLS双向 SSL/TLS 时,使用 filtering-key-store

有关 filtering-key-store 和其他 Elytron 组件的完整列表,请参阅 Elytron subsystem 组件参考

1.11.3. 重新加载密钥存储

您可以从管理 CLI 重新加载 JBoss EAP 中配置的密钥存储。当您对密钥存储引用的证书进行了更改时,这很有用。

重新加载密钥存储:

/subsystem=elytron/key-store=httpsKS:load

1.11.4. 重新初始化密钥管理器

您可以从管理 CLI 重新初始化在 JBoss EAP 中配置的 key-manager。当您在密钥存储资源提供的证书中进行了更改,并且您希望在不重启服务器的情况下将此更改应用到新的 SSL 连接时,这非常有用。

注意

如果 key-store 基于文件,则必须首先载入它。

/subsystem=elytron/key-store=httpsKS:load()

要重新初始化 key-manager:

/subsystem=elytron/key-manager=httpsKM:init()

1.11.5. 重新初始化信任管理器

您可以从管理 CLI 或管理控制台重新初始化在 JBoss EAP 中配置的 trust-manager。当您对密钥存储资源提供的证书进行更改并且想要在不重启服务器的情况下将更改应用到新的 SSL 连接时,这将非常有用。

从管理 CLI 重新初始化 Trust Manager
注意

如果 key-store 基于文件,则必须首先载入它。

/subsystem=elytron/key-store=httpsKS:load()

要重新初始化 trust-manager

/subsystem=elytron/trust-manager=httpsTM:init()
从管理控制台重新初始化 Trust Manager
  1. 导航到管理控制台,再单击 Runtime 选项卡。
  2. monitor 列中,点 Security(Elytron)
  3. Security 列中,点 SSLView
  4. 在导航窗格中,点 Trust Manager
  5. 单击屏幕右上角的 Initialize 以重新初始化 trust-manager

1.11.6. Keystore Alias

alias 表示存储中存储的 secret 或凭证。如果您使用 key-store 组件向 elytron 子系统添加密钥存储,您可以使用与 key-store 操作相关的别名

别名操作的不同操作包括:

  • read-alias - 从密钥存储读取别名。
  • read-aliases - 从密钥存储读取别名。
  • remove-alias - 从密钥存储中删除别名。

例如,要读取别名:

/subsystem=elytron/key-store=httpsKS/:read-alias(alias=localhost)

1.11.7. 使用 client-ssl-context

当 JBoss EAP 实例创建作为客户端的 SSL 连接(如使用 SSL)时,使用 client-ssl-context 提供 SSL 上下文。

创建 client-ssl-context

  1. 根据需要,创建 key-storekey-managertrust-manager 组件。

    如果建立双向 SSL/TLS 连接,您需要为客户端和服务器证书分别创建单独的 key-store 组件,一个 key-manager 用于客户端 key-store,一个 trust-manager 用于服务器 key-store。或者,如果您要进行单向 SSL/TLS 连接,则需要为 服务器证书和引用 它的 trust-manager 创建密钥存储。使用 Elytron Subsystem 为应用程序启用双向 SSL/TLS 部分中包括了创建 keystores 和 truststores 的示例。

  2. 创建 client-ssl-context

    创建 client-ssl-context,引用密钥存储,truststores 以及任何其他必要的配置选项。

    示例: client-ssl-context

    /subsystem=elytron/client-ssl-context=exampleCSC:add(key-manager=clientKM, trust-manager=clientTM, protocols=["TLSv1.2"])

  3. 引用 client-ssl-context

有关 client-ssl-context 和其他 Elytron 组件的属性的完整列表,请参阅 Elytron subsystem 组件参考

1.11.8. 使用 server-ssl-context

server-ssl-context 用于提供服务器端 SSL 上下文。除了通常的 SSL 上下文配置外,还可以配置额外的项目,如密码套件和协议。SSL 上下文会将配置的任何其他项包装。

  1. 根据需要,创建 key-storekey-managertrust-manager 组件。

    如果建立双向 SSL/TLS 连接,您需要为客户端和服务器证书分别创建单独的 key-store 组件,一个 key-manager 用于服务器 key-store,一个 trust-manager 用于服务器 trust-store。或者,如果您要进行单向 SSL/TLS 连接,则需要为 服务器证书和引用 它的 key-manager 创建密钥存储。使用 Elytron Subsystem 为应用程序启用双向 SSL/TLS 部分中包括了创建 keystores 和 truststores 的示例。

  2. 创建 server-ssl-context

    使用下面概述的选项之一,创建一个 server-ssl-context,引用密钥管理器、信任管理器或其他所需的配置选项。

使用管理 CLI 添加服务器 SSL 上下文
/subsystem=elytron/server-ssl-context=newServerSSLContext:add(key-manager=KEY_MANAGER,protocols=["TLSv1.2"])
重要

您需要确定将支持哪些 HTTPS 协议。上面的示例命令使用 TLSv1.2。您可以使用 cipher-suite-filter 参数指定允许哪些密码套件,使用-cipher-suites-order 参数来遵循服务器密码套件顺序。use-cipher-suites-order 属性默认设置为 true。这与旧的 security 子系统行为不同,它默认为遵循客户端密码套件顺序。

使用管理控制台添加服务器 SSL 上下文
  1. 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
  2. 导航到 ConfigurationSubsystemsSecurity(Elytron)Other Settings,再点击 View
  3. 点击 SSLServer SSL 上下文,并点击 Add 来配置新的服务器 SSL 上下文。

有关 server-ssl-context 和其他 Elytron 组件的属性的完整列表,请参阅 Elytron subsystem 组件参考

1.11.9. 使用 server-ssl-sni-context

server-ssl-sni-context 用于提供服务器端的 SNI 匹配。它提供了匹配的规则,用于将主机名与 SSL 上下文关联,如果不提供主机名都不匹配,则为默认值。SSL SNI 上下文可以代替标准服务器 SSL 上下文,例如在 undertow 子系统中定义上下文时。

  1. 根据需要,创建 key-storekey-managertrust-managerserver-ssl-context 组件。必须定义一个服务器 SSL 上下文来创建 server-ssl-sni-context
  2. 创建一个 server-ssl-sni-context,为 server-ssl-context 元素提供匹配信息。必须使用 default-ssl-context 属性指定默认 SSL 上下文,如果没有找到匹配的主机名,则将使用该上下文。host-context-map 接受以逗号分隔的主机名列表,以匹配各种 SSL 上下文。

    /subsystem=elytron/server-ssl-sni-context=SERVER_SSL_SNI_CONTEXT:add(default-ssl-context=DEFAULT_SERVER_SSL_CONTEXT,host-context-map={HOSTNAME=SERVER_SSL_CONTEXT,...})

    以下内容将用于定义默认为 serverSSL SSL 上下文的 server-ssl-sni-context,并将 www.example.com 的传入请求与 示例SSL 上下文匹配。

    /subsystem=elytron/server-ssl-sni-context=exampleSNIContext:add(default-ssl-context=serverSSL,host-context-map={www\\.example\\.com=exampleSSL})
注意

主机匹配的属性值用作正则表达式,因此请确保转义用于限定域名的任何句点(.)。

使用管理控制台配置 server-ssl-sni-context
  1. 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
  2. 导航到 ConfigurationSubsystemsSecurity(Elytron)Other Settings,再点击 View
  3. SSL → Server SSL SNI 上下文 配置所需的 ssl-sni-context

有关 Elytron 组件的属性列表,请参阅 Elytron subsystem 组件参考

1.11.10. 自定义 SSL 组件

elytron 子系统中配置 SSL/TLS 时,您可以提供并使用以下组件的自定义实现:

  • key-store
  • key-manager
  • trust-manager
  • client-ssl-context
  • server-ssl-context
警告

不建议为 trust-manager 以外的任何组件提供自定义实现,而无需了解 Java 安全套接字扩展(JSSE)。

重要

当使用 FIPS 时,无法使用自定义信任管理器或密钥管理器,因为 FIPS 需要这些管理器嵌入到 JDK 中。可以通过实施验证 X509 证据的 SecurityRealm 实现类似行为。

在创建 Elytron 组件的定制实施时,它们必须提供相应的功能和要求。有关功能和要求的详情,请查看 JBoss EAP 安全架构指南中的功能与要求部分。每个组件的实施详情都由 JDK 供应商提供。

1.11.10.1. 在 Elytron 中添加自定义组件

以下步骤描述了在 Elytron 中添加自定义组件。

  1. 将含有自定义组件提供程序的 JAR 作为模块添加到 JBoss EAP 中,声明任何需要的依赖项,如 javax.api

    module add --name=MODULE_NAME --resources=FACTORY_JAR --dependencies=javax.api,DEPENDENCY_LIST
    重要

    使用 module 管理 CLI 命令仅作为技术预览提供和删除模块。此命令不适用于在受管域中使用,或者在远程连接到管理 CLI 时使用。在生产环境中应手动添加模块并移除模块。如需更多信息,请参阅 JBoss EAP 配置指南中手动创建自定义模块手动删除自定义模块部分。

    技术预览功能不包括在红帽生产服务级别协议(SLA)中,且其功能可能并不完善。因此,红帽不建议在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

    如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。

  2. 当组件添加到 elytron 子系统时,java.util.ServiceLoader 将用于发现该提供程序。另外,可以通过定义 provider-loader 来提供对提供程序的引用。创建加载器的方法有两种,每个组件只能实施一个。

    • 在定义 provider-loader 时直接引用该提供程序:

      /subsystem=elytron/provider-loader=LOADER_NAME:add(class-names=[CLASS_NAME],module=MODULE_NAME)
    • META-INF/services/java.security.Provider 中包含对提供程序的引用。在 org.kohsuke.metainf-services 中使用 @MetaInfServices 注解时,会自动创建此引用。当使用这个方法时,只有 provider-loader 需要使用该模块,如下所示:

      /subsystem=elytron/provider-loader=LOADER_NAME:add(module=MODULE_NAME)
  3. 将自定义组件添加到 Elytron 的配置中,使用适当的元素来添加和引用任何定义的提供程序。

    /subsystem=elytron/COMPONENT_NAME=NEW_COMPONENT:add(providers=LOADER_NAME,...)

    例如,要定义信任管理器,需要使用 trust-manager 元素,如以下命令所示:

    示例:添加自定义信任管理器

    /subsystem=elytron/trust-manager=newTrustManager:add(algorithm=MyX509,providers=customProvider,key-store=sampleKeystore)

  4. 定义之后,可以从其他元素引用该组件。

其他资源

1.11.10.2. 在自定义 Elytron 组件中包含参数

如果您的类实施 初始化 方法,您可以在自定义组件中包含参数,如下所示。

void initialize(final Map<String, String> configuration);

此方法允许自定义类在定义时接收一组配置字符串。它们在定义组件时使用 configuration 属性传递。例如,以下示例定义了名为 myAttribute 的属性,值设为 myValue

/subsystem=elytron/COMPONENT_NAME=NEW_COMPONENT:add(class-name=CLASS_NAME,module=MODULE_NAME,configuration={myAttribute="myValue"}

1.11.10.3. 使用带有 Elytron 的自定义信任管理器

通过实施自定义信任管理器,可以在 Undertow 中使用 HTTPS 时扩展证书验证、在 dir-context 中的 LDAPS 或将 Elytron 用于 SSL 连接的任何位置。此组件负责为服务器做出信任决策,强烈建议您在使用自定义信任管理器时实现这些实施。

重要

当使用 FIPS 时,无法使用自定义信任管理器,因为 FIPS 要求将此管理器嵌入到 JDK 中。可以通过实施验证 X509 证据的 SecurityRealm 实现类似行为。

实施自定义信任管理器的要求

使用自定义信任管理器时,必须实现以下内容:

  • 实现 X509ExtendedTrustManager 接口的信任管理器。
  • 扩展 TrustManagerFactorySpi 的信任管理器工厂。
  • 信任管理器工厂的供应商。

此提供程序必须包含在 JAR 文件中,才能添加到 JBoss EAP 中。任何实施类都必须作为模块包含在 JBoss EAP 中。 不需要一个模块中的类,可以从模块依赖项加载。

实施示例

以下示例演示了一个提供程序,它把自定义信任管理器工厂注册为服务。

示例: Provider

import org.kohsuke.MetaInfServices;
import javax.net.ssl.TrustManagerFactory;
import java.security.Provider;
import java.util.Collections;
import java.util.List;
import java.util.Map;

@MetaInfServices(Provider.class)
public class CustomProvider extends Provider {

    public CustomProvider() {
        super("CustomProvider", 1.0, "Demo provider");

        System.out.println("CustomProvider initialization.");

        final List<String> emptyList = Collections.emptyList();
        final Map<String, String> emptyMap = Collections.emptyMap();

        putService(new Service(this, TrustManagerFactory.class.getSimpleName(),"CustomAlgorithm", CustomTrustManagerFactorySpi.class.getName(), emptyList, emptyMap));
    }

}

以下示例演示了一个自定义信任管理器。这个信任管理器包含用于检查客户端或服务器是否信任的方法。

示例: TrustManager

import javax.net.ssl.SSLEngine;
import javax.net.ssl.X509ExtendedTrustManager;
import java.net.Socket;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class CustomTrustManager extends X509ExtendedTrustManager {

    public void checkClientTrusted(X509Certificate[] x509Certificates, String s, Socket socket) throws CertificateException {
        // Insert your code here
    }

    public void checkServerTrusted(X509Certificate[] x509Certificates, String s, Socket socket) throws CertificateException {
        // Insert your code here
    }

    public void checkClientTrusted(X509Certificate[] x509Certificates, String s, SSLEngine sslEngine) throws CertificateException {
        // Insert your code here
    }

    public void checkServerTrusted(X509Certificate[] x509Certificates, String s, SSLEngine sslEngine) throws CertificateException {
        // Insert your code here
    }

    public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
        // Insert your code here
    }

    public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
        // Insert your code here
    }

    public X509Certificate[] getAcceptedIssuers() {
        // Insert your code here
    }

}

以下示例用于返回信任管理器的实例。

示例:TrustManager factorySpi

import javax.net.ssl.ManagerFactoryParameters;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactorySpi;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyStore;
import java.security.KeyStoreException;

public class CustomTrustManagerFactorySpi extends TrustManagerFactorySpi {

    protected void engineInit(KeyStore keyStore) throws KeyStoreException {
        // Insert your code here
    }

    protected void engineInit(ManagerFactoryParameters managerFactoryParameters) throws InvalidAlgorithmParameterException {
        // Insert your code here
    }

    protected CustomTrustManager[] engineGetTrustManagers() {
        // Insert your code here
    }

}

添加自定义信任管理器

创建提供商和信任管理器后,通过使用将自定义 组件添加到 Elytron 中的步骤将它们添加到 elytron 子系统中。

1.11.11. 默认 SSLContext

部署中使用的许多库可能需要 SSL 配置进行它们建立的连接。这些库通常由调用器进行配置。如果没有提供配置,则会对进程使用默认 SSLContext

默认 SSLContext 有以下方法调用可用:

javax.net.ssl.SSLContext.getDefault();

默认情况下,这个 SSLContext 使用系统属性进行配置。但是,在 elytron 子系统中,可以指定哪些配置的上下文应关联并用作默认值。

要使用这个功能,请正常配置您的 SSLContext。然后,可使用下列命令来指定应将哪些 SSLContext 用作默认值。

/subsystem=elytron:write-attribute(name=default-ssl-context, value=client-context)

当现有服务和部署可以在设置前缓存默认 SSLContext 时,需要重新加载以确保在激活部署前设置了默认 SSLContext。

:reload

如果 default-ssl-context 属性变为 未定义,则标准 API 不会提供任何机制来恢复默认值。在这种情况下,需要重启 Java 进程。

/subsystem=elytron:undefine-attribute(name=default-ssl-context)
{
    "outcome" => "success",
    "response-headers" => {
        "operation-requires-restart" => true,
        "process-state" => "restart-required"
    }
}

1.11.12. 使用证书撤销列表

如果要根据证书撤销列表(CRL)验证证书,您可以使用 elytron 子系统中的信任管理器的 certificate-revocation-list 属性来配置它。例如:

/subsystem=elytron/trust-manager=TRUST_MANAGER:write-attribute(name=certificate-revocation-list,value={path=/path/to/CRL_FILE.crl.pem}

有关信任管理器可用属性的更多信息,请参阅 trust-manager 属性表

注意

您的信任存储必须包含证书链,以便检查证书撤销列表和证书的有效性。信任存储不应该包含终止证书,只包含证书颁发机构和中间证书。

您可以使用 reload-certificate-revocation-list 操作指示信任管理器重新载入证书撤销列表。

/subsystem=elytron/trust-manager=TRUST_MANAGER:reload-certificate-revocation-list

1.11.13. 使用证书颁发机构管理签名证书

您可以使用 JBoss EAP 管理 CLI 和管理控制台获取和管理签名证书。这样,您可以直接从 CLI 或控制台创建签名证书,然后将其导入到所需的密钥存储中。

注意

本节中的许多命令都有一个可选的 staging 参数,指明是否应使用证书颁发机构的暂存 URL。这个值默认为 false,旨在协助测试。在生产环境中不应该启用此参数。

配置 Let 的加密帐户

自 JBoss EAP 7.4 起,Let 的加密是唯一支持的证书颁发机构。要管理签名证书,该帐户必须使用证书颁发机构创建,并提供以下信息:

  • 包含证书颁发机构帐户密钥的别名的密钥存储。
  • 证书颁发机构的别名。如果给定密钥存储中没有提供的别名,则会创建一个,并作为私钥条目存储。
  • 可选 URL 列表,如电子邮件地址,证书颁发机构可以在任何问题时联系。
/subsystem=elytron/certificate-authority-account=CERTIFICATE_ACCOUNT:add(key-store=KEYSTORE,alias=ALIAS,contact-urls=[mailto:EMAIL_ADDRESS])
使用证书颁发机构创建帐户

配置了帐户后,可以通过同意其服务条款,使用证书颁发机构创建该帐户。

/subsystem=elytron/certificate-authority-account=CERTIFICATE_ACCOUNT:create-account(agree-to-terms-of-service=true)
使用证书颁发机构更新帐户

证书颁发机构帐户选项可以使用 update-account 命令更新。

/subsystem=elytron/certificate-authority-account=CERTIFICATE_ACCOUNT:update-account(agree-to-terms-of-service=true)
更改与认证机构关联的帐户密钥

可以使用 change-account-key 命令更改与证书颁发机构帐户关联的密钥。

/subsystem=elytron/certificate-authority-account=CERTIFICATE_ACCOUNT:change-account-key()
使用证书颁发机构取消激活帐户

如果不再需要帐户,则使用 deactivate-account 命令取消激活该帐户。

/subsystem=elytron/certificate-authority-account=CERTIFICATE_ACCOUNT:deactivate-account()
获取与认证机构关联的元数据

帐户的元数据可通过 get-metadata 命令查询。这提供了以下信息:

  • 服务条款的 URL。
  • 证书颁发机构网站的 URL。
  • 证书颁发机构帐户列表。
  • 是否需要外部帐户。
/subsystem=elytron/certificate-authority-account=CERTIFICATE_ACCOUNT:get-metadata()
使用管理控制台配置 Let 的加密帐户

使用管理控制台配置 Let 的 Encrypt 帐户:

  1. 访问管理控制台。

    有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。

  2. 导航到 Runtime → Host → Security(Elytron)SSL 并点 View
  3. Certificate Auth… 打开 证书颁发机构帐户 页面。
  4. 您可以点带有标签的按钮来为所选别名执行以下配置:

    • 创建

      使用证书颁发机构创建帐户。

    • 取消激活

      取消激活所选证书颁发机构帐户。

    • Update(更新)

      使用证书颁发机构更新所选帐户。

    • 获取元数据

      查看有关证书颁发机构帐户的以下信息:

      • 关联的别名
      • 证书颁发机构名称
      • 联系详情
      • 密钥存储名称
      • 证书颁发机构详情
    • 更改帐户密钥

      • 使用证书颁发机构更改关联的密钥。

1.11.14. Keystore Manipulation Operations

您可以使用管理 CLI 和管理控制台在 Elytron key-store 资源上执行各种密钥存储操作。

使用管理 CLI 密钥存储操作操作

通过使用管理 CLI,可以执行以下密钥存储操作:

  • 生成密钥对。

    generate-key-pair 命令生成密钥对,并将生成的公钥嵌套在自签名 X.509 证书中。生成的私钥和自签名证书将添加到密钥存储中。

    /subsystem=elytron/key-store=httpsKS:add(path=/path/to/server.keystore.jks,credential-reference={clear-text=secret},type=JKS)
    
    /subsystem=elytron/key-store=httpsKS:generate-key-pair(alias=example,algorithm=RSA,key-size=1024,validity=365,credential-reference={clear-text=secret},distinguished-name="CN=www.example.com")
  • 生成证书签名请求。

    generate-certificate-signing-request 命令使用密钥存储中的 PrivateKeyEntry 生成 PKCS #10 证书签名请求。生成的证书签名请求将写入到文件中。

    /subsystem=elytron/key-store=httpsKS:generate-certificate-signing-request(alias=example,path=server.csr,relative-to=jboss.server.config.dir,distinguished-name="CN=www.example.com",extensions=[{critical=false,name=KeyUsage,value=digitalSignature}],credential-reference={clear-text=secret})
  • 导入证书或证书链。

    import-certificate 命令将文件中的证书或证书链导入到密钥存储中的条目中。

    /subsystem=elytron/key-store=httpsKS:import-certificate(alias=example,path=/path/to/certificate_or_chain/file,relative-to=jboss.server.config.dir,credential-reference={clear-text=secret},trust-cacerts=true)
  • 导出证书。

    export-certificate 命令将证书从密钥存储中的条目导出到文件。

    /subsystem=elytron/key-store=httpsKS:export-certificate(alias=example,path=serverCert.cer,relative-to=jboss.server.config.dir,pem=true)
  • 更改别名。

    change-alias 命令将现有的密钥存储条目移到新的别名。

    /subsystem=elytron/key-store=httpsKS:change-alias(alias=example,new-alias=newExample,credential-reference={clear-text=secret})
  • 存储对密钥存储所做的更改。

    store 命令保留对备份密钥存储的文件所做的任何更改。

    /subsystem=elytron/key-store=httpsKS:store()
使用管理控制台管理密钥操作操作

使用管理控制台执行操作:

  1. 访问管理控制台。

    有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。

  2. 导航到 RuntimeSecurity(Elytron)Stores,然后点击 View
  3. Key Store 以打开密钥存储定义页面。
  4. 点所需的密钥存储名称。

    您可以点击带有标签的按钮来为所选密钥存储执行以下操作:

    • Load

      加载或重新加载密钥存储。

    • Store

      对提供支持密钥存储的文件进行永久性更改。

    • 生成密钥对

      生成密钥对,将公钥包装到自签名 X.509 证书,并将私钥和证书添加到密钥存储中。

    • 导入证书

      将证书链从文件导入到密钥存储。

    • 获取

      从证书颁发机构获取签名证书,并将它存储在密钥存储中。

1.11.14.1. 密钥存储证书颁发机构操作

在配置 Let 的加密帐户后,您可以在密钥存储上执行以下操作

注意

本节中的许多命令都有一个可选的 staging 参数,指明是否应使用证书颁发机构的暂存 URL。这个值默认为 false,旨在协助测试。在生产环境中不应该启用此参数。

使用管理 CLI 密钥存储证书颁发机构操作

通过使用管理 CLI,可以执行以下密钥存储证书颁发机构操作:

  • 获取签名证书。

    为密钥存储定义了证书颁发机构帐户后,您可以使用 get-certificate 命令获取签名证书并将其存储在密钥存储中。如果具有证书颁发机构的帐户不存在,则它会被自动创建。

    /subsystem=elytron/key-store=KEYSTORE:obtain-certificate(alias=ALIAS,domain-names=[DOMAIN_NAME],certificate-authority-account=CERTIFICATE_ACCOUNT,agree-to-terms-of-service=true,algorithm=RSA,credential-reference={clear-text=secret})
  • 撤销签名证书。

    revoke-certificate 命令撤销证书颁发机构发布的证书。

    /subsystem=elytron/key-store=KEYSTORE:revoke-certificate(alias=ALIAS,certificate-authority-account=CERTIFICATE_ACCOUNT)
  • 检查签名证书是否到期了续订。

    should-renew-certificate 命令确定证书是否在到期需要续订。如果证书过期的时间少于指定天数,则命令返回为 true,否则为 false

    以下命令可确定证书是否在接下来的 7 天后过期。

    /subsystem=elytron/key-store=KEYSTORE:should-renew-certificate(alias=ALIAS,expiration=7)
使用管理控制台密钥存储证书颁发机构操作

使用管理控制台执行操作:

  1. 访问管理控制台。

    有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。

  2. 导航到 RuntimeSecurity(Elytron)Stores,然后点击 View
  3. Key Store 以打开密钥存储定义页面。
  4. 点所需密钥存储名称旁边的 Aliases
  5. 点所需别名。

    您可以点带有标签的按钮来为所选别名执行以下操作:

    • 更改别名

      更改条目的别名。

    • 导出证书

      将密钥存储条目中的证书导出到文件。

    • 生成 CSR

      生成证书签名请求。

    • 删除别名

      从密钥存储中删除所选别名。

    • 详情

      查看与别名关联的证书详情。

    • Revoke

      撤销与别名关联的证书。

    • 验证续订

      确定关联的证书是到期续订。

1.11.15. 使用 Subject Alternative Name Extension 为 X.509 证书配置 Evidence Decoder

默认情况下,与 Elytron 中 X.509 证书关联的主体是证书中的主题名称,与 X.509 证书链相关联的主体是证书链中第一个证书的主题名称。您可以配置 X509-subject-alt-name-evidence-decoder 在 X.509 证书中使用主题备用名称扩展作为主体。

X.509 证书和 X.509 证书链的主题备用名称扩展规格在 RFC 5280 中定义。

先决条件

  • 您知道客户端证书的预期格式,或者有客户端证书在本地可用。

流程

  1. 确定要使用的主题备用名称扩展。

    如果您的客户端证书在本地,可以使用 keytool 命令查看主题备用名称扩展:

    keytool -printcert -file /path/to/certificate/certificate.cert

    subject alternative name 扩展列为:

    SubjectAlternativeName [
       DNS:one.example.org
       IP Address:127.0.0.1
    ]
  2. 创建一个 x509-subject-alt-name-evidence-decoder 以使用指定的主题备用名称:

    /subsystem=elytron/x509-subject-alt-name-evidence-decoder=exampleDnsDecoder:add(alt-name-type=__EXTENSION_TO_USE__)
    • 要使用证据解码器,请在 security-domain 中引用它:

      /subsystem=elytron/security-domain=__Security_Domain_Name__:write-attribute(name="evidence-decoder",value="exampleDnsDecoder")

1.11.16. 配置 Aggregate Evidence Decoder

您可以配置聚合的证据解码器来合并两个或更多个解码器。证据解码器按配置的顺序应用,直到有证据解码器返回非null 主体,或直到没有更多数量的解码器才可以尝试。

先决条件

流程

  1. 从现有解码器创建聚合的解码器:

    /subsystem=elytron/aggregate-evidence-decoder=aggregateDecoder:add(evidence-decoders=[__DECODER_1__,__DECODER_2__,...,__DECODER_N__])
    • 要使用证据解码器,请在安全域中引用它:

      /subsystem=elytron/security-domain=__SECURITY_DOMAIN__:write-attribute(name="evidence-decoder",value="aggregateDecoder")

1.11.17. 配置 X.500 Subject Evidence Decoder

配置 x500-subject-evidence-decoder,以从证书链中第一个证书中提取主题。

流程

  • 创建 x.500 主题的解码器:

    /subsystem=elytron/x500-subject-evidence-decoder=exampleSubjectDecoder:add()

1.11.18. 使用自定义 Evidence Decoder 实现

您可以通过在 Elytron 中使用自定义 org.wildfly.security.auth.server.EvidenceDecoder 实现,方法是将其添加为 JBoss EAP 的模块。

流程

  1. 将自定义实施类打包为 Java 归档(JAR)。
  2. 添加模块到含有 JAR 的 JBoss EAP。

    有关添加模块到 JBoss EAP 的详情,请参考 配置指南中的创建自定义模块部分。

  3. 将自定义验证解码器添加到 Elytron:

    /subsystem=elytron/custom-evidence-decoder=myCustomEvidenceDecoder:add(module=__MODULE_NAME__, class-name=__FULLY_QUALIFIED_CLASS_NAME__)