一、connection manager的作用
connection Manager 简称CM的创作初始是为了提高openfire的用户并发数。
比如:
每个连接管理器应该至少处理五千个并发用户,如果openfire允许只能同时连接 300个连接,那么最终集群理论上的并发就是150万个,但是这是理想的情况下, 因为一个CM有时候为了提高并发会同时占用多条连接。
Openfire首先要配置5262端口开启:
二、connection manager的配置文件
CM中部分属性的作用
<?xml version="1.0" encoding="UTF-8"?>
<!--
This file stores bootstrap properties needed by Connection Managers.
Property names must be in the format: "prop.name.is.blah=value"
That will be stored as:
<prop>
<name>
<is>
<blah>value</blah>
</is>
</name>
</prop>
-->
<!-- root element, all properties must be under this element -->
<jive>
<xmpp>
<!-- 配置openfire的名称,一般来说和实际的名称相同,因为这个名称是否相同会和openfire的证书签名的校验发生作用,也就是下面的server.certificate.verify的值有影响。如果openfire的实际名称不是domain中的名称并且verify为true,启动就会报错。 -->
<domain>localhost</domain>
<!-- xmpp服务器的IP地址,如果没有这个值,就会使用上面的domain名称通过dns获取。 -->
<hostname>127.0.0.1</hostname>
<!-- TCP port to connect to the XMPP server on.这个就是openfire的控制中的CM配置的端口-->
<port>5262</port>
<!-- 这个是配置的密码,是必须的 -->
<password>123456</password>
<manager>
<!-- 这个名称不怎么重要,主要就是给openfire说,我的代号是什么,如果这个值不存在就会随机一个名称 -->
<name></name>
<!-- 链接到openfire的连接数,这个参数实际中很重要,和吞吐量有关。 -->
<connections>1</connections>
<!-- 针对CM和openfire中间的连接,这个配置是针对这个的每个连接所准备处理数据的线程数。这个也和吞吐量有关 -->
<incoming>
<threads>5</threads>
</incoming>
</manager>
<server>
<certificate>
<!-- 这个显示了 是否需要验证服务器的证书,上面 的domain名称在这人也会验证 -->
<verify>true</verify>
<!-- 下面的是详细的验证的过程 -->
<verify>
<!-- 这个显示了证书里面的证书链是否需要被验证 -->
<chain>true</chain>
<!--
验证链中的最后一个证书是否由颁发 我们信任的第三方。-->
<root>true</root>
<!-- 对于证书链中的证书,是否需要验证证书的时间是否超时 -->
<validity>true</validity>
</verify>
<!-- 提示是否接受自签名证书(除了自签名证书,还有就是CA签名证书,可以自己生成CA签名,也可以使用免费的签名)-->
<accept-selfsigned>true</accept-selfsigned>
</certificate>
</server>
<client>
<!-- Milliseconds a client connection has to be idle to be closed.
Default is 30 minutes. -->
<idle>1800000</idle>
</client>
<socket>
<default>
<active>true</active>
<!-- 这个就是默认的端口,对应着openfire中的5223端口。它的功能就是可以使用STARTTLS协议。 -->
<port>5225</port>
</default>
<ssl>
<!-- 这个设置是否使用老的ssl端口 -->
<active>false</active>
<!-- 这个是老的ssl方法链接的端口,现在新的是使用STARTTLS协议 -->
<port>5226</port>
<storeType>jks</storeType>
<keystore>../../../../security/openfire/keystore</keystore>
<keypass>changeit</keypass>
<truststore>../../../../security/openfire/truststore</truststore>
<trustpass>changeit</trustpass>
</ssl>
<!-- Listen on a specific network interface. -->
<!-- <network>
<interface></interface>
</network> -->
<!-- Low level socket settings. Use this section to finetune sockets based on load. -->
<!-- Maximum number of outstanding connection requests is set. This can be considered a backlog
of requests waiting on the TCP/IP port for the listener to accept the request. -->
<backlog>50</backlog>
<!-- 设置网络传输中的缓存大小。 -->
<buffer>
<!-- Hint the size of the underlying buffers used by the platform for incoming network I/O -->
<receive>50</receive>
<!-- Hint the size of the underlying buffers used by the platform for outgoing network I/O -->
<send>50</send>
</buffer>
<!-- Specifies a linger-on-close timeout. This option disables/enables immediate return
from a close() of a TCP Socket.-->
<linger>50</linger>
<!-- This option causes packets to be flushed on to the network more frequently. If you are
streaming large amounts of data, there is no buffering and hence no delay.-->
<!-- <tcp-nodelay>false</tcp-nodelay> -->
</socket>
<processor>
<!-- Number of processors that will be listening for incoming traffic. The optimal number is related
to the number of CPUs. Each processor will run in its own thread. -->
<!-- <count>1</count> -->
<!-- Number of threads that will process incoming traffic detected by processors. Note that
threads will be shared among processors. -->
<!-- <threads>
<standard>16</standard>
<ssl>16</ssl>
</threads> -->
</processor>
<!-- Configure http binding. -->
<httpbind>
<enabled>false</enabled>
<port>
<plain>7081</plain>
<secure>7484</secure>
</port>
<!-- Script syntax allows BOSH to be used in environments where clients may be restricted to using a particular server -->
<scriptSyntax>
<enabled>false</enabled>
</scriptSyntax>
<client>
<requests>
<!-- Longest time (in seconds) to wait before responding to any request during the session -->
<!-- <wait></wait> -->
<!-- Maximum allowable seconds over which a client can send empty requests to the server -->
<polling>5</polling>
<!-- Limit number of simultaneous requests the client makes with the 'requests' attribute -->
<max>2</max>
</requests>
<!-- Seconds a session has to be idle to be closed -->
<idle>30</idle>
</client>
</httpbind>
</xmpp>
<!-- Configure debug logger. -->
<log>
<debug>
<enabled>true</enabled>
</debug>
</log>
</jive>
1、 配置只使用5225端口,并且不使用starttls协议来传输数据,并且连接服务器的时候不验证服务器的证书的配置文件模板(openfire中需要开启5222端口,并且设置不允许加密。):
<!-- 配置openfire的名称,一般来说和实际的名称相同,因为这个名称是否相同会和openfire的证书签名的校验发生作用,也就是下面的server.certificate.verify的值有影响。如果openfire的实际名称不是domain中的名称并且verify为true,启动就会报错。 -->
<domain>localhost</domain>
<!-- xmpp服务器的IP地址,如果没有这个值,就会使用上面的domain名称通过dns获取。 -->
<hostname>127.0.0.1</hostname>
<!-- TCP port to connect to the XMPP server on.这个就是openfire的控制中的CM配置的端口-->
<port>5262</port>
<!-- 这个是配置的密码,是必须的 -->
<password>123456</password>
<manager>
<!-- 这个名称不怎么重要,主要就是给openfire说,我的代号是什么,如果这个值不存在就会随机一个名称 -->
<name></name>
<!-- 链接到openfire的连接数,这个参数实际中很重要,和吞吐量有关。 -->
<connections>1</connections>
<!-- 针对CM和openfire中间的连接,这个配置是针对这个的每个连接所准备处理数据的线程数。这个也和吞吐量有关 -->
<incoming>
<threads>5</threads>
</incoming>
</manager>
<server>
<certificate>
<!-- 这个显示了 是否需要验证服务器的证书,上面 的domain名称在这人也会验证 -->
<verify>false</verify>
<!-- 下面的是详细的验证的过程 -->
<verify>
<!-- 这个显示了证书里面的证书链是否需要被验证 -->
<chain>true</chain>
<!--
验证链中的最后一个证书是否由颁发 我们信任的第三方。-->
<root>true</root>
<!-- 对于证书链中的证书,是否需要验证证书的时间是否超时 -->
<validity>true</validity>
</verify>
<!-- 提示是否接受自签名证书(除了自签名证书,还有就是CA签名证书,可以自己生成CA签名,也可以使用免费的签名)-->
<accept-selfsigned>true</accept-selfsigned>
</certificate>
</server>
<client>
<!-- Milliseconds a client connection has to be idle to be closed.
Default is 30 minutes. -->
<idle>1800000</idle>
</client>
<socket>
<default>
<active>true</active>
<!-- 这个就是默认的端口,对应着openfire中的5223端口。它的功能就是可以使用STARTTLS协议。 -->
<port>5225</port>
</default>
<ssl>
<!-- 这个设置是否使用老的ssl端口 -->
<active>false</active>
<!-- 这个是老的ssl方法链接的端口,现在新的是使用STARTTLS协议 -->
<port>5226</port>
<storeType>jks</storeType>
<!--<keystore>../../../../security/openfire/keystore</keystore>
<keypass>changeit</keypass>
<truststore>../../../../security/openfire/truststore</truststore>
<trustpass>changeit</trustpass>-->
</ssl>
Openfire配置:
Openfire需要配置5222中Advanced configuration中强制不允许加密,不可以选择Optional。
2、配置只使用5225端口,并且不使用starttls协议来代码段 小部件传输数据,但是连接服务器的时候验证服务器的证书的配置模板(openfire需要开启5222端口 ,并且允许加密,并且需要配置keystore和truststore):
<!-- 配置openfire的名称,一般来说和实际的名称相同,因为这个名称是否相同会和openfire的证书签名的校验发生作用,也就是下面的server.certificate.verify的值有影响。如果openfire的实际名称不是domain中的名称并且verify为true,启动就会报错。 -->
<domain>localhost</domain>
<!-- xmpp服务器的IP地址,如果没有这个值,就会使用上面的domain名称通过dns获取。 -->
<hostname>127.0.0.1</hostname>
<!-- TCP port to connect to the XMPP server on.这个就是openfire的控制中的CM配置的端口-->
<port>5262</port>
<!-- 这个是配置的密码,是必须的 -->
<password>123456</password>
<manager>
<!-- 这个名称不怎么重要,主要就是给openfire说,我的代号是什么,如果这个值不存在就会随机一个名称 -->
<name></name>
<!-- 链接到openfire的连接数,这个参数实际中很重要,和吞吐量有关。 -->
<connections>1</connections>
<!-- 针对CM和openfire中间的连接,这个配置是针对这个的每个连接所准备处理数据的线程数。这个也和吞吐量有关 -->
<incoming>
<threads>5</threads>
</incoming>
</manager>
<server>
<certificate>
<!-- 这个显示了 是否需要验证服务器的证书,上面 的domain名称在这人也会验证 -->
<verify>true</verify>
<!-- 下面的是详细的验证的过程 -->
<verify>
<!-- 这个显示了证书里面的证书链是否需要被验证 -->
<chain>true</chain>
<!--
验证链中的最后一个证书是否由颁发 我们信任的第三方。-->
<root>true</root>
<!-- 对于证书链中的证书,是否需要验证证书的时间是否超时 -->
<validity>true</validity>
</verify>
<!-- 提示是否接受自签名证书(除了自签名证书,还有就是CA签名证书,可以自己生成CA签名,也可以使用免费的签名)-->
<accept-selfsigned>false</accept-selfsigned>
</certificate>
</server>
<client>
<!-- Milliseconds a client connection has to be idle to be closed.
Default is 30 minutes. -->
<idle>1800000</idle>
</client>
<socket>
<default>
<active>true</active>
<!-- 这个就是默认的端口,对应着openfire中的5223端口。它的功能就是可以使用STARTTLS协议。 -->
<port>5225</port>
</default>
<ssl>
<!-- 这个设置是否使用老的ssl端口 -->
<active>false</active>
<!-- 这个是老的ssl方法链接的端口,现在新的是使用STARTTLS协议 -->
<port>5226</port>
<storeType>jks</storeType>
<!--<keystore>../../../../security/openfire/keystore</keystore>
<keypass>changeit</keypass>
<truststore>../../../../security/openfire/truststore</truststore>
<trustpass>changeit</trustpass>-->
</ssl>
Openfire配置:
这个Openfire配置和上面的配置是一样的。
3、配置只使用5225端口,使用starttls协议来传输数据连接服务器的时候验证服务器的证书的配置模板(该部分需要在openfire中设置5222端口允许加密,这儿需要配置keystore,也可以使用CM的默认证书路径):
<!-- 配置openfire的名称,一般来说和实际的名称相同,因为这个名称是否相同会和openfire的证书签名的校验发生作用,也就是下面的server.certificate.verify的值有影响。如果openfire的实际名称不是domain中的名称并且verify为true,启动就会报错。 -->
<domain>localhost</domain>
<!-- xmpp服务器的IP地址,如果没有这个值,就会使用上面的domain名称通过dns获取。 -->
<hostname>127.0.0.1</hostname>
<!-- TCP port to connect to the XMPP server on.这个就是openfire的控制中的CM配置的端口-->
<port>5262</port>
<!-- 这个是配置的密码,是必须的 -->
<password>123456</password>
<manager>
<!-- 这个名称不怎么重要,主要就是给openfire说,我的代号是什么,如果这个值不存在就会随机一个名称 -->
<name></name>
<!-- 链接到openfire的连接数,这个参数实际中很重要,和吞吐量有关。 -->
<connections>1</connections>
<!-- 针对CM和openfire中间的连接,这个配置是针对这个的每个连接所准备处理数据的线程数。这个也和吞吐量有关 -->
<incoming>
<threads>5</threads>
</incoming>
</manager>
<server>
<certificate>
<!-- 这个显示了 是否需要验证服务器的证书,上面 的domain名称在这人也会验证 -->
<verify>true</verify>
<!-- 下面的是详细的验证的过程 -->
<verify>
<!-- 这个显示了证书里面的证书链是否需要被验证 -->
<chain>true</chain>
<!--
验证链中的最后一个证书是否由颁发 我们信任的第三方。-->
<root>true</root>
<!-- 对于证书链中的证书,是否需要验证证书的时间是否超时 -->
<validity>true</validity>
</verify>
<!-- 提示是否接受自签名证书(除了自签名证书,还有就是CA签名证书,可以自己生成CA签名,也可以使用免费的签名)-->
<accept-selfsigned>false</accept-selfsigned>
</certificate>
</server>
<client>
<!-- Milliseconds a client connection has to be idle to be closed.
Default is 30 minutes. -->
<idle>1800000</idle>
</client>
<socket>
<default>
<active>true</active>
<!-- 这个就是默认的端口,对应着openfire中的5223端口。它的功能就是可以使用STARTTLS协议。 -->
<port>5225</port>
</default>
<ssl>
<!-- 这个设置是否使用老的ssl端口 -->
<active>false</active>
<!-- 这个是老的ssl方法链接的端口,现在新的是使用STARTTLS协议 -->
<port>5226</port>
<storeType>jks</storeType>
<!-- 可以不配置,如果不配置使用默认的密钥和信任 -->
<keystore>../../../../security/openfire/keystore</keystore>
<keypass>changeit</keypass>
<truststore>../../../../security/openfire/truststore</truststore>
<trustpass>changeit</trustpass>
</ssl>
这儿需要打开证书的配置,因为CM连接的在tls阶段不是用的openfire的证书,是使用的cm的证书。这儿没有对加密数据进行转发。如果openfire的5222端口使用了STARTTLS,客户端连接CM的时候就会使用CM的证书供与客户端加密。
Openfire配置:
Openfire需要配置5222中Advanced configuration中可以设置可选的(Optional,加密是优先的选项)或者强制允许加密(Required),两者的设置最后是一样的效果
4、配置只使用5226端口,开放旧的tls端口让客户端来连接,并且CM连接openfire的时候需要检验该证书。(该部分需要在openfire中设置5222端口打开,并且强制不准加密,这儿需要配置keystore和truststore)。
相对与上面只是把active修改了
<ssl>
<!-- 这个设置是否使用老的ssl端口 -->
<active>true</active>
<!-- 这个是老的ssl方法链接的端口,现在新的是使用STARTTLS协议 -->
<port>5226</port>
<storeType>jks</storeType>
<keystore>../../../../security/openfire/keystore</keystore>
<keypass>changeit</keypass>
<truststore>../../../../security/openfire/truststore</truststore>
<trustpass>changeit</trustpass>
</ssl>
Openfire配置:
需要设置5222端口不允许加密,因为tls的握手是在xmpp之前已经决定了,所以这个时候不能使用STARTTLS协议,所以不允许加密,具体openfire配置和1相同。
总结和说明:
客户端连接CM来连接openfire中,openfire是没有做tls部分的,包括STARTTLS和旧的tls协议,所有的都是CM来处理的。CM中对于端口加密和不加密都是从Openfire配置中获取的,分别是required, optional和disabled。CM中的证书的配置就十分的重要,但是他们都有默认值,一般在部署环境不需要手动去配置,只需要把真实的证书添加到keystore中去就行了,因为conf里面的文件就是他们的默认文件。
<ssl>
<!-- 这个设置是否使用老的ssl端口 -->
<active>false</active>
<!-- 这个是老的ssl方法链接的端口,现在新的是使用STARTTLS协议 -->
<port>5226</port>
<storeType>jks</storeType>
<keystore>../../../../security/openfire/keystore</keystore>
<keypass>changeit</keypass>
<truststore>../../../../security/openfire/truststore</truststore>
<trustpass>changeit</trustpass>
</ssl>
有STARTTLS协议的连接(注:不是整个就是STARTTLS协议)可以从stream的发起作为分割点,可以分为三步,其中分为:
1> tls认证部分
2> sasl认证部分
3> 正式的数据
不过第3点我省略了讲解其中的资源绑定部分。
时序图如下:
1、添加starttls协议的过程:
2、没有添加starttls协议的过程:
3、老tls端口连接的过程:
案例(一个骚操作):
这次研究CM,因为公司有个特殊需求,需要把openfire中的部分站独立
公司有n个网站,所有网站的用户都是使用一个openfire,现在因为一些原因要独立一些网站使得独立的网站连接的服务器和其它的网站的域名不一样,并且需要加密不让别人知道实际的openfire服务器地址。如果使用常规的STARTTLS当然不能实现,因为配置文件里面的domain按照文档需要配置成openfire的域名,这个数据恰好被<stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="localhost" id="8a9bheiskt" xml:lang="en" version="1.0">这个报文中from给暴露了,所以只有该domain位CM的名称,但是certificate的验证变为false。当然还可以使用旧的tls,但是有个平台的客户端的xmpp架构不支持5223,所以只能这么玩了。
如果想要知道openfire于client的报文内容和作用,请查看我下篇博客openfire的认证部分报文过程