之前博客写过直接解析ipa包获取mobileprovision文件来监控APP是否过期来,但APP的推送证书还没有做,

大家都知道,iOS的推送证书不会放到ipa包里,只能通过直接解析p12或cer、crt格式。

解析p12格式的话,需要证书导出的密码,p12证书好处是可以授权到多台电脑。解析cer则不需要密码。

1.可以写个函数同时解析p12和cer文件:

# -*- coding = utf-8 -*-
# ------------------------------
# @time: 2021/3/29 5:18 PM
# @Author: drew_gg
# @File: certificate_parsing.py
# @Software: cover_ios_api
# ------------------------------ import os
from OpenSSL import crypto
import datetime
import time
from dateutil import parser
from pkg_common.ipa_monitor import calculation_month as cm def deal_utc(utc_time):
"""
UTC时间转换
:param utc_time:
:return:
"""
# UTC时间格式
utc_format = "%Y-%m-%dT%H:%M:%SZ"
sta_time = datetime.datetime.strptime(utc_time, utc_format) + datetime.timedelta(hours=8)
time_array = time.strptime(str(sta_time), "%Y-%m-%d %H:%M:%S")
time_stamp = int(time.mktime(time_array))
return sta_time, time_stamp def parsing_p12(file, f_type, password=''):
"""
解析p12、cer证书
:param file:
:param f_type:
:param password:
:return:
"""
cer = ''
if f_type == 'p12':
p12 = crypto.load_pkcs12(open(file, 'rb').read(), password)
cer = p12.get_certificate()
if f_type == 'cer':
crt_f = file.split('.cer')[0] + '.crt'
# cer转换crt格式
crt_cmd = "OpenSSL x509 -inform DER -in %s -out %s" % (file, crt_f)
os.system(crt_cmd)
with open(crt_f, "r", encoding='ISO-8859-1') as fp:
crt_data = fp.read()
cer = crypto.load_certificate(crypto.FILETYPE_PEM, crt_data)
del_cmd = "rm -rf %s" % crt_f
os.system(del_cmd)
cer_dic = {} # 解析时间
z_be_time = parser.parse(cer.get_notBefore().decode("UTF-8")).strftime('%Y-%m-%d %H:%M:%S')
# 生成UTC时间格式并转换成北京时间
before_time = deal_utc(z_be_time.split(' ')[0] + 'T' + z_be_time.split(' ')[1] + 'Z')[0]
# 解析时间
z_af_time = parser.parse(cer.get_notAfter().decode("UTF-8")).strftime('%Y-%m-%d %H:%M:%S')
after_time = deal_utc(z_af_time.split(' ')[0] + 'T' + z_af_time.split(' ')[1] + 'Z')[0]
# 获取时间月数差
remaining_time = cm.cal_months(datetime.date.today(), after_time) cer_dic['before_time'] = before_time
cer_dic['after_time'] = after_time
cer_dic['remaining_time'] = remaining_time subject = cer.get_subject()
s_components = subject.get_components()
# 解析证书相关名称
for (key, value) in s_components:
if str(key, encoding='utf-8') == 'CN':
cer_dic['user_id'] = str(value, encoding='utf-8')
if str(key, encoding='utf-8') == 'OU':
cer_dic['group'] = str(value, encoding='utf-8')
if str(key, encoding='utf-8') == 'O':
cer_dic['company'] = str(value, encoding='utf-8')
if 'company' not in cer_dic.keys():
cer_dic['company'] = ''
if 'user_id' not in cer_dic.keys():
cer_dic['user_id'] = ''
if 'group' not in cer_dic.keys():
cer_dic['group'] = ''
return cer_dic if __name__ == '__main__': f_p121 = "/Users/Work/package/notice_montor/xxx推送证书.p12"
f_p122 = "/Users/Work/package/notice_montor/xx推送证书.p12"
f_cer = "/Users/Work/package/notice_montor/xxx证书.cer"
pa = '123456'
a = parsing_p12(f_p122, 'p12', "123456")
print(a)

需要注意的地方:

1>.证书解析出的时间是utc格式,需要转换成北京时间,和直接解析ipa获取到的格式不一样,格式里不带“T”,需要自己构建格式后再转换。

2>.cer格式不能直接解析,直接解析会报格式错误,需要先通过命令:"OpenSSL x509 -inform DER -in %s -out %s" % (file, crt_f)转换成crt文件,解析完crt文件后再删除即可

3>.可能有的证书没有‘O’项,需要自己处理。

2.监控时候可以把p12和cer都放一个目录下,写个方法遍历即可:

