背景:ios打包证书的profile配置文件过期了,导致以前已经打完的测试包不能安装。所以需要加上检测机制,在打包时提示证书是否将要过期,如果要过期了给出提示
 
方案:
1.查找profile配置文件,查看过期时间,查看是否要过期了
2.查看证书的过期时间,查看是否将要过去了
 
一、查看profile的过期时间
 
1.查找Xcode配置的配置文件目录Provisioning Profiles下的配置文件
cd /Users/a58/Library/MobileDevice/Provisioning Profiles
 
获得某个配置文件的具体信息:security cms -D -i xxxx.mobileprovision
 
因为配置文件可能很多,所以需要找到自己要的那个配置,这里通过比对TeamName来匹配配置文件
cd /Users/a58/Library/MobileDevice/Provisioning Profiles
for file in $(ls *)
do
if [[ $(/usr/libexec/PlistBuddy -c "Print TeamName" /dev/stdin <<< $(/usr/bin/security cms -D -i ${file})) == "${TeamName}" ]]
then
#echo "I get you!"
profile=${file}
#break
#else
# echo "it's not you "
fi
done
 
cd的目录为xcode配置的profile配置文件目录
TeamName为要查找的证书名
 
 
2.查找匹配的证书的profile文件过期时间
以下列出了查看profile文件的三种方式,推荐第一种,其他两种不推荐
 
a.通过mac自带的PlistBuddy解析plist格式文件,通过security获得profile信息,然后取得key的值(推荐这种方法)
过期时间的key为ExpirationDate
 
ExpirationDate=`/usr/libexec/PlistBuddy -c "Print ExpirationDate" /dev/stdin <<< $(/usr/bin/security cms -D -i xxxx.mobileprovision)`
 
输出结果为:Sat Sep 29 11:33:00 CST 2018
 
---如果要查找的key为字典下的值,使用[字典所在的key:字典中要查找的key]
例如:要查找下面内容中com.apple.developer.team-identifier的值
<key>Entitlements</key>
<dict>
<key>keychain-access-groups</key>
<array>
<string>xxxx.*</string>
</array>
<key>get-task-allow</key>
<false/>
<key>application-identifier</key>
<string>7xxx.push</string>
<key>com.apple.developer.team-identifier</key>
<string>xxxx</string>
<key>aps-environment</key>
<string>production</string>
</dict>
 
查找方法如下:注意冒号左右不要有空格
/usr/libexec/PlistBuddy -c "Print Entitlements:com.apple.developer.team-identifier" /dev/stdin <<< $(/usr/bin/security cms -D -i ${file})
 
---如果要查找的key为Array数组下的值,通过索引获得值[数组所在key:第几个值]
例如:要获得数组下第二个值
<key>ProvisionedDevices</key>
<array>
<string>xxx</string>
<string>xxx</string>
</array>
 
查找方法如下:
/usr/libexec/PlistBuddy -c 'Print ProvisionedDevices:2' /dev/stdin <<< `/usr/bin/security cms -D -i ${file}`
b.使用mobileprovision-read,可以直接通过-o输出key对应的值
首先安装mobileprovision-read
curl https://raw.githubusercontent.com/0xc010d/mobileprovision-read/master/main.m | clang -framework Foundation -framework Security -o /usr/local/bin/mobileprovision-read -x objective-c -
 
查找命令:
mobileprovision-read -f xxxx.mobileprovision -o ExpirationDate
c.通过security去获得文件信息,然后自己grep,不推荐
usr/bin/security cms -D -i xxxx.mobileprovision
 
 
备注:开发说通过查找UUID值更准确,生成证书和配置文件是一套的,但是因为我在证书里没有拿到这个值,所以就匹配了比较明显的TeamName
 
<key>UUID</key>
<string>xxx</string>
 
二、查找证书的过期时间
 
方案:查看证书需要先导出pem格式的文件,然后通过openssl工具查看证书具体信息
 
查看钥匙链下的所有证书:security find-identity -p codesigning /Users/a58/Library/Keychains/login.keychain
注意:第一次查看导出的时候会弹框提示是否允许,所以第一次都需要手动操作
 
1.导出证书为pem文件
 
导出证书为pem文件有两种方法,推荐第一种,第二种导出的过期时间取得好像有问题,一直是最后一个证书的过期时间
 
导出证书为pem文件方法1:
 
直接查找证书导并出为pem文件:

security find-certificate -a -c "iPhone xxxx" -p > certs.pem
 
说明:
1.-a -c 后面的参数为要查找的证书的名字
2.-p >后面的为输出的文件名字,以.pem结尾
 
导出证书为pem文件方法2:
 
第一步:导出证书文件位.p12文件,并且指定密码
导出所有证书:
security export -f pkcs12 -k  /Users/a58/Library/Keychains/login.keychain -o /opt/temp.p12 -P  
指定导出某个名字的证书:
security export -f pkcs12 -k  /Users/a58/Library/Keychains/login.keychain -o /opt/temp.p12 -P  -t identities "iPhone xxx"
 
说明:
1.-t identities为自定义搜索名字,会导出包含后面字符串的证书
2.-k后面为钥匙串文件
3.-o后面为输出的.p12文件的位置及名字
4.-P为导出.p12文件时指定的密码,必须指定否则需要手动输入,这里值设置为1
 
第二步:将p12转换成pem文件
openssl pkcs12 -clcerts -nokeys -in temp.p12 -out cert.pem  -passin pass:
 
说明:
1.-in后面为要转换的.p12文件
2.-out后面为要输出的pem的文件名字,以.pem结尾
3.-nokeys表示不对pem文件设置密码
4.-passin pass:xxx:输入.p12文件的密码(上一步设置的密码1)
 
