gpt4 book ai didi

ios - XMPPFramework - 在 Openfire 上通过 SSL 连接

转载 作者:可可西里 更新时间:2023-11-01 04:23:27 24 4
gpt4 key购买 nike

我正在尝试通过 SSL 将我的用户从我的 iOS XMPP 聊天客户端连接到 Openfire 服务器。

在我的 iOS 客户端中:

- (void)setupStream 
{
...
// BOOL values for security settings
customCertEvaluation = NO;
allowSelfSignedCertificates = YES;
allowSSLHostNameMismatch = NO;
}

在我的 Openfire 服务器的 Security Settings> Client Connection Security 中,我设置了:

必需 - 客户端只能使用安全连接连接到服务器。

因此,将调用以下委托(delegate)方法:

- (void)xmppStream:(XMPPStream *)sender willSecureWithSettings:(NSMutableDictionary *)settings 
{
NSString *expectedCertName = [xmppStream.myJID domain];

if (customCertEvaluation)
[settings setObject:@(YES) forKey:GCDAsyncSocketManuallyEvaluateTrust];

if (allowSelfSignedCertificates)
[settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];

if (allowSSLHostNameMismatch)
[settings setObject:[NSNull null] forKey:(NSString *)kCFStreamSSLPeerName];

else
if (expectedCertName)
[settings setObject:expectedCertName forKey:(NSString *)kCFStreamSSLPeerName];
}

我从这个线程尝试了这个解决方案:XMPPFramework TLS/SSL connection with Openfire

但是,当我运行我的应用程序并尝试连接到服务器时,我会收到此错误:

安全选项不可用 - kCFStreamSSLAllowsAnyRoot - 您必须使用手动信任评估

我查看了 GCDAsyncSocket 类并意识到 kCFStreamSSLAllowsAnyRoot 被声明为已弃用。实现了 NSAssert 以故意抛出错误。

接下来,我决定这样更改我的 BOOL 值:

- (void)setupStream 
{
...
// BOOL values for security settings
// Manually evaluate trust
customCertEvaluation = YES;
allowSelfSignedCertificates = NO;
allowSSLHostNameMismatch = NO;
}

这次还是无法连接到服务器,但是没有提示错误。

如果我将客户端连接安全性更改回原始设置,我可以正常连接到 Openfire > 可选。但是,我不会通过客户端 session 中每个用户状态旁边的锁定图标指示的 SSL 进行连接。

我的 Android 客户端(使用 XMPP 的 Smack API)通过 SSL 连接到 Openfire 没有问题。所以我想知道是否有我必须使用 XMPPFramework 为我的 iOS 客户端实现的解决方法。

如果有任何建议,我将不胜感激。

最佳答案

解释

在最新版本的 XMPP ( after April 22 ) 中,您可以不再对以下内容使用 allowSelfSignedCertificates = YES:

if (allowSelfSignedCertificates)
[settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];`

这是因为 kCFStreamSSLAllowsAnyRootSSLSetAllowsAnyRoot 已被弃用。

 /* 
* ==== The following UNAVAILABLE KEYS are: (with throw an exception)
* - kCFStreamSSLAllowsAnyRoot (UNAVAILABLE)
* You MUST use manual trust evaluation instead (see GCDAsyncSocketManuallyEvaluateTrust).
* Corresponding deprecated method: SSLSetAllowsAnyRoot
*/

参见 XMPPFramework/GCDAsyncSocket.h & Deprecated Secure Transport Functions .


解决方案

  1. 转到 Openfire 服务器 > 安全设置 > 客户端连接安全

    检查:必需 - 客户端只能使用安全连接连接到服务器。

  2. 在 AppDelegate 中定义变量

    BOOL customCertEvaluation;
  3. 在setupStream中设置变量

    - (void)setupStream 
    {
    ...
    customCertEvaluation = YES;
    }
  4. 在 willSecureWithSettings 中设置安全设置

    - (void)xmppStream:(XMPPStream *)sender willSecureWithSettings:(NSMutableDictionary *)settings
    {
    /*
    * Properly secure your connection by setting kCFStreamSSLPeerName
    * to your server domain name
    */
    [settings setObject:xmppStream.myJID.domain forKey:(NSString *)kCFStreamSSLPeerName];

    /*
    * Use manual trust evaluation
    * as stated in the XMPPFramework/GCDAsyncSocket code documentation
    */
    if (customCertEvaluation)
    [settings setObject:@(YES) forKey:GCDAsyncSocketManuallyEvaluateTrust];
    }
  5. 手动验证节点

    /*
    * This is only called if the stream is secured with settings that include:
    * - GCDAsyncSocketManuallyEvaluateTrust == YES
    * That is, if a delegate implements xmppStream:willSecureWithSettings:, and plugs in that key/value pair.
    */
    - (void)xmppStream:(XMPPStream *)sender didReceiveTrust:(SecTrustRef)trust completionHandler:(void (^)(BOOL shouldTrustPeer))completionHandler
    {
    /* Custom validation for your certificate on server should be performed */

    completionHandler(YES); // After this line, SSL connection will be established
    }

关于ios - XMPPFramework - 在 Openfire 上通过 SSL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24298917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com