iOS证书自助管理实现思路
2016-03-13 00:43
441 查看
自从上周公司的苹果企业开发者资格($299)被苹果无情的封掉之后,产品组要求让客户提供企业开发者证书给公司的 企业移动信息化平台Link 打包,因此,在线编译平台的iOS证书自助管理功能便提上了议事日程。大体思路是:通过Java程序驱动Mac终端命令行实现P12证书, 描述文件的导入、删除以及合法性校验。
iOS自助管理的原型大概是这样(这里只讲iOS企业证书):
从上图可以看出,需要打包者提供用于发布程序的 p12证书、证书的password、以及对应的描述文件。如果不清楚这几个文件,请参考【iOS Provisioning Profile(Certificate)与Code Signing详解】 这篇文章介绍了iOS应用开发证书相关的内容。
导入的命令如下:
注:p12_filepath 是在Mac机器上的物理路径,单引号是不需要的,这里只是为了强调;p12_password是p12文件对应的导入密码,单引号同样也是不需要的;yulongsheng是我机器的名称,用回编译服务器的即可。
输入正确的命令导入后:
通过Java程序执行上面的命令,通过BufferedInputStream和BufferedReader可以获取到返回的字符串信息,根据关键字来判断证书是否导入成功(文章后面有Java调用示例)。
注意:如果Keychain是输入Lock状态的,证书是无法正常导入的,需要先解锁,手工解锁或者用下面的命令解锁。
解锁命令
注:mac_password是Mac机器的登录密码
因此需要对其进行解析,先将其转成plist文件(xml格式的文件),命令如下:
执行结果如下:
看看描述文件的真面目:
这些信息我们可以通过JAVA程序读取出来,当然读的过程会比较繁琐点,但至少是可行的。另外,可以通过security快速的获取UUID 和 过期时间,命令如下:
其它的信息,例如 AppId, TeamIdentifier, TeamName等无法快速拿到,只能通过java程序解析plist后才能得到。
该目录下的描述文件将会被xcode读取到。另外,注意观察 描述文件安装进来后是 以uuid.mobileprovision命名的,因此上一个技术点里面获取的uuid就可以派上用场了。
Java程序上实现,需要文件拷贝到这个目录,之后重命名该文件。
1. TeamName是否匹配的上;
2. 描述文件是否过期(只要它不过期,P12肯定没过期)
ChengDu QIDI Info Co., Ltd.
那么您需要在KeyChain里面去找到是否安装了带有这个关键字的证书,用下面的命令可以查看到安装在KeyChain里面的合法的证书:
因此,如果TeamName在输出的合法的证书里面找到了,那么就认为描述文件和P12是对应上了。
以上就是iOS证书自助管理需要攻破到技术点!如有不对的地方,欢迎探讨!
iOS自助管理的原型大概是这样(这里只讲iOS企业证书):
从上图可以看出,需要打包者提供用于发布程序的 p12证书、证书的password、以及对应的描述文件。如果不清楚这几个文件,请参考【iOS Provisioning Profile(Certificate)与Code Signing详解】 这篇文章介绍了iOS应用开发证书相关的内容。
技术点一, 利用security命令安装p12证书
根据原型,我们选择p12文件后,需要将p12文件导入到Mac 机器,检验证书的时候需要先将p12安装到Mac的Keychain里面。导入的命令如下:
security import `p12_filepath` -k /Users/yulongsheng/Library/Keychains/login.keychain -P `p12_password` -T /usr/bin/codesign
注:p12_filepath 是在Mac机器上的物理路径,单引号是不需要的,这里只是为了强调;p12_password是p12文件对应的导入密码,单引号同样也是不需要的;yulongsheng是我机器的名称,用回编译服务器的即可。
输入正确的命令导入后:
通过Java程序执行上面的命令,通过BufferedInputStream和BufferedReader可以获取到返回的字符串信息,根据关键字来判断证书是否导入成功(文章后面有Java调用示例)。
注意:如果Keychain是输入Lock状态的,证书是无法正常导入的,需要先解锁,手工解锁或者用下面的命令解锁。
解锁命令
security unlock-keychain -p `mac_password` /Users/yulongsheng/Library/Keychains/login.keychain
注:mac_password是Mac机器的登录密码
技术点二, 解析描述文件mobileprovision获取AppId, 证书信息,过期时间等
mobileprovision描述文件里面包含了 AppId,证书信息、设备信息等,要得到这些信息得费些功夫。mobileprovision文件直接用文本工具打开是无法看到里面的内容的,因为它是经过特殊编码的。 看看它的伪装:因此需要对其进行解析,先将其转成plist文件(xml格式的文件),命令如下:
security cms -D -i provisionfile > plistfile
执行结果如下:
看看描述文件的真面目:
这些信息我们可以通过JAVA程序读取出来,当然读的过程会比较繁琐点,但至少是可行的。另外,可以通过security快速的获取UUID 和 过期时间,命令如下:
#获取uuid,下个章节有用 /usr/libexec/PlistBuddy -c 'Print UUID' /Users/yulongsheng/Desktop/Time/chendu.plist #获取描述文件过期时间,打印出来的格式需要转换下才行 /usr/libexec/PlistBuddy -c 'Print ExpirationDate' /Users/yulongsheng/Desktop/Time/chendu.plist
其它的信息,例如 AppId, TeamIdentifier, TeamName等无法快速拿到,只能通过java程序解析plist后才能得到。
技术点三, 安装描述文件
手工安装的情况下,只需要双击安装即可,观察其安装的路径不难发现,实际上,它是被安装到了 ~/Library/MobileDevice/Provisioning Profiles/ 目录下:该目录下的描述文件将会被xcode读取到。另外,注意观察 描述文件安装进来后是 以uuid.mobileprovision命名的,因此上一个技术点里面获取的uuid就可以派上用场了。
Java程序上实现,需要文件拷贝到这个目录,之后重命名该文件。
技术点四, 校验p12文件和描述文件是否一致
校验点:1. TeamName是否匹配的上;
2. 描述文件是否过期(只要它不过期,P12肯定没过期)
TeamName是否和P12对应
假设您已经从plist里面获取到了TeamName,例如:ChengDu QIDI Info Co., Ltd.
那么您需要在KeyChain里面去找到是否安装了带有这个关键字的证书,用下面的命令可以查看到安装在KeyChain里面的合法的证书:
security find-identity -v codesigning /Users/yulongsheng/Library/Keychains/login.keychain
因此,如果TeamName在输出的合法的证书里面找到了,那么就认为描述文件和P12是对应上了。
校验描述文件过期时间
从上面可以获取到ExpirationDate,与当前时间进行匹配,当然,最好多考虑几天或者1周时间,在界面上提醒用户 还剩下多长时间。技术点五, Java执行Mac下shell命令
前面几个技术点谈到了用shell命令来实现各种操作,但在GUI层面,我们只能选择用Java程序来驱动这些命令。简单调用示例如下:package com.bingo.main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class main { /** * @param args */ public static void main(String[] args) { Process process = null; List<String> processList = new ArrayList<String>(); try { String cmd="security find-identity -v codesigning /Users/yulongsheng/Library/Keychains/login.keychain"; //执行终端命令 process = Runtime.getRuntime().exec(cmd); BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = ""; while ((line = input.readLine()) != null) { processList.add(line); } input.close(); } catch (IOException e) { e.printStackTrace(); } //输出返回结果 for (String line : processList) { System.out.println(line); } } }
以上就是iOS证书自助管理需要攻破到技术点!如有不对的地方,欢迎探讨!
相关文章推荐
- AudioManger和AudioSystem的关系
- AudioService 和AudioManager 以及使用举例.
- CoreImage 之 CIDetector iOS 人脸识别
- iOS音频播放器锁屏歌词显示与性能优化
- 多线程
- XZ_iOS之实现离线缓存
- iOS多线程的初步研究(三)-- NSRunLoop
- iOS的三种多线程技术
- iOS开发中常用的几种设计模式
- 第一个iOS程序简单计算器设计-用到View,get点语法
- iOS 多线程 NSthread的简单使用——iOS 编码复习(六)(多线程4)
- IOS调试—断点调试
- iOS开发两个距离较近的按钮同时触发事件的解决方法
- iOS之04-方法的声明和实现
- ios 图片的两种加载方式
- iOS之03-类的合理设计
- ios数据存储(一)
- ios开发中的基本设计模式(代理,观察者,MVC,单例,策略,工厂,MVVM,原型,Target-Action,通知(notification)机制)
- iOS之02-第一个OC的类
- iOS开发--打印NSRange,CGRect,CGPoint等结构体