文档章节

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

大茶园丁
 大茶园丁
发布于 2015/11/27 12:02
字数 1157
阅读 3266
收藏 114
点赞 3
评论 20

这个关于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)会这样:

输入图片说明

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

  • 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);
    }];

© 著作权归作者所有

共有 人打赏支持
大茶园丁
粉丝 57
博文 15
码字总数 21159
作品 0
长沙
加载中

评论(20)

大茶园丁
大茶园丁

引用来自“xcorp”的评论

引用来自“大茶园丁”的评论

引用来自“xcorp”的评论

wosign有免费的,用了一下

太好了 谢谢 我也去瞧瞧

关键是权威机构颁发,在Firefox和chrome上不会报警了。话说我好像加了你的Q,见你的账号认出来了

你是?
xcorp
xcorp

引用来自“大茶园丁”的评论

引用来自“xcorp”的评论

wosign有免费的,用了一下

太好了 谢谢 我也去瞧瞧

关键是权威机构颁发,在Firefox和chrome上不会报警了。话说我好像加了你的Q,见你的账号认出来了
大茶园丁
大茶园丁

引用来自“xcorp”的评论

wosign有免费的,用了一下

太好了 谢谢 我也去瞧瞧
xcorp
xcorp
wosign有免费的,用了一下
开源中国X科长
开源中国X科长
不用ssl 关键数据自己AES
请叫我赵小宝
请叫我赵小宝
我了个去
菠罗
菠罗

引用来自“山里来的”的评论

