第 15 章:使用 SSL

**构建与 Creating 之间的全部区别恰恰是:构建的东西只有在构建后才能被爱;但是 Creating 的东西在存在之前就被爱了.

—CHARLES DICKENS**

当将日志事件从基于套接字的附加程序传递到远程接收器时,Logback 支持使用安全套接字层(SSL)。当使用启用 SSL 的附加程序和相应的接收器时,序列化的日志记录事件将通过安全通道传递。

SSL 和组件角色

就网络连接启动而言,诸如附加程序和接收程序之类的回拨组件可以充当服务器角色或 Client 端角色。当充当服务器角色时,logback组件被动侦听来自远程 Client 端组件的连接。相反,充当 Client 端角色的组件将启动与远程服务器组件的连接。例如,扮演* client 角色的附加程序连接到扮演 server 角色的接收方。或者,扮演 client 角色的接收者连接到扮演 server *角色的附加程序。

组件的角色通常由组件类型决定。例如,SSLServerSocketAppender是充当服务器角色的追加程序组件,而SSLSocketAppender是充当 Client 端角色的追加程序组件。因此,开发人员或应用程序 Management 员可以配置 Logback 组件以支持所需的网络连接启动方向。

在 SSL 上下文中,连接启动的方向很重要,因为在 SSL 中,服务器组件必须拥有 X.509 凭据才能向连接 Client 端标识自己。Client 端组件在连接到服务器时,将使用服务器的证书来验证服务器是否受信任。开发人员或应用程序 Management 员必须了解 Logback 组件的角色,以便正确配置服务器的密钥库(包含服务器的 X.509 凭据)和 Client 端的信任库(包含验证服务器信任时使用的自签名根证书) )。

当为相互认证配置 SSL 时,服务器组件和 Client 端组件都必须具有有效的 X.509 凭据,其信任关系可以由其各自的对等方声明。在服务器组件中配置了相互身份验证,因此开发人员或应用程序 Management 员必须知道哪些组件在充当服务器角色。

在本章中,我们使用术语“服务器组件”或简称“服务器”来指代充当服务器角色的 Logback 组件,例如附加器或接收器。我们使用术语“Client 端组件”或简称为“Client 端”来指代充当 Client 端角色的组件。

SSL 和 X.509 证书

为了使用启用了 SSL 的 Logback 组件,您将需要 X.509 凭据(私钥,相应的证书和 CA 认证链)来标识充当 SSL 服务器的组件。如果希望使用相互身份验证,则还需要用作 SSLClient 端的组件的凭据。

虽然您可以使用由商业证书颁发机构(CA)颁发的证书,但也可以使用从您自己的内部 CA 颁发的证书,甚至可以使用自签名证书。以下是所需的全部:

  • 服务器组件必须配置有密钥库,该密钥库包含服务器的私钥,相应的证书和 CA 证书链(如果不使用自签名证书)。

  • Client 端组件必须配置有包含信任的根 CA 证书或服务器的自签名根证书的信任库。

为 SSL 配置 Logback 组件

用于实现 Logback 的 SSL 支持的 Java 安全套接字扩展(JSSE)和 Java 密码体系结构(JCA)具有许多可配置的选项,以及一个可插拔的提供程序框架,该框架允许替换或内置平台的内置 SSL 和加密功能。增强。启用 SSL 的 Logback 组件可以完全指定 SSL 引擎和加密提供程序的所有可配置方面,以满足您的独特安全需求。

使用 JSSE 系统属性的基本 SSL 配置

幸运的是,启用 SSL 的 Logback 组件的几乎所有可配置 SSL 属性都具有合理的默认值。在大多数情况下,只需要配置一些 JSSE 系统属性即可。

本节的其余部分描述了大多数环境中所需的特定 JSSE 属性。有关设置 JSSE 系统属性以自定义 JSSE 的更多信息,请参见JSSE 参考指南中的Customizing JSSE

如果您使用任何 Logback 启用了 SSL 的服务器角色的附加器或接收器组件(例如SSLServerSocketReceiverSSLServerSocketAppenderSimpleSSLSocketServer),则需要配置 JSSE 系统属性以提供其位置,类型和密码。包含私钥和证书的密钥库。

服务器密钥库配置的系统属性

