AFNetworking+Nginx+HTTPS自签名服务器安全通信

简介: 摘要: 1.介绍iOS平台用AFNetworking与HTTPS后台接口进行安全通信。 2.介绍后台自签名证书制作步骤。 3.以及Linux平台Nginx配置HTTPS协议接口的Web站点。

这个关于AFNetworking的HTTPS安全通信的问题,很多没有过第一次经验的以及甚至有过一次经验的都会有点不确定。 其实很简单:

A.对于后台服务器所配置动证书如果是经过CA机构认证颁发的,那么用户用AFNetworking来访问后台接口完全无感觉,就和http一样的方式。
B.但是一个HTTPS的证书如果是知名CA机构认证颁发的,那么就会有问题,AFNetworking默认拒绝和这样的后台服务器通信,因为验证通不过,就和大家网页打开12306网站抢票一样,那个证书也不是经过CA颁发的,而是铁道部自己签名的一个证书。所以,对于中小型初创或是成长型公司来说,买一个https的证书也是需要花费不少费用的。所以大家在做后台通信的时候一般都自签名一个证书来实现https接口。自己签名的的证书可以用下面这个openssl命令进行生成:
openssl req -new -x509 -nodes -days 365 -newkey rsa:1024  -out tv.diveinedu.com.crt -keyout tv.diveinedu.com.key

其中: -days 365是指定证书的有效期时间长度,单位是天,从命令运行的时刻算起; -newkey rsa:1024是指定新生成的证书使用1024位长度的RSA非对称加密算法; -out 指定输出的证书文件名 -keyout 指定输出的私钥文件名 上面这个命令运行后会要输入一些设置信息:

Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Hunan
Locality Name (eg, city) :Changsha
Organization Name (eg, company) [Internet Widgits Pty Ltd]:tv.diveinedu.com
Organizational Unit Name (eg, section) :Market
Common Name (e.g. server FQDN or YOUR name) :tv.diveinedu.com
Email Address :diveinedu@qq.com

如果对搭建Linux后台HTTPS服务有兴趣,需要把证书和私钥上传到服务器或者直接在服务器生成,把此证书配置到后台服务器中,以Nginx为例进行如下设置:

1.先新增一个Nginx的虚拟主机配置文件,
sudo touch /etc/nginx/sites-available/tv.diveinedu.com
2.然后使这个配置文件生效:
sudo ln -sf /etc/nginx/sites-available/tv.diveinedu.com /etc/nginx/sites-enabled/tv.diveinedu.com
3.编辑该文件:
sudo vim /etc/nginx/sites-enabled/tv.diveinedu.com
4.敲入 i 进入VIM编辑模式,输入这样配置:
server {
    listen 80;#HTTP默认端口80
    server_name tv.diveinedu.com;#主机名,与HTTP请求头域的HOST匹配
    access_log  /var/log/nginx/tv.diveinedu.com.log;#访问日志路径
    return 301 https://$server_name$request_uri;#强制把所有http访问跳转到https
}

server {
    listen 443;#HTTPS默认端口443
    ssl on;#打开SSL安全Socket
    ssl_certificate      /etc/nginx/tv.diveinedu.com.crt;#证书文件路径
    ssl_certificate_key  /etc/nginx/tv.diveinedu.com.key;#私钥文件路径

    server_name tv.diveinedu.com;#主机名,与HTTP请求头域的HOST匹配
    access_log  /var/log/nginx/tv.diveinedu.com.log;#访问日志路径
    location / {
        root /var/www/tv.diveinedu.com/;#网站文档根目录
        index index.php index.html;#默认首页
    }
}
5.敲ESC后退出VIM的编辑模式,再敲入 x 回车 在Vim保存退出。 然后执行Nginx配置文件语法检查命令检查配置是否有错:
nginx -t

如果没有错误就会输出:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
6.然后就只需要重启Nginx服务器了
sudo service nginx restart

然后就去你的域名服务商后台把你的域名解析到服务器到IP地址就可以自由访问了,只不过会浏览器访问会被自动组织并显示警告,手动添加到信任即可。

如果公司有钱想为用户提供更好的服务和体验,最好还是去知名CA认证机构去注册申请一个有效的证书为妙! 不然浏览器(Chome)会这样:

image
image
image

