如何为 SSL 握手配置 CFStream(或 NSStream)?

2024-02-28

我正在使用 CFStream/NSStream 建立 http 连接。 我希望能够检测到 SSL 握手在三种情况下失败:

  • 情况A:服务器不可信
  • 情况 B:服务器受信任,但要求提供客户端证书
  • 情况 C:服务器不受信任,它要求客户端证书

今天,我没有对 CFStream 的 SSL 属性执行任何操作,我得到:

  • 情况A:错误-9807
  • 情况 B:没有错误,但服务器拒绝连接(错误 500)
  • 情况C:错误9807

有没有办法配置 CFStream 来正确区分这 3 种情况?或者在 SSL 握手期间进行一些回调?

感谢您的帮助。


不久前,我使用 SSL 与 CFSockets 运行了同样的事情。 CFStream 处理所有握手的事情。我为 NSStream 编写了一些类添加(基本代码来自 Apple,不再有链接,如果我找到它,我会添加它)。这对我有用。

界面

@interface NSStream (FSNetworkAdditions)

+ (void)qNetworkAdditions_getStreamsToHostNamed:(NSString *)hostName
                                           port:(NSInteger)port
                                    inputStream:(out NSInputStream **)inputStreamPtr
                                   outputStream:(out NSOutputStream **)outputStreamPtr;

@end

及实施

#import "FSNetworkAdditions.h"

@implementation NSStream (FSNetworkAdditions)