Property NameDescription
javax.net.ssl.keyStore指定包含服务器组件的私钥和证书的文件的文件系统路径。
javax.net.ssl.keyStoreType指定密钥库类型。如果未指定此属性,则采用平台的默认类型(JKS)。
javax.net.ssl.keyStorePassword指定访问密钥库所需的密码。

有关在启动使用 Logback 启用 SSL 的服务器组件的应用程序时设置这些系统属性的示例,请参见下面的Examples

如果您的服务器组件使用的是由商业证书颁发机构(CA)签署的证书,那么 您可能不需要在使用启用了 SSL 的 Client 端组件的应用程序中提供任何 SSL 配置 。对于服务器组件使用商业签名的证书时,通常仅需要为运行服务器组件的 JVM 设置系统密钥库属性。

如果您使用的是自签名服务器证书,或者服务器证书是由证书颁发机构(CA)签名的,则该证书颁发机构的根证书不在 Java 平台的默认信任存储中(例如,当您的组织具有自己的内部证书时)权限),您将需要配置 JSSE 系统属性,以提供信任库的位置,类型和密码,该信任库包含服务器证书或用于签署服务器证书的证书颁发机构(CA)的受信任根证书。 在使用启用了 SSL 的 Client 端组件的每个应用程序中都需要设置这些属性

Client 端信任库配置的系统属性

Property NameDescription
javax.net.ssl.trustStore指定文件的文件系统路径,该文件包含服务器组件的证书或签署服务器证书的证书颁发机构(CA)的受信任的根证书。
javax.net.ssl.trustStoreType指定信任库类型。如果未指定此属性,则采用平台的默认类型(JKS)。
javax.net.ssl.trustStorePassword指定访问信任库所需的密码。

有关在启动使用 Logback 启用 SSL 的 Client 端组件的应用程序时设置这些系统属性的示例,请参见下面的Examples

高级 SSL 配置

在某些情况下,使用 JSSE 系统属性的基本 SSL 配置是不够的。例如,如果您在 Web 应用程序中使用SSLServerSocketReceiver组件,则可能希望使用与 Web 服务器用来向 WebClient 端标识自己的证书不同的凭据来标识远程日志记录 Client 端的日志服务器。您可能希望在日志服务器上使用 SSLClient 端身份验证,以确保只有经过身份验证和授权的远程日志 Logger 才能连接。或者,您的组织对组织网络上可能使用的 SSL 协议和密码套件具有严格的 Policy。对于这些需求,您将需要使用 Logback 的 SSL 高级配置选项。

配置支持 SSL 的 Logback 组件时,您可以在组件的配置中使用ssl属性指定 SSL 配置。

例如,如果您希望使用SSLServerSocketReceiver并为日志服务器的凭据配置密钥存储属性,则可以使用以下配置。

观看为.groovy

<configuration>

  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
    </encoder>
  </appender>
  
  <root level="debug">
    <appender-ref ref="CONSOLE" />
  </root>

  <receiver class="ch.qos.logback.classic.net.server.SSLServerSocketReceiver">
    <ssl>
      <keyStore>
        <location>classpath:/logging-server-keystore.jks</location>
        <password>changeit</password>
      </keyStore>
    </ssl>
  </receiver> 

</configuration>

此配置将密钥存储的位置指定为* logging-server-keystore.jks *,位于应用程序 Classpath 的根目录下。您也可以指定file: URL 来标识密钥库的位置。

如果要在应用程序的 Logback 配置中使用SSLSocketAppender,但又不想使用 JSSE javax.net.ssl.trustStore属性更改应用程序的默认信任存储,则可以按以下方式配置附加程序。

观看为.groovy

<configuration>
  <appender name="SOCKET" class="ch.qos.logback.classic.net.SSLSocketAppender">
    <ssl>
      <trustStore>
        <location>classpath:/logging-server-truststore.jks</location>
        <password>changeit</password>
      </trustStore>
    </ssl>
  </appender>
  
  <root level="debug">
    <appender-ref ref="SOCKET" />
  </root>

</configuration>

此配置将信任库的位置指定为* logging-server-truststore.jks *,位于应用程序 Classpath 的根目录下。您也可以指定file: URL 来标识信任库的位置。

SSL 配置属性

JSSE 公开了大量的可配置选项,Logback 的 SSL 支持使几乎所有这些选项都可用于在启用 SSL 的组件配置中指定。使用 XML 配置时,通过在组件配置中嵌套\ 元素,将 SSL 属性引入这些组件。此配置元素对应于SSLConfiguration类。

