本文档概述了如何在Openfire中手动自定义SSL支持。从Openfire3.2开始,可以从管理控制台执行证书管理。但是,如果需要,仍然可以使用Java开发工具包(JDK)工具手动管理证书。
重要提示:设置过程完成后,Openfire将为分配的Openfire域创建自签名证书。大多数用户应该获取由证书颁发机构签名的创建的证书,或者用自己的证书替换创建的证书。
Openfire的SSL支持是使用标准的Java安全SSL实现(javax.net.ssl.SSLServerSocket)构建的。在本文档中,我们将描述如何使用标准Java开发工具包(JDK)工具来完成这些任务。
原文来自:
TLS 指南简介背景证书上需要哪些域名?Oracle Java开发工具包安全工具1、确定服务器域2、创建自签名服务器证书3、获取CA签名的证书4、导入服务器证书5、删除默认证书6、导入客户端证书7、配置Openfire证书吊销撤销检查方法概述配置吊销检查Openfire作为客户端时的回退行为(S2S连接)OCSP装订其他选项Certificate Manager Plugin Readme概述安装配置使用插件Let's Encrypt / Certbot 集成归因
服务器SSL连接使用两组证书来保护连接。
example.com )。证书试图保证特定的一方是他们声称的那个人。证书是基于谁签署了证书而受信任的。如果你只需要轻度安全性,正在可信网络上部署供内部使用等,你可以使用“自签名”(self-signed)证书。自签名证书加密客户端和服务器之间的通信通道。但是,客户端必须通过其他渠道验证自签名证书的合法性。客户端对自签名证书最常见的反应是询问用户是信任证书,还是默默地相信证书是合法的。不幸的是,盲目接受自签名证书会使系统面临“中间人”攻击。
自签名证书的优点是,您可以免费创建它们,这在成本是主要问题或用于测试和评估时非常有用。此外,如果您可以验证您使用的证书是合法的,则可以安全地使用自签名证书。因此,如果系统管理员创建了一个自签名证书,然后亲自将其安装在客户端的信任库上(这样证书才是可信的),您可以放心,SSL连接只会在客户端和正确的服务器之间工作。
对于更高安全性的部署,您应该让证书颁发机构(certificate authority,CA)签署您的证书。客户端信任库通常包含主要CA的证书,可以验证CA是否已签署证书。这种信任链允许客户端信任来自他们以前从未与之交互过的服务器的证书。证书签署类似于公证人(身份验证、记录保存和费用相等)。
Openfire使用两种“域名”:
JID: 中 @ 之后的部分。它还用于识别XMPP域上的服务,这些服务采用XMPP域的子域形式(例如): userA@mychatservice.im conference.mychatservice.imFQDN和XMPP域名可以配置为不同的值(例如,具有主机名的服务器可用于承载XMPP域名)。当FQDN和XMPP域名不同时,它们通过DNS SRV记录相互映射。这在 Openfire: Network Configuration Guide 中有记录。xmpp-openfire-1.myhosting.net mychatservice.im
Openfire中使用的TLS证书需要对相当广泛的名称有效:
conference.mychatserver.im pubsub.mychatserver.im search.mychatserver.org正如你所看到的,事情很容易变得复杂。命名事物的实用方法通常是:
example.orgexample.org *.example.org如果这不可能,则需要为所有域名配置证书,通常使用证书中的多个主题备用名称条目。
Oracle JDK附带了你需要的为Openfire配置SSL所需的所有安全工具。最重要的是位于JDK中的。Java虚拟机将密钥存储(keystores)和信任库(truststores)作为加密文件保存在文件系统上。用于创建、读取、更新和删除这些文件中的条目。Openfire附带了一份为初步评估测试设计的自签名“虚拟”(dummy)证书。对于大多数部署,您需要调整默认配置。keytool JAVA_HOME/bin directory keytool
为了在服务器上配置SSL,您需要完成以下任务:
确定您的Openfire服务器的域。
为您的服务器域创建自签名SSL服务器证书。注意:如果您的Openfire服务器域与具有SSL的现有web域匹配,则您可能已经拥有一个。如果是这样,您可以跳到步骤4。
[可选]让证书颁发机构(CA)认证SSL服务器证书。
将服务器证书导入密钥库。注意:如果要使用步骤2中生成的自签名证书,则该证书已导入,您可以跳过此步骤。
从密钥库中删除默认证书。
将客户端证书导入信任库。
使用适当的密钥库和信任库设置调整Openfire配置。
Openfire服务器域应与服务器的主机名匹配;例如,example.com 。您的用户帐户的地址格式为 user@example.com 类似电子邮件地址。在其余的示例中,我们假设域名是 example.com 。
要创建自签名服务器证书,请转到命令行,将目录更改为Openfire安装的目录。您应该看到默认值和文件。首先,您应该更改默认密钥库密码:resources/security keystore truststore
keytool -storepasswd -keystore keystorekeytool将要求输入旧密码(默认情况下是),然后输入新密码。现在,我们将使用密钥工具创建证书: changeit
xxxxxxxxxxkeytool -genkey -keystore keystore -alias example.com您应该将服务器的名称替换为你自己的。keytool将询问存储密码,然后询问证书所需的几条信息。输入所有信息,但请记住在要求输入您的名字和姓氏时填写您的服务器名称。输入所有必需的信息后,keytool将要求您验证信息并设置密钥密码。您必须使用与store password相同的密钥密码。默认情况下,您只需在提示输入密钥密码时按 enter 即可获得此功能。example.com
如果以后更改密钥库密码,请记住使用keytool更改条目的密码:
xxxxxxxxxxkeytool -keypasswd -alias example.com -keystore keystore默认情况下,Keytool将使用DSA算法创建证书。一些客户端希望服务器具有RSA证书,否则将无法使用TLS。因此,在密钥库中创建RSA证书也是一个好主意。要使用RSA算法创建证书,您需要指定要使用的算法,如下所示:
xxxxxxxxxxkeytool -genkey -keystore keystore -alias example.com -keyalg RSA如果您决定获取CA签名的证书,则必须首先以标准CSR格式导出证书。您可以使用keytool执行此操作:
xxxxxxxxxxkeytool -certreq -keystore keystore -alias example.com -file certificate_file您应该将服务器名称替换为要生成的证书文件的名称。将生成的CSR提交给CA,并按照他们的指示进行签名。example.com certificate_file
如果您有CA对服务器证书进行签名,或者如果您有现有的SSL证书,则必须使用密钥工具导入它。
xxxxxxxxxxkeytool -import -keystore keystore -alias example.com -file signed_certificate_file重要的是别名没有关联的密钥,否则您将收到错误。
导入证书后,必须使用密钥工具删除默认证书。
xxxxxxxxxxkeytool -delete -keystore keystore -alias rsakeytool -delete -keystore keystore -alias dsa如果您要求客户端使用证书验证自己,请获取他们的证书并将其导入信任库文件,而不是密钥库。首先,您应该更改默认的信任库密码:
xxxxxxxxxxkeytool -storepasswd -keystore truststorekeytool将要求输入旧密码(默认情况下是),然后输入新密码。现在使用密钥工具导入每个证书:changeit
xxxxxxxxxxkeytool -import -keystore truststore -alias user_name -file certificate_file在您喜欢的浏览器中打开Openfire管理控制台,添加或更改以下系统属性:
| 属性名称 | 说明 |
|---|---|
| xmpp.socket.ssl.active | 设置为 true 以激活SSL |
| xmpp.socket.ssl.port | 用于SSL的端口(XMPP的默认端口为5223) |
| xmpp.socket.ssl.storeType | 使用的存储类型(“JKS”,Java Keystore,是JDK密钥工具使用的Sun Java密钥库格式)。如果未定义此属性,Openfire将假定值为“jks”。 |
| xmpp.socket.ssl.keystore | 密钥库文件相对于Openfire安装根目录的位置。您可以将此属性留空以使用默认密钥库。 |
| xmpp.socket.ssl.keypass | 您在步骤2中更改的 keystore/key 密码。 |
| xmpp.socket.ssl.truststore | 留空不使用信任库,否则信任库文件相对于Openfire安装根目录的位置。 |
| xmpp.socket.ssl.trustpass | 您在步骤6中更改的 truststore/key 密码。 |
修改上述任何系统属性后,您需要重新启动服务器。
本节介绍Openfire中证书吊销检查的配置,包括OCSP(Online Certificate Status Protocol,在线证书状态协议)和CRL(Certificate Revocation List,证书吊销列表)机制。这适用于Openfire在TLS连接中可以承担的两个角色:
作为服务器,当:
作为客户端,当:
Openfire支持三种检查证书吊销状态的方法:
OCSP 装订(Stapling)
服务器在TLS握手期间将OCSP响应附加到其证书上。
客户端驱动的 OCSP
直接OCSP响应程序查询以验证证书状态。
Certificate Revocation Lists (CRL)
可下载的已吊销证书列表。
要启用证书吊销检查,请执行以下操作:
转到Openfire管理控制台。
导航到【服务器/服务器设置/服务器到服务器】或【服务器/服务设置/客户端连接】。
【Server / Server Settings / Server to Server"】或【Server / Server Settings / Client Connections】
在【证书链检查】部分,找到标记为【验证证书是否未被吊销(通过检查证书吊销列表和OCSP)】的选项。
【Certificate chain checking】【Verify that certificates have not been revoked (by checking Certificate Revocation Lists and OCSP)】
启用根据证书吊销列表(CRL)和通过在线证书状态协议(OCSP)验证证书的选项。
启用此选项后,Openfire将检查服务器到服务器(S2S)和客户端到服务器(C2S)连接中使用的证书的吊销状态,以确保它们未被吊销。
启用吊销检查后,Openfire会使用多步过程来使用OCSP和CRLs验证证书有效性。当Openfire在TLS握手期间充当客户端并从服务器接收证书时,它会执行以下吊销检查过程:
系统属性控制无法确定吊销状态时的行为。此属性的默认值是,如果无法确定证书的吊销状态,则连接失败。如果要放宽吊销检查,可以将此属性设置为。设置为时,如果无法建立证书的吊销状态,则将允许连接。xmpp.socket.ssl.certificate.revocation.soft-fail false true true
默认情况下,吊销检查会考虑整个证书链。如果要将吊销检查限制为仅检查链中的叶子证书(leaf certificate),可以将系统属性设置为该叶子证书。xmpp.socket.ssl.certificate.revocation.only-end-entity `true``
当Openfire作为TLS服务器运行并出示自己的证书时,当这两个条件都满足时,它将尝试装订OCSP响应:
如果无法获得OCSP响应,Openfire将提供没有OCSP装订的证书。OCSP装订通过消除客户端单独请求验证证书吊销状态的需要来提高性能。
默认情况下启用OCSP装订。如果出于任何原因需要禁用它,可以将Java系统属性设置为。 jdk.tls.server.enableStatusRequestExtension false
以下配置选项允许您自定义OCSP装订行为:
| 属性 | 描述 | Openfire 默认值 |
|---|---|---|
| jdk.tls.server.enableStatusRequestExtension | 启用OCSP装订的服务器端支持。 | True |
| jdk.tls.stapling.responseTimeout | 控制服务器用于获取OCSP响应的最长时间,无论是从缓存还是通过联系OCSP响应者。 如果适用,将根据正在进行的装订类型在消息中发送已经收到的响应。CertificateStatus | 5000 (整数值,单位为毫秒) |
| jdk.tls.stapling.cacheSize | 控制条目中的最大缓存大小。 如果缓存已满,需要缓存新的响应,则最近最少使用的缓存条目将被新条目替换。此属性的值为零或更小意味着缓存可以包含的响应数量没有上限。 | 256 目标 |
| jdk.tls.stapling.cacheLifetime | 控制缓存响应的最长生存期。 如果响应的 nextUpdate 字段的过期时间早于缓存生存期,则响应的生存期可能比使用此属性设置的值短。此属性的值为零或更小会禁用缓存生存期。如果一个对象没有 nextUpdate 值,并且缓存寿命被禁用,那么响应将不会被缓存。 | 3600 seconds (1 hour) |
| jdk.tls.stapling.responderURI | 允许管理员在用于TLS的证书没有授权信息访问(AIA)扩展时设置默认URI。 除非设置了该属性,否则它不会覆盖授权信息访问扩展值。jdk.tls.stapling.responderOverride | Not set |
| jdk.tls.stapling.responderOverride | 允许通过属性提供的URI覆盖任何AIA扩展值。jdk.tls.stapling.responderURI | False |
| jdk.tls.stapling.ignoreExtensions | 禁用转发或TLS扩展中指定的OCSP扩展。status_request status_request_v2 | False |
您还可以使用OpenSSL创建新的私钥,并为CA生成证书请求以颁发新证书。此外,请查看新的 证书管理器 插件,该插件允许为新证书部署设置热部署目录,该目录与Let's Encrypt certbot相结合,允许在没有管理员干预的情况下进行动态证书续订。
证书管理器插件为Openfire添加了与其证书存储管理相关的功能。
将certificatemanager.jar复制到Openfire安装的插件目录中。然后,插件将自动部署。要升级到新版本,请将新的certificatemanager.jar文件复制到现有文件上。
该插件是通过Openfire管理控制台配置的。安装后,将出现一个新的管理控制台页面。该页面可以在“服务器”、“TLS/SSL证书”选项卡中找到。在那里,此插件在侧栏上添加了一个名为“管理”的新项目。
此插件允许Openfire监视特定目录(默认情况下为<Openfire_HOME>/resources/security/hotdeploy/)中的文件更改。每当发现一组由PEM编码的私钥和PEM编码的证书链组成的文件时,此插件将尝试将它们安装在Openfire身份存储中。
如上所述,目录监视器机制是利用Let's Encrypts Certbot生成的定期更新数据的好方法。Openfire可以配置为监视certbot放置更新数据的目录。然而,这可能会导致文件权限问题(Openfire进程通常无法读取certbot目录)。另一种解决方案是使用certbots post-hook将数据复制到Openfire可以使用的目录中。
此插件中使用的图标由Flaticon设计。