+ (void)qNetworkAdditions_getStreamsToHostNamed:(NSString *)hostName
                                           port:(NSInteger)port
                                    inputStream:(out NSInputStream **)inputStreamPtr
                                   outputStream:(out NSOutputStream **)outputStreamPtr
{
    CFReadStreamRef     readStream;
    CFWriteStreamRef    writeStream;

    assert(hostName != nil);
    assert( (port > 0) && (port < 65536) );
    assert( (inputStreamPtr != NULL) || (outputStreamPtr != NULL) );

    readStream = NULL;
    writeStream = NULL;

    CFStreamCreatePairWithSocketToHost(
                                       NULL,
                                       (CFStringRef) hostName,
                                       port,
                                       ((inputStreamPtr  != NULL) ? &readStream : NULL),
                                       ((outputStreamPtr != NULL) ? &writeStream : NULL)
                                       );

    NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
                              [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
                              [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
                              [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredRoots,
                              [NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,
                              //kCFNull,kCFStreamSSLPeerName,
                              kCFStreamSocketSecurityLevelSSLv3, kCFStreamSSLLevel,
                              [NSNumber numberWithBool:YES], kCFStreamPropertyShouldCloseNativeSocket,
                              nil];

    if (readStream) {
        CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);
    }

    if (writeStream) {
        CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);
    }

    if (inputStreamPtr != NULL) {
        *inputStreamPtr  = CFBridgingRelease(readStream);
    }
    if (outputStreamPtr != NULL) {
        *outputStreamPtr = CFBridgingRelease(writeStream);
    }


}

@end

现在您可以像这样连接到服务器:

NSInputStream   *inputStream;
NSOutputStream  *outputStream;
[NSStream qNetworkAdditions_getStreamsToHostNamed:host 
                                             port:port 
                                      inputStream:&inputStream 
                                     outputStream:&outputStream];

        inputStream.delegate  = self;
        outputStream.delegate = self;

其中“self”符合 NSStreamDelegate 协议。

我希望这些片段有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 SSL 握手配置 CFStream(或 NSStream)? 的相关文章

  • 在 Objective-C 中,逗号用作语句分隔符时有什么作用?

    我正在查看第三方的一些源代码 并且反复看到对我来说新的语法 基本上他们用逗号而不是分号分隔语句 它可以编译并运行 但我不明白它在做什么 看起来是这样 if url url release url nil 有时他们也会在不使用 if 的情况下
  • 从 Xcode 更改按钮文本?

    我有一个 IBAction 连接到 Interface Builder 中的一个按钮 是否可以在运行时从我的代码中更改按钮 在 IB 中 上的文本 如果您的代码中有一个连接到某个操作的按钮 则无需实例变量即可更改标题 例如 如果按钮设置为以
  • 如何使用 XCode 在 iOS 应用程序中的推文中上传视频

    我是 iOS 开发新手 需要对我正在接管的 iOS 应用程序进行更改 以将视频添加到推文中 我当前的应用程序 UI 允许用户输入推文文本 但我将对其进行更改 以允许他们选择要与推文一起上传的视频 类似于 Twitter 应用程序的工作方式
  • NSString 上的 stringWithFormat 与 initWithFormat

    我想知道以这种方式声明 NSString 有什么区别 例如缺点和 或优点 NSString noInit NSString stringWithFormat lolcatz d i 与以下相反 NSString withInit NSStr
  • 链和主证书添加之间 X509 结构的正确释放是否有所不同?

    我需要从内存中添加 PEM 类型证书 这意味着我无法使用内置的从文件读取帮助程序 我的问题是没有关于如何释放内存的文档 现在我最好的猜测如下 SSL CTX use certificate X509 structure SHOULD be
  • NGINX 上的 SSL 终止

    我已经购买了 SSL 证书 并在验证模数时正确地将其捆绑在一起 即https kb wisc edu middleware 4064 https kb wisc edu middleware 4064 那么哈希值是相同的 我已将证书和密钥移
  • 如何使用自动布局在自定义 UITableViewCell 内动态设置 UITextView 高度

    I have UITableView every tableViewCell is custom Inside my customTableViewCell is a UITextView TextViews frame is pin or
  • 子视图的子层与更高的子视图重叠

    我有一个问题 我正在创建一个UIView这是从方法返回的 这部分很好 但我注意到 当我将子层添加到其中一个子视图时 这些层与子层添加的层次结构中较高的子视图 textView 和 imageView 重叠到testViewCopy出现在这些
  • 永远不会在 ios 的 google API 中获取上传数据进度

    我在我的应用程序中使用 Google Drive API 从我的应用程序上传文件 到目前为止 我成功了 并找到了上传所有类型文件的良好结果 我跟着谷歌示例 https developers google com drive examples
  • 在后台每 X 分钟执行一次函数不起作用

    我使用此代码每 X 分钟执行一次函数 void executeEveryOneMinute self myFunction dispatch after dispatch time DISPATCH TIME NOW int64 t 60
  • 使用 iPhone 控制蓝牙音频设备

    我正在寻找为 iPhone 编写应用程序 它将能够控制汽车中的收音机和 CD 播放器 收音机和播放器具有可用的蓝牙连接 我开始这个问题是为了获得这个地方所需的所有信息 我有几个问题 但如果您发现任何我没有要求的对我开始开发此应用程序不重要的
  • 如何将数据从一个视图传递到下一个视图?

    我正在制作一个下载排队系统来下载视频 处理下载的排队代码位于另一个视图控制器中 现在我的问题是如何将下载的 URL 传递到另一个视图而不推送到另一个视图控制器 如下所示 ViewConntroller View ViewConntrolle
  • iOS:我如何知道某个属性是否符合 KVO 标准?

    In the 键值观察编程指南 https developer apple com library archive documentation Cocoa Conceptual KeyValueObserving KeyValueObser
  • 如何从 iOS 应用程序检测不安全的 wifi 网络

    我想检测我的应用程序中是否存在不安全的 wifi 网络 是否有任何公共 iOS API 可以实现相同的目的 没有记录的 API 可以获取该信息 如果您的应用程序需要通过网络发送和接收敏感数据 您通常应该假设没有安全连接
  • malloc:***错误:已释放对象的校验和不正确 - 对象可能在释放后被修改

    我的 iOS 应用程序有一个大问题 它有时会崩溃 而没有详细的调试错误 堆栈跟踪为空 这是堆栈跟踪中仅有的两行 UIApplicationMain 中的 符号存根 UIHostedTextServiceSession DismissText
  • 在 apache 上托管多个 SSL 证书

    我希望有人能帮我解决这个问题 我有 2 个 IP 可用于执行此操作 并且需要在同一台 Apache 服务器上托管 2 个不同的安全 SSL 域 我已经读到 从 Apache 2 2 开始 可以使用某种插件来使用单个 IP 但我希望保持尽可能
  • ca 证书 Mac OS X

    我需要在emacs 上安装offlineimap 和mu4e 问题是配置 当我运行 Offlineimap 时 我得到 OfflineIMAP 6 5 5 Licensed under the GNU GPL v2 v2 or any la
  • 如何将 UIImageView 裁剪为自定义形状

    用户是否可以在该位周围画一条虚线 圆圈 UIImageView他们希望裁剪到 然后为UIImageView调整大小到这些点 这有点像 Photoshop 中的套索 选取框效果 更新 从 iOS 8 x 开始 UIImageView 提供了m
  • ios 11 - UIBarButtonItem 内的 UIButton 导致自动布局错误

    我在将 UIButton 添加到 UIBarButtonItem 时遇到了一个已知问题 我尝试按照建议添加自动布局约束堆栈溢出 https stackoverflow com a 46336639 505603但我收到如下所述的错误 UIB
  • UITextView:内存使用量巨大

    我在 UITextView 中遇到了内存使用过多的问题 我正在将 50Kb ascii 文本文件加载到 NSString 中 并将其分配给应用程序中空 UITextView 组件的 text 属性 这立即使我的内存占用量增加了 100Mb

随机推荐

  • Android 屏幕关闭时识别音量按钮按下

    我试图识别用户何时在屏幕关闭时按下音量键来更新活动 根据我的阅读 广播接收器 我认为 在手机睡眠时不起作用 因此唯一的方法是使用 PARTIAL WAKE LOCK 保持活动运行 我的应用程序是一个基本应用程序 不应该使用太多电池 但我担心
  • 禁用 Highcharts 中的 PDF 和 SVG 下载选项

    我在我的 Web 应用程序中使用 Highcharts v4 0 3 和 exporting js 并且我希望能够为最终用户提供以下下载选项 下载 JPG 格式的图表 下载 PNG 图表 但是 标准选项是 打印图表 下载 JPG 格式的图表
  • 使用 font Awesome 和 css 自定义复选框

    我正在制作一个带有 font Awesome 和 css 的自定义复选框 单击 选中复选框时 我尝试在黑色复选框周围创建一些填充 选中 单击时在白色框中有一个较小的黑色框 import url netdna bootstrapcdn com
  • 处理 float() 函数

    首先 是这个功能 https processing org reference floatconvert html特殊处理还是默认存在于java中 当我在处理下面的行时编码时 println float 88 t float 88 n t
  • 如何正确地为 Office COM 加载项实现 IDTEXtensibility2 接口?

    我正在为 Outlook 实施 COM 加载项 我使用 IDTEXtensibility2 我不确定这是否是执行 COM 加载项的最佳方式 但我无法更改它 该接口定义了五个方法 OnConnection OnStartupComplete
  • Ember CLI:自定义输入助手

    我正在尝试使用 UrlField 扩展 Ember 的 TextField 以便如果有人忘记包含http 它为他们做到了 这是我的观点 视图 input url js import Ember from ember export defau
  • 模块对象没有属性“DescriptorExtractor_create()”

    我安装了 opencv3 1 0 并正确安装了 opencv contrib 但收到错误 no module DescriptorExtractor create 一切都很好 建议 在 OpenCV 3 x 中 SIFT 和 SURF 已被
  • 如何使用 XChart 使 Y 轴上的限制相同?

    我正在尝试绘制一系列相似的函数 域是 0 1 范围总是在 3 3 中 我希望每个图表的 Y 轴限制都相同 尝试设置系列 y min 和 y max 似乎不起作用 有没有办法使每个图表上的 Y 轴限制相同 import java math B
  • 使用 SMO 库从 C# 中的应用程序运行 .sql 文件

    我正在 C Visual Studio 2012 RC 中构建一个应用程序 我必须在应用程序中运行脚本 为此我正在使用 这两个库 我的应用程序的目标 net 框架是 4 5 using Microsoft SqlServer Managem
  • 溢出-x:可见;溢出-y:自动;不起作用 - 这个标准符合吗? [复制]

    这个问题在这里已经有答案了 我在开发网页时遇到问题 Firefox 或 Internet Explorer 都不会呈现我期望的以下代码片段的行为 div style width 200px height 200px border 1px s
  • 是否可以让空的 RequestParam 值使用 defaultValue?

    如果我有一个类似于以下内容的请求映射 RequestMapping value test method RequestMethod POST ResponseBody public void test RequestParam value
  • Java 中的无符号短整型

    我怎样才能声明unsigned shortJava 中的值 你不能 真的 Java 没有任何无符号数据类型 除了char 诚然你could use char 这是一个 16 位无符号类型 但在我看来这将是可怕的 因为char显然适用于文本
  • Python QuTiP 中的集成未成功

    我一直在尝试使用 QuTiP 来求解量子力学矩阵微分方程 Lindblad 方程 这是代码 from qutip import from matplotlib import import numpy as np hamiltonian np
  • 用其他语言编写 JavaScript

    我有一些不会说英语的客户 他们希望我用另一种语言为他们编写 JavaScript 浏览器可以理解其他语言吗 还是我仅限于非英语注释 navigateur nomApp indice Microsoft 代替 navigator appNam
  • 当没有按钮时,如何防止 fetch 请求重新加载 Javascript 页面?

    首先我要说的是 有无数的线程描述了涉及按钮的问题 通常 只需对传入的事件调用 event preventDefault 即可解决该问题 但是 如果在发生超出用户控制范围的事件 例如 经过一定量的帧后 后调用 post 请求 该怎么办 mak
  • 在 pandas/matplotlib 中获取散点图的 Colorbar 实例

    如何获取 pandas DataFrame plot 创建的绘图的内部创建的颜色条实例 以下是生成彩色散点图的示例 import matplotlib pyplot as plt import pandas as pd import num
  • 尺寸改变时宽度不改变

    我已经这样做很多年了 但现在它不起作用了 private void Form1 Deactivate object sender EventArgs e this Size new Size 30 29 txt Visible false
  • 有基础活动课程好吗?

    拥有好不好BaseActivity类 它将作为所有其他活动的超级类 我需要这个来为活动提供一些通用的实现 基础活动 public class BaseActivity extends Activity All Common implemen
  • 在 C# 中移动 Form2 时移动 Form1

    我有两种形式 Form2正在被打开Form1 像这样 Form2 ShowDialog StartPosition of Form2配置为centerParent 我需要固定位置Form2在 Form1 的中心 这样当我移动时Form2 F
  • 如何为 SSL 握手配置 CFStream(或 NSStream)?

    我正在使用 CFStream NSStream 建立 http 连接 我希望能够检测到 SSL 握手在三种情况下失败 情况A 服务器不可信 情况 B 服务器受信任 但要求提供客户端证书 情况 C 服务器不受信任 它要求客户端证书 今天 我没