这个关于AFNetworking的HTTPS安全通讯的问题,不少没有过第一次经验的以及甚至有过一次经验的都会有点不肯定。 其实很简单:php
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
sudo touch /etc/nginx/sites-available/tv.diveinedu.com
sudo ln -sf /etc/nginx/sites-available/tv.diveinedu.com /etc/nginx/sites-enabled/tv.diveinedu.com
sudo vim /etc/nginx/sites-enabled/tv.diveinedu.com
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;#默认首页 } }
nginx -t
若是没有错误就会输出:nginx
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo service nginx restart
而后就去你的域名服务商后台把你的域名解析到服务器到IP地址就能够自由访问了,只不过会浏览器访问会被自动组织并显示警告,手动添加到信任便可。git
若是公司有钱想为用户提供更好的服务和体验,最好仍是去知名CA认证机构去注册申请一个有效的证书为妙! 否则浏览器(Chome)会这样:算法
vim
openssl x509 -outform der -in tv.diveinedu.com.crt -out tv.diveinedu.com.der
<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); }];