gpt4 book ai didi

ios - SocketRocket 和 iOS 证书固定

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:17:41 27 4
gpt4 key购买 nike

我目前正在使用 SocketRocket 作为我的 iOS 应用程序的 WebSocket 实现,并希望将我服务器的 CA 固定为具有 SR_SSLPinnedCertificates 属性的受信任证书。我正在寻找一个加载一个或多个证书以传递到 SocketRocket 的好例子。我有以下代码可以工作,但我不确定它是否正确,或者是否有更直接的方法。

CFArrayRef keyref = NULL;
NSString *path = [[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"p12"];
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
OSStatus status = SecPKCS12Import((__bridge CFDataRef)data, (__bridge CFDictionaryRef)[NSDictionary dictionaryWithObject:@"eftl_key_pass" forKey:(__bridge id)kSecImportExportPassphrase], &keyref);
if (status == noErr) {
CFDictionaryRef identityDict = CFArrayGetValueAtIndex(keyref, 0);
SecIdentityRef identityRef = (SecIdentityRef)CFDictionaryGetValue(identityDict, kSecImportItemIdentity);
SecCertificateRef certRef = NULL;
SecIdentityCopyCertificate(identityRef, &certRef);
}

最佳答案

SocketRocket 的证书固定是这样完成的:

首先,我们需要从 NSURLRequest 中初始化 SocketRocket,而不是从 NSURL 中。

NSURL *url = [[NSURL alloc] initWithString:@"wss://path-to-socket:1234"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];

然后,让我们设置证书。您的证书必须采用二进制 DER 格式,而不是 base64 编码的 PEM,这一点至关重要。证书文件应该在您的主包中。

NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"myOwnCertificate" ofType:@"cer"];
NSData *certData = [[NSData alloc] initWithContentsOfFile:cerPath];
CFDataRef certDataRef = (__bridge CFDataRef)certData;
SecCertificateRef certRef = SecCertificateCreateWithData(NULL, certDataRef);
id certificate = (__bridge id)certRef;

然后我们将请求的固定证书设置为一个仅包含我们之前设置的证书的数组。

[request setSR_SSLPinnedCertificates:@[certificate]];

现在我们可以完成套接字了。

SRWebSocket *socket = [[SRWebSocket alloc] initWithURLRequest:request];       
[socket open];

关于ios - SocketRocket 和 iOS 证书固定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18223885/

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