# -*- coding = utf-8 -*-
# ------------------------------
# @time: 2021/3/29 5:18 PM
# @Author: drew_gg
# @File: notice_monitor.py
# @Software: cover_ios_api
# ------------------------------ import datetime
from pkg_dao import read_sql as rs
from pkg_dao import flask_mysql as fm
from pkg_common.handle_file import find_file as find
from pkg_common.ipa_monitor import common_mail as mail
from pkg_common.ipa_monitor import certificate_parsing as cp
from pkg_common.ipa_monitor import notice_monitor_html as html def get_certificate_detail(to_find_path, password):
"""
获取ipa的证书时间与描述文件时间
:return:
"""
company_name = ''
to_file = ["'*.p12'", "'*.cer'"]
f, f_l = find.find_file_more(to_file, to_find_path)
all_dic = []
cer_pa = {}
for p in f_l:
if p.split('.')[1] == 'p12':
company_name = p.split('/')[-1].split('.p12')[0]
cer_pa = cp.parsing_p12(p, 'p12', password)
if p.split('.')[1] == 'cer':
company_name = p.split('/')[-1].split('.cer')[0]
cer_pa = cp.parsing_p12(p, 'cer')
cer_pa['company_name'] = company_name
all_dic.append(cer_pa)
return all_dic if __name__ == '__main__': # 需要遍历ipa文件等目录
find_path = '/Users/Work/package/notice_montor'
pw = 'xxxxx'
cer_all = get_certificate_detail(find_path, pw)
# 升序排个序列
cer_all = sorted(cer_all, key=lambda k: k['remaining_time'])
for i in cer_all:
sql_result = rs.deal_mysql("get_certificate_id.sql", list([i['user_id']]))
update_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if sql_result:
up_sal = """
UPDATE certificate_parsing
SET `name` = '%s',
company = '%s',
`group` = '%s',
remaining_time = '%s',
before_time = '%s',
after_time = '%s',
upload_time = '%s'
WHERE
is_delete = 0
AND user_id = '%s'
LIMIT 1;
""" % (i['company_name'], i['company'], i['group'], i['remaining_time'], i['before_time'], i['after_time'],
update_time, i['user_id'])
d = fm.Database()
d.exec_no_query(up_sal)
else:
in_sql = """
INSERT INTO `certificate_parsing` (
`name`,
`company`,
`group`,
`user_id`,
`remaining_time`,
`before_time`,
`after_time`,
`upload_time`
)
VALUES
(
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
);
""" % (i['company_name'], i['company'], i['group'], i['user_id'], i['remaining_time'], i['before_time'],
i['after_time'], update_time)
d = fm.Database()
d.exec_no_query(in_sql) subject, html = html.deal_html(cer_all)
try:
if mail.cs_mail_send(subject, html, 'iOS'):
print('Send success')
else:
print('Send failure')
except Exception as ex:
print(ex)

find_file_more方法和简单:

def find_file_more(file_l, path):
"""
:param file_l:
:param path:
:return:
"""
f = []
f_a = []
find_cmd = ''
for index, f_t in enumerate(file_l):
if index == 0:
find_cmd = 'find . -iname %s' % f_t
else:
find_cmd += " -o -iname %s" % f_t file_list = cmd.run_cmd(find_cmd, path).read().split('./')
for i in range(len(file_list)):
if i != 0:
file_all = path + '/' + file_list[i].strip()
f_a.append(file_all)
file = file_list[i].split('/')[-1].split('.')[0].strip()
f.append(file)
return f, f_a

拼接find . -iname ** -o -iname ** -o -iname ** 命令。

然后把获取到的证书信息写入数据库和生成邮件告警出来就行,也可以定时每周五执行一次就好。

计算月数的话,之前给的那个比较复杂,不容易懂,新写个方法,比较简单粗暴:

# -*- coding = utf-8 -*-
# ------------------------------
# @time: 2021/2/1 4:13 PM
# @Author: drew_gg
# @File: calculation_month.py
# @Software: Build_Packaging
# ------------------------------ # coding = utf-8
# 计算日期的月份差 import datetime def cal_months(start_date, end_date):
"""
计算两个日期的月份差,精确到小数位
:param start_date: 日期必须为date格式
:param end_date: 日期必须为date格式
:return:
""" # 计算两个日期相隔月差
ey = end_date.year
em = end_date.month
ed = end_date.day
sy = start_date.year
sm = start_date.month
sd = start_date.day if ey < sy:
raise AssertionError('被减日期大了!')
elif ey == sy and em < sm:
raise AssertionError('被减日期大了!')
elif ey == sy and em == sm and ed < sd:
raise AssertionError('被减日期大了!')
else:
aed = round((ey - sy) * 12 + (em - sm) + (ed - sd)/30.5, 2)
return aed if __name__ == '__main__':
sd = datetime.date(2021, 3, 29)
ed = datetime.date(2022, 1, 22)
a = cal_months(sd, ed)