12306据说2亿的工程,证书这几百块也要省?
看上去这不是钱的问题,铁路总公司不会却那点小钱的。他们使我的证书是SRCA颁发的证书。什么是SRCA?SRCA就是Sinorail Certification Authority,中文名叫中铁数字证书认证中心(http://sinorailca.com/srca.html),简称中铁CA。这是个铁道部自己搞的机构,相当于是自己给自己颁发证书,当然不会被信任。当然,12306这种东西,要么你用,要么你不用。这是刚性需求。铁道公司强势嘛。他才不管国际所认可的CA机构。你们能搞,我也能搞。这是在china,哈哈。
dsde
dsde

引用来自“理工小强”的评论

引用来自“neaix”的评论

startSSL,免费的
郁闷 申请过一两次都没过 。。。

不会呀,我一次就过了。
灵魂架构师
灵魂架构师

引用来自“山里来的”的评论

12306据说2亿的工程,证书这几百块也要省?

引用来自“理工小强”的评论

其实只要你信任了它的根CA 它签的所有证书理论上都会信任吧 比如它签发了个Google的你也会认为访问真的谷歌了吧
你说到重点了,如果用了别人几百块的证书,那么别人也可以中间人你,不过说的现在就跟别人不能中间人似得,想要不被监听,不被中间人,谁的证书都别信任,哪怕是几百块的证书,唯一能信任的证书就是自己签发,自己签名的,不过那样的话SSL还有意义吗?
大茶园丁
大茶园丁

引用来自“neaix”的评论

startSSL,免费的

引用来自“理工小强”的评论

郁闷 申请过一两次都没过 。。。
还等等。就https://letsencrypt.org/有免费了。现在还在beta版本,Let’s Encrypt is a new Certificate Authority: It’s free, automated, and open. In Limited Beta
SSH、SSL与HTTPS

关于加密 在解释SSH、SSL与HTTPS协议之前我先介绍一下非对称加密协议。在1976年以前,所有的加密都采用对称加密,既A使用某种加密规则对信息加密,B收到信息后逆向加密规则解密数据。这通信方...

我在睡觉
2017/03/03
0
0
Android安全开发之浅谈密钥硬编码

Android安全开发之浅谈密钥硬编码 作者:伊樵、呆狐@阿里聚安全 1 简介在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码、文件中,这样做会引起很大...

阿里聚安全
2016/05/16
629
1
SSL 与 Spring-Boot 结合

SSL 安全套接字 超文本传输协议(HTTP)是以纯文本形式传输数据,这样并不安全 SSL(安全套接层),及其继任者传输安全(TLS)是为网络通信提供安全及数据完整的一种安全协议,在传输层对网络...

林塬
2017/12/29
0
0
深入了解ApusicAS服务器配置系列之——SSL配置

近日,随着铁路客服中心网上购票系统中逐步可以购买大部分车次的列车,12306网站的种种问题便暴露出来,估计现在信息中心及系统开发商正在紧锣密鼓关注系统运行状态,并绞尽脑汁查找一切可以...

晨曦之光
2012/03/09
0
0
控制数据权限的 Docker 项目--Notary

Notary 包括服务器和客户端,用于运行和与受信任的集合进行交互。有关详细信息,请参阅服务体系结构文档。 Notary 的目标是使互联网更加安全,方便人们发布和验证内容。我们经常依靠 TLS 来保...

匿名
2017/10/25
57
0
Volley实现Https的单向认证

实现Https的单向认证,首先需要生成一个公钥和私钥,并且拿公钥到CA机构进行签名。生成签名证书。证书里面包含数字签名和公钥。然后客户端需要将公钥证书预埋在自己的APK中。在建立SSL连接的...

pyzhou
05/10
0
0
HTTPS 中间人攻击及其防范

祝鑫奔 祝鑫奔,YMFE 工程师,猫奴,沉迷于吸猫无法自拔。负责 QReact、QRN-Web 的开发和维护。 在之前的文章中,笔者简要介绍了一下 HTTPS 的工作原理,在扩展阅读中,笔者提到了中间人攻击...

Qunar技术沙龙
03/20
0
0
DTLS协议详解

1.DTLS介绍 1.1 DTLS的作用 互联网先驱们最开始在设计互联网协议时主要考虑的是可用性,安全性是没有考虑在其中的,所以传输层的TCP、UDP协议本身都不具备安全性。SSL/TLS协议是基于TCP soc...

dazern
2017/07/13
0
0
Linux学习笔记:Linux服务以及服务的安全

一、数据加密和解密 进程间通信: 同一主机内的进程间通信: 发送信号(signal), 共享内存(shm), semaphore message queue, MQ, RabbitMQ 不同主机之间的进程间通信: Socket-pair,套接字对儿...

何时心安
2017/08/03
0
0
苹果强制使用HTTPS传输了怎么办?——关于HTTPS,APP开发者必须知道的事

WeTest 导读 2017年1月1日起,苹果公司将强制使用HTTPS协议传输。本文通过对HTTPS基础原理和通信过程内容的讲解,介绍APP开发者在这个背景下的应对办法。 几周前,我们在《https大势已来?看...

依依言若
2016/12/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

打印斐波那契数

package com.jerry.ch04;public class PrintFibonacci {public static void main(String[] args) {for (int i=0; i<10; i++) {System.out.print(fib(i) + " ");}......

JerryNing
10分钟前
0
0
shell编程

一、shell脚本介绍

人在艹木中
11分钟前
0
0
istio 0.8 遥测 案例

==============遥测===================================== 演示如何从网格中收集遥测信息。 分布式跟踪。如何配置代理以向Zipkin或Jaeger发送跟踪请求 收集度量标准和日志。此任务说明如何配...

xiaomin0322
13分钟前
0
0
ND4J求多元线性回归以及GPU和CPU计算性能对比

上一篇博客《梯度下降法求多元线性回归及Java实现》简单了介绍了梯度下降法,并用Java实现了一个梯度下降法求回归的例子。本篇博客,尝试用dl4j的张量运算库nd4j来实现梯度下降法求多元线性回...

冷血狂魔
14分钟前
0
0
springboot常用注解

@SpringBootApplication: 包含@Configuration、@EnableAutoConfiguration、@ComponentScan 通常用在主类上。 @Service: 用于标注业务层组件。 @RestController: 用于标注控制层组件(如strut...

GoldenVein
20分钟前
1
0
如何进行大数据的入门级学习?

不知道你是计算机专业应届生还是已经从业者。总之,有java基础的学生学习大数据会轻松很多,零基础的小白都需要从java和linux学起。 如果你是一个学习能力特别强,而且自律性也很强的人的话可...

董黎明
34分钟前
0
0
使用Parcelable传递复杂参数

最近做AIDL传递对象,对象必须实现Parcelable的方法才可以被传递。 @Override    public int describeContents() {//这个 默认返回0就行了。        return 0;    }    ...

火云
35分钟前
0
0
十大Intellij IDEA快捷键

Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论。每个人都有自己的最爱,想排出个理想的榜单还真是困难。以前也整理过Intellij的快捷键,这次就按照我日常开发...

HJCui
45分钟前
0
0
word 使用mathtype 编写 数学公式

下载安装,这个链接命名。。。。 http://www.mathtype.cn/xiazai.html 安装之后会多出一个选项 使用内联方式插入图表 编写公式的界面 设置支持latex 语法 输入公式回车就可以看到结果...

阿豪boy
今天
0
0
Promise

定义 Promise是异步编程的一种解决方案,所谓Promise就是一个容器,里面保存着某个未来才会结束的事件(通常是一个一步操作)的结果。 特点: 2.1 对象的状态不受外界影响,三种状态pending...

litCabbage
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部