为组件配置 SSL 时,您只需要配置默认值不足的 SSL 属性。过度指定 SSL 配置通常是导致难以诊断的问题的原因。

下表描述了顶级 SSL 配置属性。这些属性中的许多属性引入了其他子属性,在描述顶级属性之后的表中对此进行了描述。

Property NameTypeDescription
keyManagerFactoryKeyManagerFactoryFactoryBean指定用于创建KeyManagerFactory的配置。如果未配置此属性,则将使用 Java 平台的默认工厂。请参阅下面的密钥 Management 器出厂配置
keyStoreKeyStoreFactoryBean指定用于创建KeyStore的配置。此属性创建的 KeyStore 应该包含一个 X.509 凭据(由私钥,相应的证书和 CA 证书链组成)。该证书由本地 SSL 对等方提供给远程 SSL 对等方。


在配置 SSLClient 端(例如SSLSocketAppender)时,仅当将远程对等方配置为需要 Client 端身份验证时,才需要 keyStore 属性。
在配置 SSL 服务器(例如SimpleSSLSocketServer)时,keyStore 属性指定包含服务器凭据的密钥存储。如果未配置此属性,则必须配置 JSSE 的javax.net.ssl.keyStore系统属性以提供服务器密钥库的位置。有关设置 JSSE 系统属性的更多信息,请参见JSSE 参考指南中的Customizing JSSE
请参阅下面的密钥库配置
|参数| SSLParametersConfiguration |指定 SSL 会话协商中使用的各种参数。请参阅下面的SSL 参数配置。 |
|协议| String |指定将用于创建SSLContext的 SSL 协议。请参见JSSE 参考指南中的Standard Names规范。如果未配置此属性,则将使用 Java 平台的默认协议。 |
|提供者| String |指定将用于创建SSLContext的 JSSE 提供程序的名称。如果未配置此属性,则将使用 Java 平台的默认 JSSE 提供程序。 |
| secureRandom | SecureRandomFactoryBean |指定用于创建SecureRandom(安全随机数生成器)的配置。如果未配置此属性,则将使用 Java 平台的默认生成器。参见下面的安全随机生成器配置。 |
| trustManagerFactory | TrustManagerFactoryFactoryBean |指定用于创建TrustManagerFactory的配置。如果未配置此属性,则将使用 Java 平台的默认工厂。参见下面的信托 Manager 工厂。 |
| trustStore | KeyStoreFactoryBean |指定用于创建KeyStore的配置,该配置用于验证远程 SSL 对等方的身份。此属性创建的密钥库应包含一个或多个*“信任锚” * —在密钥库中标记为“受信任”的自签名证书。通常,信任库包含自签名的 CA 证书。
该属性指定的信任库将覆盖 JSSE 的javax.net.ssl.trustStore系统属性和平台的默认信任库所指定的任何信任库。有关设置 JSSE 系统属性的更多信息,请参见JSSE 参考指南中的Customizing JSSE

密钥库配置

KeyStoreFactoryBean指定创建包含 X.509 凭据的KeyStore所需的配置。此工厂 bean 的属性可以在SSL ConfigurationkeyStoretrustStore属性中使用。

Property NameTypeDescription
locationString一个 URL,它指定密钥库的位置。使用file: URL 来指定密钥库在文件系统上的位置。使用classpath: URL 来指定密钥库,该密钥库不能在 Classpath 中找到。如果 URL 未指定方案,则假定为classpath:
passwordString指定访问密钥库所需的密码。
providerString指定将用于创建KeyStore的 JCA 提供程序的名称。如果未配置此属性,则将使用 Java 平台的默认密钥存储提供程序。
typeString指定KeyStore类型。请参阅Java 密码体系结构规范中的Standard Names规范。如果未配置此属性,则将使用 Java 平台的默认密钥库类型。

密钥 Management 器出厂配置

KeyManagerFactoryFactoryBean指定创建KeyManagerFactory所需的配置。通常,由于平台的默认工厂足以满足大多数需求,因此无需显式配置密钥 Management 器工厂。

