zoukankan      html  css  js  c++  java
  • mac通过命令行获取证书和配置文件过期时间

     
    背景: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 1 
     
    指定导出某个名字的证书:
    security export -f pkcs12 -k  /Users/a58/Library/Keychains/login.keychain -o /opt/temp.p12 -P 1 -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
     
    说明:
    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
     
  • 相关阅读:
    241. Different Ways to Add Parentheses java solutions
    89. Gray Code java solutions
    367. Valid Perfect Square java solutions
    46. Permutations java solutions
    116. Populating Next Right Pointers in Each Node java solutions
    153. Find Minimum in Rotated Sorted Array java solutions
    判断两颗树是否相同
    求二叉树叶子节点的个数
    求二叉树第k层的结点个数
    将二叉排序树转换成排序的双向链表
  • 原文地址:https://www.cnblogs.com/meitian/p/7764420.html
Copyright © 2011-2022 走看看