从SSL安全传输到iOS证书安全体系1
来源:互联网 发布:pyqt5 知乎编程 编辑:程序博客网 时间:2024/06/05 01:15
从SSL安全传输到iOS证书安全体系
安全是计算机网络科学永恒的话题,随着计算机科学的发展数据安全将会越来越重要。
人们都是通过网络进行数据的交互传输,如果数据被别人在传输过程中截取,进行篡改将会造成严重的后果,给人们的生活带来影响。
数据的加密是保证不合法的人获得的数据不可读,或者要想解密也很难或者不可能,而合法的人通过约定的方式就能获得可读的传输信息。
下面我们通过一个例子来把数据传输加密进行分解:
情景1:A要写一封信给B,A写的信是可读的它并没有对信的内容进行任何的修改,B得到A的信之后不经过任何处理就可以阅读。如果我们生活在一个决定诚信安全的社会环境的话,没有必要做任何的处理。B拿到的信就是A想要给B的信。
我们把情景1进行分解:A用户,写的信Email,传输过程transport,接收者B,在这个情景中Email是要保护的对象,传输过程是一个复杂的过程,如果有不良用户想得到信,进行串改,在发给B。这样B得到的信就不是A想要表达的真正信息。
如果我们想避免数据在传输过程中即使数据安全,和两端信息的真实信,就要对数据进行处理,A对数据进行加密处理处理,即使在传输过程中被截取也不能可读,B得到数据通过约定的解密方法解密数据,B还可以验证数据的完整行,和用户的是否是A发出的。
通过情景引伸出问题?
1.A如何证明自己就是A?
2.A如何证明信是A写的?
3.A如何加密数据?
4.A如何让数据保持完整性?
5.A和B之间的加密约定是什么?
6.A和B之间的公钥怎么交换?
7.B接受到信时,如何知道信没有被修改?
8.B怎么验证这份信就是A写的?
上面的问题就是今天的主题:
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。
下面我将通过图解SSL的方式对上面的问题进行一一解答。(note:讲解的主题是非对称加密,至于对称加密大家可以文度娘)
问题1.A如何证明自己就是A?
在现实生活中我们每个人都会有一个身份证,这个身份证上有身份证号码,家庭住址,出生年月等基本信息,还有就是发证机关。通过身份证我们就知道这个人。A通过身份证告诉别人我就是A。身份证是公信度比较高的机构签发,如果A的身份证不是公信度高的机构签发的,就相当于一个人拿着不是公安机关签发的身份证你会相信这个人就是A吗?这就引出了计算机加密中的一个关键词发证机构:(certification authority)CA。CA就相当于公信度比较高的机构,它可以签发证书。CA就相当于公安机关。
如果A想要去CA申请一个证书的话,A就要提供自己的相关信息,就像你想办理身份证,你要去提供你的照片出生年月家庭住址等信息,公安机关通过你提供的信息就会为你办理身份证,你的身份证上面就有你的基本信息和身份证好,身份证号就是公共机构管理身份证的唯一标识,并加上发证机关的信息,表示是由哪个机构发的证。A通过上传自己的信息到CA机构,CA机构同样的为你生成证书certificate。
你可以去公安机关拿你的身份证,但是A同样的可以去发证机关CA下载自己的证书,就像你去Apple的证书中心下载它为你创建的证书一样。CA同样的为你的证书进行签名 ,它是用它自己的自签名证书(root certification根证书)为你的证书签名,表示是又它发证的。
CA是如何使用root certification为你的证书签名的了(一般是这样的通过hash算法得到你的证书的hash码,如MD5算法,不同的内容的hash码不一样,这就保证了你的证书的完整性),得到了证书的hash码之后,CA通过它的root certification的private key(私有钥匙)通过一定的加密算法把证书的hash码加密。你可以通过它的公钥解密它用私钥加密的文件。这样就有了CA为你生成的证书certification-A,证书的hash码的加密部分,和root certification。
比如你从CA下载下来了你的certification包裹,里面的组成是(certification-A,证书的hash码加密部分,root certification),这样你就可以通过rootcertification中的公钥对证书的hash码的加密部分进行解密得到certification-A的hash1码,你在通过hash算法把你得到的证书进行hash运算得到hash2码,如果hash1和hash2是相等的,就表明certification-A是有CA签发的发送过程中没有被修改。这样A就得到了自己的证书了。B同样也是通过这种方式去获得自己的证书。
关键字:certification:证书,其中包含了个人信息,证书的有效期,证书号,公钥,发证机关信息,root certification;
CA:发证机关;
证书签名:通过对内容进行hash运算,通过私钥加密,保证内容的完整性;
hash:不同长度的内容通过hash算法得到定长的数据的算法;
公钥(public key):在非对称加密中公钥是可以向外公开的,它可以对对应的私钥进行解密;
私钥(private key):在非对称加密中是自己保存的。
得到了certification后,在Mac平台下,我们可以通过key chain钥匙串管理程序对证书进行管理,还可以通过它来导出证书对应的私钥。
问题2.A在发送信息时如何让B知道是A写的信了。所以在信息中要加上A的数字证书,这样B在收到信息之后就用CA的公钥对附加的A的数字证书进行解密,解密得到附加的证书是不A。
问题3.A如何加密信息,A通过hash函数得到了内容的hash码,用自己的私钥进行加密签名,保证数据的完整性,附加上自己的数字证书,通过B的公钥进行加密,加密之后就得到最终要发送的数据。
问题4.A如何保证数据的完整性,通过提取内容的hash码,并通过自己的私钥进行加密,得到数字签名附加到发送的信息中。
问题5.加密约定是通过对方的公钥可以解开对方用私钥加密的数据。
问题6.公钥是包含在数字证书中的,当SSL握手完成之后,实际上就完成的公钥的交换。
问题7.B接受到消息之后,首先通过自己的私钥进行解密,对A的身份进行确认,用A的公钥解开签名得到内容的hash码,通过hash函数重新生成内容的hash码,对比两个hash码,如果相同则信息没有被修改,如果不相同则说明信息被修改了。
问题8.B是如何验证是A写的信,SSL握手完成之后就交换了信息公钥,当B接受到A的消息之后,B通过自己的私钥解密消息包,得到A的数字证书,得到数字证书通过CA的公钥进行解密得到A的证书就可以验证是不是A写了。
万事具备只差东风。。。。。。。。。。。。
非对称加密原理:
A持有B的公钥,A通过B的公钥可以解密B通过B的私钥加密的信息。
B持有A的公钥,B通过A的公钥可以解密A通过A的私钥加密的信息。
使用证书加密通信和解密信息的过程:
加密发送方:
接受解密方:
iOS的SSL的代码实现步骤:
1.要准备开启一个安全的会话要经历下面的步骤:
a.通过SSLCreateContext创建一个SSL会话的上下文,所谓上下文就是进行当前操作所需要的资源和会话的当前状态标示的内存缓存区。
b.编写SSLWrite和SSLRead函数,并通过SSLSetIOFuncs设置SSL安全传输的读写操作
c.因为SSL是建立在TCP之上的所以,SSL需要一个TCP的连接,你可以通过CFNetWork,BSD Socket等建立一个连接,然后通过SSLSetConnection把连接上下文和建立的socket连接关联起来。
d.通过SSLSetPeerDomainName来设置端点的域名,这是一个可选的操作,建议写上。
e.调用SSLSetCertificate来设置链接的证书,改选项在服务器端是必选项在客户端时可选项。
2.开始一个安全对话
通过调用SSLHandShake来进行安全对话,握手成功之后,所发的信息就是加密的安全信息了。
3.维护安全对话
设置了SSLWrite和SSLRead函数之后SSL连接会根据需要来进行调用。
4.结束一个SSL安全对话
1.调用一个SSLClose
2.关闭连接,处理SSLConnectionRef
3.如果你创建一个连接上下文通过SSLNewContext的话,你就要通过SSLDisposeContext进行处理,如果你通过SSLCreateContext创建你就要通过CFRelease进行释放连接资源。
4.如果你通过调用SSLGetPeerCertificates去获得对方的证书话,你要通过CFRelease去释放证书。
GCDAsyncSocket的SSL代码实现:
1.创建一个字典:
2.设置证书,
3.设置对话的常量,
4,把这些设置的常量用键值对的形式设置到字典中
5.最后调用StartTLS,参数为创建的字典,其实startTLS是对上面操作的一个封装,有兴趣可以去开GCDAsyncSocket的源代码
下面的代码说明:扩展名为p12的文件时个人信息可交换文件,你可以通过钥匙串管理工具得到对应证书的p12文件,通过p12提取证书,把证书设置到子点中等。调用startTLS,GCDAsyncSocket会为我们完成建立SSL上下文和握手清理工作等。
NSMutableDictionary *sslSettings = [[NSMutableDictionary alloc] init]; NSData *pkcs12data = [[NSData alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"client" ofType:@"p12"]]; CFDataRef inPKCS12Data = (CFDataRef)CFBridgingRetain(pkcs12data); CFStringRef password = CFSTR("YOUR PASSWORD"); const void *keys[] = { kSecImportExportPassphrase }; const void *values[] = { password }; CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL); CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); OSStatus securityError = SecPKCS12Import(inPKCS12Data, options, &items); CFRelease(options); CFRelease(password); if(securityError == errSecSuccess) NSLog(@"Success opening p12 certificate."); CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0); SecIdentityRef myIdent = (SecIdentityRef)CFDictionaryGetValue(identityDict, kSecImportItemIdentity); SecIdentityRef certArray[1] = { myIdent }; CFArrayRef myCerts = CFArrayCreate(NULL, (void *)certArray, 1, NULL); [sslSettings setObject:(id)CFBridgingRelease(myCerts) forKey:(NSString *)kCFStreamSSLCertificates]; [sslSettings setObject:NSStreamSocketSecurityLevelNegotiatedSSL forKey:(NSString *)kCFStreamSSLLevel]; [sslSettings setObject:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsAnyRoot]; [sslSettings setObject:@"CONNECTION ADDRESS" forKey:(NSString *)kCFStreamSSLPeerName]; [sock startTLS:sslSettings];
下面yi g
- 从SSL安全传输到iOS证书安全体系1
- 从SSL安全传输到iOS证书安全体系2
- 免费 SSL 安全证书
- SSL安全证书
- java web SSL安全证书
- 关于证书安全体系的理解
- 如何通过SSL证书确保网站安全
- SSL安全证书技术十问
- SSL安全证书技术十问
- 更安全的部署SSL证书
- 如何更安全的部署SSL证书
- 更安全的部署SSL证书
- 使用SSL证书保障网络游戏信息安全
- 使用SSL证书保障网络游戏信息安全
- 如何部署SSL服务器证书更安全
- 如何部署SSL服务器证书更安全
- 更安全的部署SSL证书
- C#开发快速导入ssl安全证书
- ZYNQ 文件系统生成
- 即时通讯:socket 使用
- c++primer练习11.33
- JAVA: Java基础-Jar包添加到build path方式说明
- 黑马程序员——OC分类和本质探索
- 从SSL安全传输到iOS证书安全体系1
- 第五周项目三 程序的多文件组织
- Memcached的序列化处理保存数据
- poj1419Graph Coloring
- 工厂模式
- 第五周项目二:对象作为数据成员
- X264如何阅读数
- java同步器——1——笔记
- 所谓的 双向BFS