Property NameTypeDescription
algorithmString指定KeyManagerFactory算法名称。请参阅JSSE 参考指南中的Standard Names规范。如果未配置此属性,则将使用 Java 平台的默认密钥 Management 器算法。
providerString指定将用于创建SecureRandom生成器的 JCA 提供程序的名称。如果未配置此属性,则将使用 Java 平台的默认 JSSE 提供程序。

安全随机生成器配置

SecureRandomFactoryBean指定创建SecureRandom生成器所需的配置。通常,由于平台的默认生成器足以满足大多数需求,因此无需显式配置安全随机生成器。

Property NameTypeDescription
algorithmString指定SecureRandom算法名称。请参阅Java 密码体系结构规范中的Standard Names规范。如果未配置此属性,则将使用 Java 平台的默认随机数生成算法。
providerString指定将用于创建SecureRandom生成器的 JCA 提供程序的名称。如果未配置此属性,则将使用 Java 平台的默认 JSSE 提供程序。

SSL 参数配置

SSLParametersConfiguration允许自定义允许的 SSL 协议,密码套件和 Client 端身份验证选项。

Property NameTypeDescription
excludedCipherSuitesString指定在会话协商期间要禁用的 SSL 密码套件名称或模式的逗号分隔列表。此属性用于过滤 SSL 引擎支持的密码套件,以便禁用与此属性匹配的所有密码套件。


为此属性指定的逗号分隔列表中的每个字段都可以是简单字符串或正则表达式。
有关密码套件名称的列表,请参见JSSE 参考指南中的Standard Names规范。
| includedCipherSuites | String |指定在会话协商期间启用的 SSL 密码套件名称或模式的逗号分隔列表。此属性用于过滤 SSL 引擎支持的密码套件,以便仅启用与此属性匹配的那些密码套件。
为此属性指定的逗号分隔列表中的每个字段都可以是简单字符串或正则表达式。
有关密码套件名称的列表,请参见JSSE 参考指南中的Standard Names规范。
|排除协议| String |指定在会话协商期间要禁用的 SSL 协议名称或模式的逗号分隔列表。此属性用于过滤 SSL 引擎支持的协议,以便禁用与此属性匹配的任何协议。
为此属性指定的逗号分隔列表中的每个字段都可以是简单字符串或正则表达式。
请参阅JSSE 参考指南中的Standard Names规范以获取协议名称列表。
| includedProtocols | String |指定在会话协商期间启用的 SSL 协议名称或模式的逗号分隔列表。此属性用于过滤 SSL 引擎支持的协议,以便仅启用与此属性匹配的那些协议。
为此属性指定的逗号分隔列表中的每个字段都可以是简单字符串或正则表达式。
请参阅JSSE 参考指南中的Standard Names规范以获取协议名称列表。
| needClientAuth | boolean |将此属性设置为值true,以配置服务器“需要”有效的 Client 端证书。为 Client 端组件(例如SSLSocketAppender)配置时,将忽略此属性。 |
| wantClientAuth | boolean |将此属性设置为值true,以将服务器配置为“请求”Client 端证书。为 Client 端组件(例如SSLSocketAppender)配置时,将忽略此属性。 |

Trust Manager 出厂配置

TrustManagerFactoryFactoryBean指定创建TrustManagerFactory所需的配置。通常,由于平台的默认工厂足以满足大多数需求,因此无需显式配置信任 Management 器工厂。

Property NameTypeDescription
algorithmString指定TrustManagerFactory算法名称。请参阅JSSE 参考指南中的Standard Names规范。如果未配置此属性,则将使用 Java 平台的默认密钥 Management 器算法。
providerString指定将用于创建SecureRandom生成器的 JCA 提供程序的名称。如果未配置此属性,则将使用 Java 平台的默认 JSSE 提供程序。

Examples

使用 JSSE 系统属性

JSSE 系统属性可用于为包含服务器 X.509 凭据的密钥存储指定位置和密码,或为包含 Client 端组件用来验证服务器的自签名根 CA 证书的信任存储指定位置和密码。相信。

指定服务器的密钥库

运行服务器组件时,需要为包含服务器凭据的密钥库指定位置和密码。一种方法是使用 JSSE 系统属性。以下示例显示了可用于启动 Logback 附带的SimpleSSLSocketServer的命令行。

java -DkeyStore =/etc/logback-server-keystore.jks-DkeyStorePassword = changeit -DkeyStoreType = JKS\ch.qos.logback.net.SimpleSSLSocketServer 6000 /etc/logback-server-config.xml

