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

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

  • 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 指定输出的私钥文件名 上面这个命令运行后会要输入一些设置信息:html

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为例进行以下设置:node

  • 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

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地址就能够自由访问了,只不过会浏览器访问会被自动组织并显示警告,手动添加到信任便可。git

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

输入图片说明

![输入图片说明](https://static.oschina.net/uploads/img/201511/27134919_OW6L.png "12306的自签名证书"")vim

  • 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);
    }];
相关文章
相关标签/搜索