OC网络学习19:SSL/TLS加密协议探索

张建 lol

前言

在iOS开发中,客户端和服务端之间使用 SSL/TLS协议 进行 加密通信 时,需要进行 证书验证 以确保通信的安全性。以下是iOS开发中验证证书的流程和与服务端协作的方法:

SSL双向认证

  1. 介绍

SSL双向认证,也称为 客户端认证或双向SSL认证,是 一种安全协议,用于确保 服务器和客户端 之间的 双向身份验证和加密通信

  1. SSL双向认证的详细流程
  • 客户端向服务器发送一个连接请求,请求建立安全连接。

  • 服务器返回一个数字证书,其中包含服务器的公钥和其他相关信息。

证书是由可信的证书颁发机构(CA)签名的,以确保证书的真实性。

  • 客户端验证服务器的证书。

它会检查证书的签名是否有效,并验证证书中的域名与实际连接的域名是否匹配。

如果验证失败,客户端会中止连接。

  • 客户端生成一个随机的对称密钥,并使用服务器的公钥对其进行加密。然后,客户端将加密后的密钥发送给服务器。

  • 服务器使用自己的私钥解密客户端发送的加密密钥,得到对称密钥。

  • 服务器和客户端现在都拥有相同的对称密钥,用于加密和解密后续的通信。

  • 客户端发送一个包含自己的数字证书的请求给服务器,以进行客户端身份验证。

  • 服务器验证客户端的证书。

它会检查证书的签名是否有效,并验证证书中的域名与实际连接的域名是否匹配。

在客户端实现证书验证

在iOS开发中,可以使用 NSURLSession或NSURLConnection 来建立安全连接。默认情况下,这些类将使用 系统内置的根证书验证服务器提供的证书,但也可以 自定义证书验证 逻辑。例如,可以使用 AFSecurityPolicy库 中提供的 AFSecurityPolicy类 来进行证书验证,具体步骤如下:

  • 创建AFSecurityPolicy对象:
1
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
  • 添加需要验证的证书:
1
2
3
4
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"server" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
NSSet *certSet = [NSSet setWithObject:certData];
[securityPolicy setPinnedCertificates:certSet];
  • 开启验证:
1
2
securityPolicy.allowInvalidCertificates = NO;
securityPolicy.validatesDomainName = YES;

其中,setPinnedCertificates: 方法用于 指定需要验证的证书allowInvalidCertificates 属性用于控制 是否允许无效证书validatesDomainName 属性用于控制 是否验证域名

在服务端配置证书

在服务端实现 SSL/TLS 协议时,需要配置证书以进行加密通信。在证书配置中,需要指定证书的路径和密码等信息,例如在Apache中的配置:

1
2
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key

在配置中,SSLCertificateFile 指定 证书的路径SSLCertificateKeyFile 指定 私钥的路径。需要注意的是,私钥文件需要保证只有服务器进程有读取权限,以确保私钥的安全。

确认证书匹配

在建立 SSL/TLS 连接时,客户端会向服务端请求证书。服务端会将自己的证书发送给客户端,客户端会验证证书的有效性,并检查证书中的主机名是否匹配。如果证书验证通过,则建立安全连接,否则连接会被终止。客户端可以通过 NSURLSessionDelegateNSURLConnectionDelegate 的相关方法来实现 证书验证和主机名匹配

在服务端实现 SSL/TLS 协议时,需要确保 证书和私钥 的匹配。服务端会在启动时自动加载证书和私钥,并使用它们来建立安全连接。如果证书和私钥不匹配,则无法建立安全连接。

  • Post title:OC网络学习19:SSL/TLS加密协议探索
  • Post author:张建
  • Create time:2023-07-24 15:41:10
  • Post link:https://redefine.ohevan.com/2023/07/24/OC网络/OC网络学习19:SSL:TLS加密协议探索/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.