请注意,在使用 JSSE * keyStore 系统属性时,将指定密钥库的路径。在 logback.xml *中指定位置时,将指定密钥库的 URL。

尽管此示例启动了 Logback 随附的独立服务器应用程序,但可以指定相同的系统属性来启动使用启用了 SSL 的 Logback 服务器组件的任何应用程序。

指定 Client 的信任库

使用 Client 端组件时,需要为信任库指定位置和密码,该信任库包含用于验证服务器信任的根 CA 证书。一种方法是使用 JSSE 系统属性。以下示例显示了一个命令行,可用于启动名为com.example.MyLoggingApplication的应用程序,该应用程序使用 Logback 的启用 SSL 的 Client 端组件中的一个或多个。

java -DtrustStore =/etc/logback-client-truststore.jks-DtrustStorePassword = changeit -DtrustStoreType = JKS\com.example.MyLoggingApplication

请注意,在使用 JSSE * trustStore 系统属性时,将指定密钥存储区的路径。在 logback.xml *中指定位置时,将指定信任库的 URL。

创建和使用自签名服务器组件凭据

要生成自签名证书,可以使用 Java Runtime Environment(JRE)附带的* keytool *Util。下面的说明逐步介绍了在服务器组件的密钥存储区中创建自签名 X.509 凭据以及创建与 Client 端组件一起使用的信任存储区的过程。

创建服务器组件凭证:

以下命令将在名为* server.keystore *的文件中生成自签名 Client 端证书。

keytool -genkey -alias server -dname "CN=my-logging-server" \
    -keyalg RSA -validity 365 -keystore server.keystore
Enter keystore password: <Enter password of your choosing>
Re-enter new password: <Re-enter same password>
Enter key password for <my-logging-server>
	(RETURN if same as keystore password):  <Press RETURN>
  • dname 中使用的名称 my-logging-server *可以是您选择的任何有效名称。您可能希望使用服务器主机的标准域名。 * validity *参数指定从当前日期到证书过期的 calendar 天数。

在生产设置中,为包含服务器凭据的密钥存储区选择一个强密码特别重要。此密码可保护服务器的私钥,从而防止授权方使用它。记下该密码,因为在后续步骤和配置服务器时将需要该密码。

为 Client 端组件创建信任库:

为了在 Client 端组件的配置中使用,需要从上一步中创建的密钥存储中导出服务器的证书,并将其导入信任存储中。以下命令将导出证书并将其导入到名为* server.truststore *的信任存储中。

keytool -export -rfc -alias server -keystore server.keystore \
    -file server.crt
Enter keystore password: <Enter password you chose for in previous step>

keytool -import -alias server -file server.crt -keystore server.truststore
Enter keystore password: <Enter password of your choosing>
Re-enter new password: <Re-enter same password>
Owner: CN=my-logging-server
Issuer: CN=my-logging-server
Serial number: 6e7eea40
Valid from: Sun Mar 31 07:57:29 EDT 2013 until: Mon Mar 31 07:57:29 EDT 2014

   ...

Trust this certificate? [no]:  <Enter "yes">

第一个命令从密钥存储区导出服务器的证书(而不是服务器的私钥),并将其导出到名为* server.crt 的文件中。第二步创建一个名为 server.truststore *的新信任存储,其中包含服务器证书。

在生产设置中,为信任存储区选择一个与您从服务器密钥存储区选择的密码不同的强密码特别重要。记下此密码,因为在配置附加程序 Client 端时将需要它。

配置服务器组件:

您将需要将* server.keystore *文件复制到服务器应用程序的配置中。密钥库可以与应用程序的 Classpath 资源一起放置,或者可以简单地放置在服务器主机的文件系统上的某个位置。在配置中指定密钥库的位置时,将根据需要使用classpath: URL 或file: URL。服务器配置示例如下:

示例:服务器组件配置

<configuration debug="true">
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
    </encoder>
  </appender>
  
  <root level="DEBUG">
    <appender-ref ref="CONSOLE" />
  </root>

  <server class="ch.qos.logback.classic.net.server.SSLServerSocketReceiver">
    <ssl>
      <keyStore>
        <location>classpath:server.keystore</location>
        <password>${server.keystore.password}</password>
      </keyStore>
    </ssl>
  </server>
