IOS证书的申请和使用
http://www.cnblogs.com/cy568searchx/p/4895406.html苹果的证书繁锁复杂,制作管理相当麻烦,今天决定重置一个游戏项目中的所有证书,做了这么多次还
是感觉很纠结,索性直接记录下来,日后你我他查阅都方便;
关于证书
苹果使用密文签名技术来验证App的合法性,不管是iOS应用还是Mac应用都需要相应的签名证书来作为测
试或发布App用。这里主要谈谈iOS的证书,当然,Mac的证书也基本类似。
在开发iOS应用的时候,我们需要签名证书(开发证书)来验证,并允许我们在真机上对App进行测试。
另外,在发布App到App store的时候,我们也需要证书(发布证书)来做验证。那么什么是签名证书,如
何获取签名证书,下面听我慢慢道来。
首先,证书(Certificate)是用来证明某一件事是否成立的,好比拿到的获奖证书,是证明参加比赛并
获奖的凭证。类似,在iOS开发中,用证书来证明你是否具有某些权限或者能力来做某事。代码签名验证
允许我们的操作系统来判断是谁对App进行了签名,在安装了Xcode后,Xcode会在项目编译期间使用你的
代码签名验证,这个验证由一个由Apple认证过的公钥-私钥对组成,私钥存储在你的钥匙串中(Mac本地
,在系统实用工具中),公钥包含在证书(Certificates)中,证书在本地钥匙串和开发者账号中都有
存储,这种公钥-私钥验证授权的方式在很多地方都有使用到,比如Git中的SSH协议也是通过这种方式来
确认访问权限。另外,还有一个我们可以叫做媒介证书的证书来确保我们的证书(Certificates)是经
过授权而发布的。如下图所示:
1
当安装好Xcode时,媒介证书(Intermediate Certificate)就已经安装到我们的钥匙串中去了。通过在
开发者账号(Developer Account)和本地(Mac)都经过验证的证书(Certificate)我们就可以利用合
法的证书进行App的测试和发布了。
首先得描述一下各个证书的定位,作用,这样在制作的时候心中有谱,对整个流程的把握也会准确一些
;
1、开发者证书(分为开发和发布两种,类型为ios Development,ios Distribution),这个是最基础的
,不论是真机调试,还是上传到appstore都是需要的,是一个基证书,用来证明自己开发者身份的;
2、appID,这是每一个应用的独立标识,在设置项中可以配置该应用的权限,比如是否用到了
PassBook,GameCenter,以及更常见的push服务,如果选中了push服务,那么就可以创建生成下面第3条所
提到的推送证书,所以,在所有和推送相关的配置中,首先要做的就是先开通支持推送服务的appID;
3、推送证书(分为开发和发布两种,类型分别为APNs Development ios,APNs Distribution ios),该
证书在appID配置中创建生成,和开发者证书一样,安装到开发电脑上;
4、Provisioning Profiles,这个东西是很有苹果特色的一个东西,我一般称之为PP文件,该文件将
appID,开发者证书,硬件Device绑定到一块儿,在开发者中心配置好后可以添加到Xcode上,也可以直接
在Xcode上连接开发者中心生成,真机调试时需要在PP文件中添加真机的udid;是真机调试和必架必备之
珍品;
平常我们的制作流程一般都是按以上序列进行,先利用开发者帐号登陆开发者中心,创建开发者证书,
appID,在appID中开通推送服务,在开通推送服务的选项下面创建推送证书(服务器端的推送证书见下文
),之后在PP文件中绑定所有的证书id,添加调试真机等;
具体操作流程如下:
1、开发者证书的制作,首先登陆到开发者中心,找到证书配置的版块,猛戳进入,点进证书,会显示如
下界面,点击右上角的加号:
会出现以下界面,该操作重复两次,分别创建开发测试证书和发布证书,开发测试证书用于真机调试,
发布证书用于提交到appStore,我们以开发测试证书为例,选择第一个红框中的内容:
然后下一步,会提示创建CSR文件,也就是证书签名请求文件,会有很详细的操作说明,如果英文不太好
,可以参考下图;
根据它的说明创建打开KeychainAccess 创建 Certificate Signing Request。
填写“User Email Address”和“Common Name” 后选择 Saved to disk 进行保存 。
之后将该CSR文件保存到一处;
继续返回Apple developer 网站点击 Continue ,上传刚刚生成的 .certSigningRequest (CSR)文件生
成 APNs Push Certificate(CER):
提交上去后就会生成一个cer证书,如图所示,有效期为一年;
下载并双击打开证书,证书打开时会启动“钥匙串访问”工具。
在“钥匙串访问”中你的证书会显示在“我的证书”中,注意选择“My Certificates” 和"login"
备注:CSR文件尽量每个证书都制作一次,将常用名称区分开来,因为该常用名称是证书中的密钥的名字
;
之后在开发者中心将该CSR文件提交;
如果开发者B,登录开发者账号,下载证书(cer文件)运行,只有证书没有秘钥,是不能正常使用的
blob.png
所以如果有新同事加入到开发组的时候,应该从本地钥匙串中选择证书,导出p12文件(包含证书和秘钥
)给同事。
另外可以给同事一份Provisioning Profiles文件(配置文件),用于本地开发识别测试设备
导出p12文件:钥匙串——选择证书——右键导出——存储为——设置p12文件密码
(发给同事后,双击p12文件,输入密码,本地安装证书成功)
需要强调一点,证书和项目关系其实并不大,证书一般有效期只有一年,当证书过期后,只需要重新生
成一份证书,上传到开发者账号就行,同时因为原有证书过期,需要重新生成Provisioning Profiles文
件。然后给同事们最新的p12文件和Provisioning Profiles文件就行
所以开发者账号中的证书,配置文件是可以放心操作的(比如误删了,或者找不到证书秘钥了)
========
团队开发中如何共用证书
http://www.cnblogs.com/cy568searchx/p/4895398.html团队开发中,需要共享证书文件和私钥。若仅从provisioning portal下载证书文件而无私钥,xcode
会提示出错:Unable to code design using identities in this team: no private keys available
(无法在团队中进行代码签名:找不到有效的私钥)。解决办法:
(1) 打开钥匙串程序,选择 ‘秘钥’ 种类。
(2) 右键点击(或按住control点击)与开发证书相配套的私钥(专用密钥),并点击 ‘导出’,保存
为Personal Information Exchange (.p12) 文件格式.,将提示你创建一个密码,并需要管理员密码才
可导出。
(3) 拷贝该p12文件到其他机子上,会提示你输入上一步输入的密码。
要让真机跑起来,必须要在code signing里选者正确的provision(.mobileprovision)。provision是通
过certificate(证书)生成的,并包括了可以调试的设备uuid和对应的appid,只有满足这些条件的设备
和app才能使用这个provision跑起来。xcode一般会自动提供一个team provision用于让所有在开发者帐
号这册过的设备在所有的app上能运行,这样你就不用专门去制作用于调试的provision了。不过也有例
外的情况,如果你的app要使用push notification,in-app purchase等这些功能,还是需要使用只对应
该appid的provision。provision分为调试和发布两种,分别由调试证书和发布证书生成,使用发布的
provision不能在设备上作调试,使用调试的provision生成的app不能提交到AppStore上。
证书(.cer)是通过CSR(.certSigningRequest)文件生成的,CSR文件通过keychain工具来制作,
生成之后会在keychain里保存私钥,苹果通过CSR生成的证书文件则包含公钥信息。这个私钥相当的重要
,往往真机调试不了出现code signing invalid就是因为缺少私钥文件。私钥导出的是p12格式文件。
公钥和私钥是如何保证数据安全的,网上有好多资料介绍,简单来说它们是非对称加密方式,用
私钥加密的数据要用公钥才能解密,用公钥加密的数据要用私钥才能解密。数字证书相当于网络识别本
人的身份证,它包含有公钥的信息所以是公开被别人下载的,而私钥则是本人持有的。本人通过私钥把
数据加密发送出去后,持有本人数字证书的机构或个人如果能解密成功,就证明该数据确实是本人发送
的,这样数字证书就能起到识别发送者身份的作用。
========
ios开发使用Basic Auth 认证方式
http://blog.csdn.net/joonchen111/article/details/48447813我们app的开发通常有2种认证方式 一种是Basic Auth,一种是OAuth;现在普遍还是使用
OAuth的多,而使用Basic Auth认证的少,正好呢我今天给大家介绍的就是使用的比较少的Badic Auth认
证方式,这种认证方式开发和调试简单, 没有复杂的页面跳转逻辑和交互过程,更利于发起方控制。然
而缺点就是安全性更低,不过也没事,我们可以使用https安全加密协议,这样才更安全。
我使用的是AFNetworking发送的网络请求,因此我们用Basic Auth认证方式就不能再使用AFN的
默认的GET或者POST请求,而是自己定义的NSMutableRequest请求,使用AFN发送,如下面代码:
//http的get请求地址
NSString *urlStr=[NSString stringWithFormat:@"https://192.168.1.157:8443/v1/sms/send/
%@",self.username.text];
NSURL *url = [NSURL URLWithString:urlStr];
//自定义的request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//请求过期时间
request.timeoutInterval = 10;
//get请求
request.HTTPMethod = @"GET";
//配置用户名 密码
NSString * str = [NSString stringWithFormat:@"%@:%@",@"lairen.com",@"sdclean.com"];
//进行加密 [str base64EncodedString]使用开源Base64.h分类文件加密
NSString * str2 = [NSString stringWithFormat:@"Basic %@",[str base64EncodedString]];
[request setValue:str2 forHTTPHeaderField:@"Authorization"];
AFHTTPRequestOperation *op=[[AFHTTPRequestOperation alloc]initWithRequest:request];
//设置返回数据为json数据
op.responseSerializer= [AFJSONResponseSerializer serializer];
//发送网络请求
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id
responseObject) {
NSLog(@"%@",responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@",error);
}];
//请求完毕回到主线程
[[NSOperationQueue mainQueue] addOperation:op];
使用Basic Auth认证方式,AFN发送网络请求就是上述代码的格式,其中代码的一些难懂的点,我
在下图做了注释;
我注释的第一个是用户名,第二个是密码,这个使我们Basic Auth认证方式必须设置的请求头,
然后第三个呢是我们为了我确保安全把用户名和密码的字符串进行了Base64加密,使用的2个文件是开源
的Base64.h Base64.m 。github上面就可以下载。
上述代码中的这行是对字符串进行的加密,记住是使用的Base64.h分类方法进行的加密,一定要先导
入Base64.h文件才可以这样加密。
[str base64EncodedString]
NSString * str2 = [NSString stringWithFormat:@"Basic %@",[str base64EncodedString]];
到这里我们的Basic Auth认证方式就讲完了,怎么样,很简单吧。
========
iOS 8使用Touch ID进行身份认证
http://blog.csdn.net/lgouc/article/details/39829409iOS 8的SDK开放了Touch ID的接口.从WWDC的视频中可以看到Touch ID应用在两个方面:用于Key
Chain加密和用于授权.iOS 8正式版发布以后我们可以看到Evernote的iOS app已经集成了该功能.下面来
看看如何实现使用Touch ID进行身份认证.
其实很简单,用于身份认证的所有的接口都在LocalAuthentication framework中, 该framework实际上
只有三个头文件:
LAContext.h
LAError.h
LAPublicDefines.h
而实际用到的函数也只有两个:
// 用来判断设备是否支持Touch ID
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error;
// 真正验证身份的函数
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError *error))reply;
上述两个函数都是LAContext的member function.目前LAPolicy只有一个值:
LAPolicyDeviceOwnerAuthenticationWithBiometrics.
如果canEvaluatePolicy返回YES,表示设备支持指纹识别,那么便可以调用evaluatePolicy:函数进行指
纹识别了.调用evaluatePolicy函数后会弹出一个alert,如下图:
该alert可定制的只有两处:
1.”To access your photos”提示文字是由localizedReason参数指定的,用来向用户说明使用Touch
ID的目的.
2.”Enter Password”可由LAContext的localizedFallbackTitle属性设置(LAContext目前只有这一个
属性),如果不设置的话,默认是”Enter Password”.值得注意的是,如果该属性设置为@“”(空字符串),
该按钮会被隐藏,Evernote应该就是这么做的.
其他的免谈,当然更别提获取用户的指纹数据了.
理论上三种情况下会退出验证(alert会被dismiss,reply回调会被调用):
1.用户指纹通过验证
2.用户点击”Enter Password”按钮
3.用户点击”Cancel”按钮
还有一种情况:用户输入了错误的指纹.这种情况下,该alert不会被dismiss,其标题会由”Touch ID”
改为”Try Again”,有弹簧状的动画效果过渡.好了,代码如下(不要忘了引入头文件
<LocalAuthentication/LocalAuthentication.h>):
LAContext *context = [LAContext new];
NSError *error;
context.localizedFallbackTitle = @"";
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
error:&error]) {
NSLog(@"Touch ID is available.");
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:NSLocalizedString(@"Use Touch ID to log in.", nil)
reply:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"Authenticated using Touch ID.");
} else {
if (error.code == kLAErrorUserFallback) {
NSLog(@"User tapped Enter Password");
} else if (error.code == kLAErrorUserCancel) {
NSLog(@"User tapped Cancel");
} else {
NSLog(@"Authenticated failed.");
}
}];
} else {
NSLog(@"Touch ID is not available: %@", error);
}
在开发中遇到过一个问题, 不知道是不是bug, 就是启动程序后立即使用Touch ID, 这样会导致身份
验证通过了, 但是上述的alert并不会被dismiss. 详情参见
https://github.com/RungeZhai/TouchIDIssue
========