GCDAsyncSocket two way authentication SSL 双向认证
核心
1. 怎么创建 NSMutableDictionary *sslSetting
2.怎么验证服务端公钥
准备:
本人目前使用的 iOS 公私钥是 p12, 服务端公钥建议准备.der 文件。本人实验了多种方式,觉得下面粘的代码的那种方式最靠谱。
SecIdentityRef identityout; // You can get SecIdentityRef object from *.p12 keystore file. SSL Socket Server will authentication client base on this certificate. At server side, we will add client's certificate to trust manager.[sslSettings setObject:@0 forKey:GCDAsyncSocketSSLProtocolVersionMax];[sslSettings setObject:@YES forKey:GCDAsyncSocketManuallyEvaluateTrust]; // This will call a delegate method socket:(GCDAsyncSocket *)sock didReceiveTrust: ...[sslSettings setObject:[[NSArray alloc] initWithObjects:(__bridge id)(identityout), nil] forKey:GCDAsyncSocketSSLCertificates]; [self.asyncSocket startTLS:sslSettings];
特别需要注意这个
GCDAsyncSocketSSLProtocolVersionMax 这个key,根据实际项目,去develop.apple.com 查找适应你自己的SSL 加密方式。
2. 在- (void)socket:(GCDAsyncSocket *)sock didReceiveTrust:(SecTrustRef)trust completionHandler:(void (^)(BOOL shouldTrustPeer))completionHandler;这个方法中 + (BOOL)isEqualTrust:(SecTrustRef)trust{ NSBundle *bundle = [self getTradeBundle]; NSString *rootCertPath = [bundle pathForResource:@"XXXX" ofType:@"der"]; NSData *rootCertData = [NSData dataWithContentsOfFile:rootCertPath]; OSStatus status = -1; SecTrustResultType result = kSecTrustResultDeny; if(rootCertData) { // 创建信任证书 CFDataRef certData = CFBridgingRetain(rootCertData); SecCertificateRef cert1; cert1 = SecCertificateCreateWithData(NULL, certData); // 设置信任证书 SecTrustSetAnchorCertificates(trust, (__bridge CFArrayRef)[NSArray arrayWithObject:(__bridge id)cert1]); status = SecTrustEvaluate(trust, &result); } else { NSLog(@"local certificates could not be loaded"); return NO; } if (status == noErr && (result == kSecTrustResultProceed || result == kSecTrustResultUnspecified)) { //成功通过验证,证书可信 NSLog(@"local certificates is trust"); return YES; } else { CFArrayRef arrayRefTrust = SecTrustCopyProperties(trust); NSLog(@"error in connection occured\n%@", arrayRefTrust); return NO; }}
GCDAsyncSocket two way authentication SSL 双向认证相关推荐
- php使用curl库进行ssl双向认证
官方文档: http://www.php.net/manual/zh/function.curl-setopt.php#10692 官方举例: <?php curl_setopt($ch, CU ...
- 服务器双向认证 原理,什么叫SSL双向认证 SSL双向认证过程是怎样的
我们都知道SSL认证能够分成SSL双向认证和SSL单向认证.那么,什么是SSL双向认证?SSL双向认证过程又是怎样的?小编就在接下来的内容为各位详细讲述. 什么叫SSL双向认证 SSL双向认证则是需要 ...
- SSL双向认证和SSL单向认证的区别
双向认证 SSL 协议要求服务器和用户双方都有证书.单向认证 SSL 协议不需要客户拥有CA证书,具体的过程相对于上面的步骤,只需将服务器端验证客户证书的过程去掉,以及在协商对称密码方案,对称通话密钥 ...
- HTTPS|SSL笔记-SSL双向认证成功握手过程(含wireshark分析)
这里只研究连接过程. 整体的流程是这样的 前三个那个SYN.SYN ACK.ACK是TCP三次握手,就不说了. 1. 握手成功后,客户端发送自己支持的加密套,和随机数给服务端,也就是Client He ...
- java使用bks双向认证_客户端与服务器SSL双向认证(客户端:Android
客户端与服务器SSL双向认证(客户端Android-服务端vc)-含源码(一)服务端已经生成了client.p12.server.p12.ca.p12:主要实现客户端过程(二)目录结构(三)客户端注 ...
- SSL双向认证和单向认证原理
一.公钥私钥 1,公钥和私钥成对出现 2,公开的密钥叫公钥,只有自己知道的叫私钥 3,用公钥加密的数据只有对应的私钥可以解密 4,用私钥加密的数据只有对应的公钥可以解密 5,如果可以用公钥解密,则必然 ...
- SSL双向认证和SSL单向认证的流程和区别
refs: SSL双向认证和SSL单向认证的区别 https://www.jianshu.com/p/fb5fe0165ef2 图解 https 单向认证和双向认证! https://cloud.te ...
- 什么是SSL双向认证,与单向认证证书有什么区别?
SSL/TLS 证书是用于用户浏览器和网站服务器之间的数据传输加密,实现互联网传输安全保护,大多数情况下指的是服务器证书.服务器证书是用于向浏览器客户端验证服务器,这种是属于单向认证的SSL证书.但是 ...
- Android 10 SSL双向认证握手失败
Android 10 SSL双向认证握手失败 公司项目前端时间遇到的一个问题(已经解决了),最近有时间准备分享一下. 项目工程中一直使用SSL双向认证的套接字通信方式,前段时间有Android 10的 ...
最新文章
- 深度学习调参有哪些技巧?
- 「自己开发直播」rtmp-nginx-module实现直播状态、观看人数控制
- 暴汗,今天遇到个奇事
- Tarjan 复习小结
- vue.js 三种方式安装--npm安装
- .NET技术之美-网络编程
- Koa(1)之——koa入门
- 如何在Java 8中使用filter()方法
- WifiManager的getScanResults()返回列表为0
- phpstudy mysql 1067_MySQL_MySQL的1067错误解决,1 
安装MYSQL后更改了ROOT的密码 - phpStudy...
- java并发编程第七课 集合类并发处理
- InstallShield Slient Uninstall
- css实现图片旋转360°
- vue---向后台校验用户名/手机号码/邮箱等唯一性的参数是否被注册
- 12 WebGL移动、旋转和缩放中的平移
- 微信公众号已认证怎么改名字,公众号昵称可以改吗?
- 像写Flutter一样开发Android原生应用
- 2023年英文科技论文写作与学术报告-期末考试
- ultraiso制作u盘启动盘方法
- 基于CNN的海面舰船图像二分类