</configuration>

本示例假定密钥库位于应用程序的 Classpath 的根目录下。

请注意,此配置使用* server.keystore.password 替代变量指定密钥存储区密码。这种方法将使您避免将密码存储在任何配置文件中。例如,您的应用程序可以在启动时在控制台上提示 Importing 此密码,然后在配置日志记录系统之前,使用 Importing 的密码将 server.keystore.password *设置为系统属性。

配置 Client 端组件:

您将需要将* server.truststore *文件复制到每个使用在 Client 端模式下启用 SSL 的组件的应用程序的应用程序配置中。信任库可以与应用程序的 Classpath 资源一起放置,也可以仅放置在文件系统上的某个位置。在配置中指定信任库的位置时,将根据需要使用classpath: URL 或file: URL。示例追加器 Client 端配置如下:

示例:AppenderClient 端配置

<configuration debug="true">
  <appender name="SOCKET" class="ch.qos.logback.classic.net.SSLSocketAppender">
    <remoteHost>${host}</remoteHost>
    <ssl>
      <trustStore>
        <location>classpath:server.truststore</location>
        <password>${server.truststore.password}</password>
      </trustStore>
    </ssl>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="SOCKET" />
  </root>
</configuration>

此示例假定信任存储位于应用程序的 Classpath 的根目录下。

请注意,此配置使用* server.truststore.password 替代变量指定信任库密码。这种方法将使您避免将密码存储在任何配置文件中。例如,您的应用程序可以在启动时在控制台上提示 Importing 此密码,然后在配置日志记录系统之前,使用 Importing 的密码将 server.truststore.password *设置为系统属性。

审核 SSL 配置

在需要安全通信的环境中,通常有必要审核使用 SSL 的组件的配置,以验证与本地安全策略的符合性。 Logback 中的 SSL 支持通过在初始化 Logback 时提供 SSL 配置的详细日志来满足此需求。您可以使用配置中的debug属性来启用审核日志记录:

<configuration debug="true">
  
  ...
  
</configuration>

启用 debug 属性后,初始化日志记录系统时,将记录结果 SSL 配置的所有相关方面。以下是为 SSL 记录的信息的代表性示例。

示例:SSL 配置审核日志记录

06:46:31,941 |-INFO in SSLServerSocketReceiver@4ef18d37 - SSL protocol 'SSL' provider 'SunJSSE version 1.6'
06:46:31,967 |-INFO in SSLServerSocketReceiver@4ef18d37 - key store of type 'JKS' provider 'SUN version 1.6': file:src/main/java/chapters/appenders/socket/ssl/keystore.jks
06:46:31,967 |-INFO in SSLServerSocketReceiver@4ef18d37 - key manager algorithm 'SunX509' provider 'SunJSSE version 1.6'
06:46:31,973 |-INFO in SSLServerSocketReceiver@4ef18d37 - secure random algorithm 'SHA1PRNG' provider 'SUN version 1.6'
06:46:32,755 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled protocol: SSLv2Hello
06:46:32,755 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled protocol: SSLv3
06:46:32,755 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled protocol: TLSv1
06:46:32,756 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled cipher suite: SSL_RSA_WITH_RC4_128_MD5
06:46:32,756 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled cipher suite: SSL_RSA_WITH_RC4_128_SHA
06:46:32,756 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA

为了简洁起见,此处显示的输出已被截断,但通常将包括协议,提供程序,算法和密码套件的完整列表,以及配置中使用的密钥存储和信任存储资源的位置。

尽管这些审核日志记录都不是特别敏感,但是安全性最佳实践建议,在验证配置之后,不应在生产设置中保持启用此日志记录。删除debug属性或将其设置为false时,将禁用审核日志记录。

解决 SSL 异常

如果 SSL 配置不正确,通常会导致 Client 端和服务器组件无法协商同意的会话。当 Client 端尝试连接到服务器时,此问题通常表现为双方都抛出异常。

异常消息的内容取决于您是查看 Client 端日志还是服务器日志。这主要是由于会话协商期间错误报告中固有的协议限制。因此,为了解决会话协商问题,通常需要查看 Client 端和服务器的日志。

服务器的证书不可用

启动服务器组件时,您会在日志中看到以下异常:

  • javax.net.ssl.SSLException:没有可用的证书或密钥对应于启用的 SSL 密码套件*

