连接openfire服务器有三种方式
纯文本
starttls
tls/ssl
第二种是纯文本的扩展协议,如果双方都支持加密,则可将纯文本传输升级为加密传输,加密传输和非加密
传输公用一个端口
public XMPPConnectionFactory(@Value("${im.host}") String host,@Value("${truststore.pwd}") String storePass){
Base64.setEncoder(new BASE64Encoder());
try {
KeyStore trustStore=KeyStore.getInstance("JKS");
trustStore.load(getClass().getResourceAsStream("/truststore"),storePass.toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(trustStore);
SSLContext sslContext=SSLContext.getInstance("TLS");
sslContext.init(null,tmf.getTrustManagers(),null);
SmackConfiguration.DEBUG = true;
//使用加密连接
config = XMPPTCPConnectionConfiguration.builder()
.setHost(host)
.setPort(5223)
.setSocketFactory(sslContext.getSocketFactory())
.setServiceName(host)
.setResource("mall")
.build();
//使用STARTTLS连接
// config = XMPPTCPConnectionConfiguration.builder()
// .setHost(host)
// .setPort(5222)
// .setCustomSSLContext(sslContext)
// .setSecurityMode(ConnectionConfiguration.SecurityMode.ifpossible)
// .setServiceName(host)
// .setResource("mall")
// .build();
//使用纯文本
// config = XMPPTCPConnectionConfiguration.builder()
// .setHost(host)
// .setPort(5222)
// .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
// .setServiceName(host)
// .setResource("mall")
// .build();
} catch (KeyStoreException|KeyManagementException|CertificateException|NoSuchAlgorithmException|IOException e) {
logger.error("",e);
}
}