2:查看pem证书的具体信息
openssl x509 -in cert.pem -noout -text
查看证书的过期时间:openssl x509 -in cert.pem -noout -dates
 
说明:
1.-in为要查看的pem证书文件名
 
三、比较当前时间和证书时间来判断是否过期
 
这里主要用了date命令,将证书的时间转换成秒,然后当前时间转换成秒后进行减法,可以计算出还有多少天过期
 
1.查看当天日期
date +%s
 
2.将证书的时间转换成秒
date -j -f "%a %b %d %T %Z %Y" "Sat Sep 29 11:33:00 CST 2018"  "+%s”
说明:-f后为转换之前时间的格式.
%a:星期
%b:月
%d:日
%T:时:分:秒
%Z:时区
%Y:年
 
3.计算差值是多少秒,然后换算成天
还差多少天过期=日期差/24/60/60
 
参考证书是否过期比较详细的文档:http://www.genshuixue.com/i-cxy/p/15232025
PlistBuddy的简单使用参考文档(读取plist文件的mac自带工具:PlistBuddy,增删改查合并):http://www.jianshu.com/p/2167f755c47e
参考查看pem证书详细内容的文档:http://colinzhouyj.blog.51cto.com/2265679/1566250
 

mac通过命令行获取证书和配置文件过期时间的更多相关文章

  1. 用OpenSSL命令行生成证书文件

    用OpenSSL命令行生成证书文件 1.首先要生成服务器端的私钥(key文件): openssl genrsa -des3 -out server.key 1024 运行时会提示输入密码,此密码用于加 ...

  2. Shell 命令行获取本机IP,grep的练习

    Shell 命令行获取本机IP,grep的练习 在 mac 下面输入 ifconfig 或者在 linux 下面输入 ip a 就可以得到我们的网卡信息.不过通常情况下,我们需要查看的是我们的IP地址 ...

  3. Mac 在命令行中获得Root权限

    Mac 在命令行中获得Root权限 作者 firedragonpzy 13 九月, 2012 2条评论 本文为firedragonpzy原创,转载务必在明显处注明:转载自[Softeware MyZo ...

  4. linux/mac下命令行rm回收站--rmtrash

    Linux.mac的命令行下没有回收站功能,很多时候手一抖就把重要文件给 rm -fr * 了,虽然linux下有可能通过lost +found/debugfs找回,但难度也比较大,不能保证一定能够找 ...

  5. 在mac上命令行里面如何打开文本编辑器?

    在mac上命令行里面如何打开文本编辑器?   在linux命令行terminal上使用gedit直接就可以打开文本文件 那么在mac上面如何操作呢? 使用:open -a TextEdit setti ...

  6. 命令行获取docker远程仓库镜像列表

    命令行获取docker远程仓库镜像列表 获取思路 通过curl获取镜像tag的json串,解析后得到${image}:${tag}的格式 curl获取示例 # curl [:-s] ${API}/${ ...

  7. python命令行获取参数

    python命令行获取参数 import sys # python获取参数 input_file = sys.argv[1] output_file = sys.argv[2] print(input ...

  8. Mac下用命令行获取苹果手机的UDID

    在终端输入命令行:system_profiler SPUSBDataType | grep "Serial Number:.*" | sed s#".*Serial Nu ...

  9. Mac终端命令行提示符格式更改方法

    内容提要: 主要是通过~/.bash_profile文件更改环境变量PS1,修改命令行提示符的显示格式,并展示不同颜色. 本文介绍了默认设置的缺陷,以及需要用到的基础知识,最后介绍了更改命令行提示符格 ...

随机推荐

  1. myeclipse内存调整

    内存调整: myeclipse.ini里配置后 1.设置Default VM Arguments 在myEclipse中,打开Windows-> Preferences->Java-> ...

  2. Hive Ntile分析函数学习

    NTILE(n) 用于将分组数据按照顺序切分成n片,返回当前记录所在的切片值 NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid O ...

  3. NodeJS + React + Webpack + Echarts

    最近画了个简单的前端图,使用百度的echarts,基于原来项目的NodeJS+React+Webpack框架.在此记录一下: 1.  在react里封装echarts组件,并调用后端API. (参考的 ...

  4. 1.类的加载机制_继承类的加载(一个小的Demo)说明

    今天我们先来一个小的Demo来了解类的加载顺序. public class ClassLoaderTest { public static void main(String[] args) { Sys ...

  5. MVC基于角色权限控制--管理角色

    管理角色分为 添加角色.删除角色.修改角色.给角色分配权限(修改角色权限) 新建RoleInfoController继承BaseController namespace CZBK.ItcastOA.W ...

  6. react-native 相对项目路径导入组件

    在使用react-native的时候,经常要自定义很多组件,但是只能使用../../../的方式,如果目录多了一长串,书写很烦,看着也不好看. 方法一: 例如你想引入utils里面的文件,不想../. ...

  7. Linux服务器mysql,nginx等自动停止的排查,以及解决方法

    最近发现自己使用的某台云服务武器只要稍微流量大一点,就会出现莫名的的数据库连接错误的情况 ,然后连上服务器查看,发现mysql进程被结束了,经常出现这种情况,这还怎么得了,然后第一时间查看mysql日 ...

  8. day33-常见内置模块二(hashlib、shutil、configparse)

    一.hashlib算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 1.什么是摘要算法呢? 摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一 ...

  9. NativeClient开发指南

    https://blog.csdn.net/column/details/24458.html

  10. YUV420格式解析<转>

    在YUV420中,一个像素点对应一个Y,一个2X2的小方块对应一个U和V.对于所有YUV420图像,它们的Y值排列是完全相同的,因为只有Y的图像就是灰度图像. YUV420sp与YUV420p的数据格 ...