在大多数情况下,这意味着您尚未配置包含服务器的私钥和相应证书的密钥库的位置。

Solution

使用服务器组件的 ssl 属性的密钥库系统属性keyStore属性,您必须指定包含服务器的私钥和证书的密钥存储的位置和密码。

Client 端不信任服务器

当 Client 端尝试连接到服务器时,您会在日志中看到以下异常:

  • javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败*

此问题是服务器出示 Client 端不信任的证书的结果。最常见的原因是您使用的是自签名服务器证书(或由组织的内部证书颁发机构签名的服务器证书),并且尚未配置 Client 端,以便 Client 端引用包含服务器自签名的信任存储。证书(或签署服务器证书的 CA 的受信任的根证书)。

如果您的服务器证书已过期或已被吊销,也会发生此问题。如果您有权访问服务器日志,则每次 Client 端尝试连接时,您可能会看到记录以下异常:

  • javax.net.ssl.SSLHandshakeException:收到致命警报:... *

异常消息的其余部分通常将提供一个代码,指示 Client 端为什么拒绝服务器的证书。

CodeDescription
certificate_unknown通常表示 Client 端的信任库未正确配置。
certificate_expired表示服务器的证书已过期,需要更换。
certificate_revoked表示发行证书颁发机构(CA)吊销了服务器的证书,并且该证书需要更换。

Solutions

如果服务器的日志消息报告为certificate_unknown,则使用附加程序组件的 ssl 属性的信任库系统属性trustStore属性,您必须为包含服务器的自签名证书或颁发证书颁发机构的根证书的信任库指定位置和密码。

如果服务器的日志消息报告certificate_expiredcertificate_revoked,则服务器需要新证书。需要将新证书和关联的私钥放置在服务器配置中指定的密钥存储区中。并且,如果使用自签名服务器证书,则还需要将服务器的证书放置在追加程序 Client 端配置中指定的信任存储中。

服务器不信任 Client 端

注意: 仅当您已将服务器显式配置为请求 Client 端证书(使用needClientAuthwantClientAuth属性)时,才会发生此问题

当 Client 端尝试连接到日志服务器时,您会在 Client 端的日志中看到以下异常:

  • javax.net.ssl.SSLHandshakeException:收到致命警报:... *

异常消息的其余部分通常将提供指示服务器为何拒绝 Client 端证书的代码。

CodeDescription
certificate_unknown通常表示服务器的信任库未正确配置。
certificate_expired表示 Client 端的证书已过期,需要更换。
certificate_revoked表示签发证书颁发机构(CA)吊销了 Client 的证书,并且该证书需要更换。

Solutions

如果 Client 端的日志消息正在报告bad_certificate,然后使用服务器组件的 ssl 属性的信任库系统属性trustStore属性,则必须指定包含 Client 端的自签名证书或颁发证书颁发机构的根证书的信任库的位置和密码。

如果服务器的日志消息报告certificate_expiredcertificate_revoked,则 Client 端需要新证书。新证书和关联的私钥需要放置在 Client 端配置中指定的密钥存储中。而且,如果使用自签名 Client 端证书,则还需要将 Client 端的证书放置在服务器配置中指定的信任存储中。

Client 端和服务器无法同意协议

注意: 仅当您在配置中明确使用excludingincluding SSL 协议时,才会出现此问题

当 Client 端尝试连接到服务器时,您会在日志中看到以下异常:

  • javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure *

服务器的日志消息通常更具描述性。例如:

  • javax.net.ssl.SSLHandshakeException:SSLv2Hello 已禁用*

通常,这意味着您已从一个对等方而不是另一个对等方排除了协议。

Solution

检查服务器和 Client 端上为excludedProtocolsincludedProtocols属性指定的值。

Client 端和服务器无法同意密码套件

注意: 仅当您在配置中显式是excludingincluding SSL 密码套件时,才会出现此问题

当 Client 端尝试连接到服务器时,您会在日志中看到以下异常:

  • javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure *

服务器的日志消息通常更具描述性:

  • javax.net.ssl.SSLHandshakeException:没有通用的密码套件*

这意味着您已经在服务器和 Client 端上配置了密码套件,以使它们各自的启用密码套件集的交集为空。

Solution

检查服务器和 Client 端上为excludedCipherSuitesincludedCipherSuites属性指定的值。