文章目录
  1. 1. iOS实践项目
  2. 2. 传输层安全协议(TLS)
    1. 2.1. TLS的握手过程
    2. 2.2. 超文本传输安全协议(HTTPS)
  3. 3. 使用Nginx建一个简单的HTTPS服务器
    1. 3.1. 优化参数
    2. 3.2. 体验https
  4. 4. 吐槽
  5. 5. 参考

本文中将会使用iOS的Security.framework,写一个类来是先在iOS客户端的加解密操作。同时将这个类封装到一个静态文件中来加强安全性,感觉贴代码好傻,需要的还是去github上clone吧!不贴代码内容一下变少了,所以把本来在第三篇的内容,放到这里吧!所以这篇的重要内容是,iOS实践+ https介绍 + nginx https实践,内容有点不搭。

iOS实践项目

项目代码还是不在这个贴了,有需要的可以去这里 clone, 两点说明

  • 存放公钥需要用DER格式的文件,存放私钥需要使用p12格式的文件
  • 加密数据过长需要分片,Demo中未实现此步骤

传输层安全协议(TLS)

TLS提供两个应用程序间,通过网络的一个不安全通道,创建起安全的连接,来交换数据,防止数据受到窃听及篡改。

TLS的握手过程

握手可分为三个阶段:

  • 协商对等支持的密钥算法(密钥交换的非对称加解密算法、数据加密的对称密钥算法和会话密钥生成的散列函数)
  • 基于PKI证书的身份认证和非对称密钥的信息传递(传递随机数3)
  • 对称密钥生成和基于对称密钥的数据传输保密。

双向证书认证和SSL握手过程:

关于TLS更详细的信息可以参考wiki-传输层安全协议

两点说明

  • 客户端没证书时可以随机生成证书
  • 记录层的所有数据都被编号,用于消息校验码的校验

超文本传输安全协议(HTTPS)

HTTPS是HTTP和TLS的组合,用TLS创建安全链接,用HTTP交换数据。理论上的东西就说这么多了,我们现在要实现一个https服务器

使用Nginx建一个简单的HTTPS服务器

首先要创建私钥和公钥证书。可以参考RSA(一)的openssl实践部分创建。然后在nginx的启动目录中创建ssl文件夹,放入公钥证书和私钥,

在conf文件中添加https server,https的默认端口是443,当然你也可以指定端口。

1
2
3
4
5
6
7
8
9
10
server {
listen 443;

root /Users/zhangpan/apps/www;
index index.html index.htm;

ssl on;
ssl_certificate ../ssl/xinan_public_key.cer;
ssl_certificate_key ../ssl/xinan_private_key.pem;
}

尝试https访问localhost的时候,浏览器就会提示我们证书不受信。点击信任证书就可以和服务器使用https通信了。

优化参数

  • 通过ssl_session_cache参数设置缓存类型和大小,
1
ssl_session_cache shared:SSL:10m;

设置缓存类型为shared:SSL 表示我所有的nginx工作进程共享ssl会话缓存,缓存大小为10MB。

  • 通过ssl_session_timeout设置超时时间

系统默认的时间是5m,稍短可以设置成30m甚至4h。

体验https

分别使用http和https写了一个api,使用Charles抓包获取的response如下,可以明显看到https的传输内容已加密。

http数据包

https数据包

吐槽

研究RSA的起因是加密传输用户密码。其实用户密码加密是一个单向加密,完全不知道什么地方需要解密用户密码。后来使用sha哈希用户密码存服务器了。数据传输加密可以用https,不需要自己在客户端或服务器去做加解密操作。问题简单了····

参考

nginx配置ssl加密(单双向认证、部分https) 如果链接无效可以点击这里下载

wikipedia-传输层安全协议