您的位置:首页 > 移动开发 > IOS开发

iOS证书自助管理实现思路

2016-03-13 00:43 441 查看
自从上周公司的苹果企业开发者资格($299)被苹果无情的封掉之后,产品组要求让客户提供企业开发者证书给公司的 企业移动信息化平台Link 打包,因此,在线编译平台的iOS证书自助管理功能便提上了议事日程。大体思路是:通过Java程序驱动Mac终端命令行实现P12证书, 描述文件的导入、删除以及合法性校验。

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证书自助管理需要攻破到技术点!如有不对的地方,欢迎探讨!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: