如何在 java 中使用 Smack XMPP 库处理 TLS 证书

Posted

技术标签:

【中文标题】如何在 java 中使用 Smack XMPP 库处理 TLS 证书【英文标题】:How to handle TLS certificate using Smack XMPP library in java 【发布时间】:2011-04-18 21:51:47 【问题描述】:

大家好。我刚刚开始在 Java 中使用 XMPP,包括服务器端和客户端。 在服务器端,我使用的是 Apache Vysper 0.7,在客户端,我使用的是 Ignite Smack 3.1.0 我正在使用来自 apache vysper 演示页面的小型 XMPP 嵌入式服务器,并使用源代码附带的 TLS 证书:

    XMPPServer server = new XMPPServer("localhost");  

    StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry();  

    AccountManagement accountManagement = (AccountManagement) providerRegistry.retrieve(AccountManagement.class);  

    Entity user = EntityImpl.parseUnchecked("user@localhost");  
    accountManagement.addUser(user, "password");

    server.setStorageProviderRegistry(providerRegistry);  

    server.addEndpoint(new TCPEndpoint());  

    server.setTLSCertificateInfo(new File("bogus_mina_tls.cert"), "boguspw");  

    server.start();  
    System.out.println("Vysper server is running...");

问题在于这不是正确/有效的证书。如果我使用 pidgin 测试我的服务器,则会弹出一个警报窗口并告诉我证书无效,并会出现一个按钮,以防我想为此添加例外。

我想要用 Smack api 做同样的事情,但我不知道怎么做。

在我的 smack api 上,我正在使用这样的东西:

    ConnectionConfiguration config = new ConnectionConfiguration("localhost",5222, "localhost");
    config.setSASLAuthenticationEnabled(false);

    connection = new XMPPConnection(config);
    connection.connect();

    connection.login(userName, password);

原来如此。我需要做什么来接受或拒绝无效证书? 感谢您的帮助。

【问题讨论】:

【参考方案1】:

在 Apache Vysper 的集成测试中,我们使用类似:

ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration("localhost", 5222);
connectionConfiguration.setSecurityMode(ConnectionConfiguration.SecurityMode.required);
connectionConfiguration.setSASLAuthenticationEnabled(true);
connectionConfiguration.setKeystorePath("src/main/resources/bogus_mina_tls.cert");
connectionConfiguration.setTruststorePath("src/main/resources/bogus_mina_tls.cert");
connectionConfiguration.setTruststorePassword("boguspw");

例如:https://svn.apache.org/repos/asf/mina/vysper/trunk/server/core-inttest/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0199_xmppping/AbstractIntegrationTestCase.java

【讨论】:

谢谢。您的示例对我有帮助,因为它不再破坏我的 xmpp 客户端,但我正在寻找的是与 pidgin 处理此类情况类似的方式。例如:if(certificate is valid) do something else show alert with accept denied 任何想法如何使用 smack 4 api 做到这一点?【参考方案2】:

我认为你是looking

config.setSelfSignedCertificateEnabled(true)

【讨论】:

感谢您的回答,但现在我收到以下错误:无法处理来自 xmpp 服务器的传入节。你知道那是什么意思吗?

以上是关于如何在 java 中使用 Smack XMPP 库处理 TLS 证书的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Smack XMPP 库创建 SSL 连接?

如何在 XMPP SMACK 库中获取服务器时间

使用 Smack API (xmpp) 从 Java 回调 JavaFX

Android XMPP 聊天单刻度线以及如何从日志中读取 h 值

使用 Smack Android 将字符串转换为 XMPP 节

如何使用 Smack 在 XMPP openfire 中了解打字状态