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
     
  • 相关阅读:
    (14)python函数与变量
    ①③python中的字符串与字符编码
    ①②python文件操作及文件增删改查
    rsa公钥私钥
    MySQL创建数据库和表
    Rsync + Innotify 部署实例
    LNMPT部署示例
    Nginx 调优
    Nginx 二进制方式安装
    wget & curl 命令
  • 原文地址:https://www.cnblogs.com/meitian/p/7764420.html
Copyright © 2011-2022 走看看