7.证书格式转换 由于iOS端Apple的API需要der格式证书,故用如下命令转换
openssl x509 -outform der -in tv.diveinedu.com.crt -out tv.diveinedu.com.der
8.iOS工程Info.plist设置
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>tv.diveinedu.com</key>
            <dict>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
            </dict>
        </dict>
    </dict>

9.iOS端证书验证代码:

    //openssl x509 -outform der -in tv.diveinedu.com.crt -out tv.diveinedu.com.der
    NSString *certFilePath = [[NSBundle mainBundle] pathForResource:@"tv.diveinedu.com" ofType:@"der"];
    NSData *certData = [NSData dataWithContentsOfFile:certFilePath];
    NSSet *certSet = [NSSet setWithObject:certData];
    AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey withPinnedCertificates:certSet];
    policy.allowInvalidCertificates = YES;
    policy.validatesDomainName = YES;


    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.securityPolicy = policy;
    manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

    [manager GET:@"https://tv.diveinedu.com/channel/" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"%@",responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@",error);
    }];

文章转载自 开源中国社区[https://www.oschina.net]

相关文章
|
7天前
|
网络协议 JavaScript 前端开发
WebSocket:实现客户端与服务器实时通信的技术
WebSocket:实现客户端与服务器实时通信的技术
|
7天前
|
监控 Unix 应用服务中间件
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
|
2天前
|
移动开发 iOS开发 Perl
iOS客户端和h5页面的互相调用,服务器和客户端间通信方式
iOS客户端和h5页面的互相调用,服务器和客户端间通信方式
7 0
|
7天前
|
应用服务中间件 网络安全 Apache
构建高性能Web服务器:Nginx vs Apache
【5月更文挑战第16天】Nginx与Apache是两种主流Web服务器,各具优势。Nginx以其轻量级、高并发处理能力和反向代理功能见长,适合大型网站和高并发场景;而Apache以功能丰富、稳定性强闻名,适合企业网站和需要多种Web服务功能的场景。在性能上,Nginx处理高并发更优,Apache则可能在高负载时遭遇瓶颈。在选择时,应根据实际需求权衡。
|
8天前
|
缓存 负载均衡 安全
深入探索Nginx高性能Web服务器配置与优化
【5月更文挑战第7天】本文深入探讨了Nginx的配置与优化,重点介绍了基础配置参数如`worker_processes`、`worker_connections`和`keepalive_timeout`,以及优化策略,包括使用epoll事件驱动模型、开启gzip压缩、启用缓存、负载均衡和安全配置。此外,还提到了性能调优工具,如ab、nginx-stats和nmon,以助于提升Nginx的性能和稳定性。
|
8天前
|
开发框架 前端开发 JavaScript
C# 结合JavaScript实现手写板签名并上传到服务器
C# 结合JavaScript实现手写板签名并上传到服务器
|
8天前
|
负载均衡 监控 Unix
[AIGC] Nginx:一个高性能的 Web 服务器和反向代理
[AIGC] Nginx:一个高性能的 Web 服务器和反向代理
|
8天前
|
JSON JavaScript 前端开发
服务器通信:使用WebSocket与后端实时交互
【4月更文挑战第24天】WebSocket为解决服务器与客户端实时双向通信问题而生,常用于聊天、游戏和实时通知等场景。本文通过4步教你实现WebSocket通信:1) 客户端使用JavaScript创建WebSocket连接;2) 监听`open`、`message`和`close`事件;3) 使用`send`方法发送数据;4) 使用`close`方法关闭连接。服务器端则需处理连接和数据发送,具体实现依后端技术而定。WebSocket为现代Web应用的实时交互提供了强大支持。
|
8天前
|
应用服务中间件 Linux 开发工具
如何在阿里云服务器快速搭建部署Nginx环境
以下是内容的摘要: 本文档主要介绍了在阿里云上购买和配置服务器的步骤,包括注册阿里云账号、实名认证、选择和购买云服务器、配置安全组、使用Xshell和Xftp进行远程连接和文件传输,以及安装和配置Nginx服务器的过程。在完成这些步骤后,你将能够在服务器上部署和运行自己的网站或应用。
|
8天前
|
弹性计算 应用服务中间件 Linux
阿里云ECS服务器上从零开始搭建nginx服务器
阿里云ECS服务器上从零开始搭建nginx服务器