年月平均天数30.5天,按照这个来算月数,是不是简单粗暴,反正相差不大,就这样了。

iOS的cer、p12格式证书解析监控的更多相关文章

  1. 读取P12格式证书的密钥

    不想存储p12证书内容,只想存储证书密钥,可通过以下实现读取证书的密钥出来: package com.zat.ucop.service.util; import org.apache.commons. ...

  2. windows创建p12格式的ios开发证书的流程

    现在做ios开发,原生的开发已经不是第一选择,现在有很多不同的H5开发框架,在性能上都不输原生开发,而UI方便却能做得比原生更炫,比如CSS得灵活度肯定是比原生开发出来得应用更灵活的. 我们在开发IO ...

  3. OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程(转)

    OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程   此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘!     1.创建根证私钥命令:openssl g ...

  4. OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程 -参考自http://lavasoft.blog.51cto.com/62575/1104993/

    OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程   此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘!     1.创建根证私钥命令:openssl g ...

  5. OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程

    OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程   此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘!     1.创建根证私钥命令:openssl g ...

  6. iOS C#远程推送证书.p12文件制作

    1.PushChat.certSigningRequest      请求证书文件 生成Certificate Signing Request (CSR): 2.填写你的邮箱和Common Name, ...

  7. iOS开发之JSON格式数据的生成与解析

    本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? ...

  8. 使用OpenSSL(Windows x64版)将pem格式证书转换为p12格式

    今天同事遇到一个问题,他获得的证书只有pem格式,而服务器要求提交p12格式,一时搞不定,来找我帮忙. 我之前也从未接触过证书类型的转换,所以上网大致搜索了一下,又亲自动手试了试,现将有关心得经验记录 ...

  9. 转载 -- iOS开发之JSON格式数据的生成与解析

    本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? ...

  10. iOS开发-- 开发环境,证书和授权文件

    一.成员介绍 1.    Certification(证书)证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种:1)    Developer Certification(开发证书)安装在电脑 ...

随机推荐

  1. .NET 5 以后的 HttpClient 超时问题

    背景 起因是朋友在使用深信服的 Easy Connect 连接到内网之后,使用 HttpClient 访问对应内网的 API 站点均返回 System.Net.Sockets.SocketExcept ...

  2. 机器学习从入门到放弃:卷积神经网络CNN(二)

    一.前言 通过上一篇文章,我们大概了解了卷积是什么,并且分析了为什么卷积能在图像识别上起到巨大的作用.接下来,废话不多话,我们自己尝试动手搭建一个简易的CNN网络. 二.准备工作 在开始的时候,我们首 ...

  3. Openssl命令详解 - 证书篇

    生成自签证书 # 设置CA证书subject CA_SUBJ="/C=CN/ST=ShanDong/L=JiNan/O=sec/OU=sec/CN=www.hxy.com/emailAddr ...

  4. 海词 dict.cn 有 词义饼状分布图 和 词性饼状分布图 - 词典推荐

    海词 dict.cn 有 词义饼状分布图 和 词性饼状分布图 http://dict.cn/like

  5. Kotlin/Java 读取Jar文件里的指定文件

    原文地址:Kotlin/Java 读取Jar文件里的指定文件 | Stars-One的杂货小窝 jar包本质上也是压缩文件,下面给出如何读取jar包里某个文件的源码: val jarFile = Ja ...

  6. 《世嘉新人培训教材—游戏开发》2DGraphics1项目cmake构建

    <世嘉新人培训教材-游戏开发>作为经典的游戏开发教程,提供了相关样例代码供我们进行开发使用.但是该样例是基于VS进行编写构建的,而本人日常喜欢CLion进行C/C++开发,于是准备使用cm ...

  7. Kotlin 协程基础使用学习

    原文: Kotlin 协程基础使用学习-Stars-One的杂货小窝 本篇阅读可能需要以下知识,否则可能阅读会有些困难 客户端开发基础(Android开发或JavaFx开发) Java多线程基础 ko ...

  8. 三维模型3DTile格式轻量化的纹理压缩和质量关系分析

    三维模型3DTile格式轻量化的纹理压缩和质量关系分析 在三维模型的3DTile格式轻量化处理中,纹理压缩是一个重要环节.但是,纹理压缩和模型质量之间存在明显的关系需要权衡.以下是纹理压缩和模型质量关 ...

  9. uni-app 应对微信小程序最新隐私协议接口要求的处理方法

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一,问题起因 最新在开发小程序的时候,调用微信小程序来获取用户信息的时候经常报错一个问题 fail api scope is not de ...

  10. 记录--你真的能区分JavaScript的各种导入导出方式吗?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 我们在无论是在查阅别人的代码,还是在实际项目开发的过程中,肯定都会使用导入导出的功能,有时候我们会搞混这几种方式到底有什么区别,今天 ...