苹果p12证书转换[通俗易懂]

苹果p12证书转换[通俗易懂]先生成本地的keyopensslgenrsa-outaps_development.key2048#将key转换导出csr证书opensslreq-new-sha256-keyaps_development.key-outaps_development.csr拿着aps_development.csr在苹果开发者网站去得到cer然后解析ceropensslx509-informDER-outformPEM-inaps_development.

大家好,又见面了,我是你们的朋友全栈君。

先生成本地的key
openssl genrsa -out aps_development.key 2048

# 将key转换导出csr证书
openssl req -new -sha256 -key aps_development.key -out aps_development.csr
拿着 aps_development.csr 在 苹果开发者网站 去得到 cer 然后解析cer
openssl x509 -inform DER -outform PEM -in aps_development.cer -out aps_development.pem

# 导出p12证书
openssl pkcs12 -inkey aps_development.key -in aps_development.pem -export -out aps_development.p12

p12 反向解析

# supersign 是密码
openssl pkcs12 -in ios_distribution.p12 -out newfile.crt.pem -clcerts -nokeys -password pass:supersign
openssl pkcs12 -in  ios_distribution.p12 -out newfile.key.pem -nocerts -nodes -password pass:supersign
nginx的需要key证书需要包含,-----BEGIN RSA PRIVATE KEY-----
他们提供的只有-----BEGIN PRIVATE KEY-----的证书,需要使用工具转换下:
openssl rsa -in 2_abc.com.key -out 2_abc.com_pri.key

给描述文件签名

        cmd = "openssl smime -sign -in %s -out %s -signer %s " \
              "-inkey %s -certfile %s -outform der -nodetach " % (
                  mobilconfig_path, sign_mobilconfig_path, ssl_pem_path, ssl_key_path, ssl_pem_path)

Python实现p12导入导出

import base64,os
from OpenSSL.crypto import (load_pkcs12, dump_certificate_request, dump_privatekey, PKey, TYPE_RSA, X509Req,
                            dump_certificate, load_privatekey, load_certificate, PKCS12, FILETYPE_PEM, FILETYPE_ASN1)

class P12CertUtils(object):

    def __init__(self, my_local_key, app_dev_pem, app_dev_p12):
        self.my_local_key = my_local_key
        self.app_dev_pem = app_dev_pem
        self.app_dev_p12 = app_dev_p12

    @staticmethod
    def sign_mobileconfig(mobilconfig_path, sign_mobilconfig_path, ssl_pem_path, ssl_key_path):
        ''' :param mobilconfig_path: 描述文件绝对路径 :param sign_mobilconfig_path: 签名之后的文件绝对路径 :param ssl_pem_path: pem证书的绝对路径 :param ssl_key_path: key证书的绝对路径 :return: '''
        cmd = "openssl smime -sign -in %s -out %s -signer %s " \
              "-inkey %s -certfile %s -outform der -nodetach " % (
                  mobilconfig_path, sign_mobilconfig_path, ssl_pem_path, ssl_key_path, ssl_pem_path)
        return exec_shell(cmd)

    def make_p12_from_cert(self, password):
        result = { 
   }
        try:
            certificate = load_certificate(FILETYPE_PEM, open(self.app_dev_pem, 'rb').read())
            private_key = load_privatekey(FILETYPE_PEM, open(self.my_local_key, 'rb').read())
            p12 = PKCS12()
            p12.set_certificate(certificate)
            p12.set_privatekey(private_key)
            with open(self.app_dev_p12, 'wb+') as f:
                f.write(p12.export(password))
            if password:
                with open(self.app_dev_p12 + '.pwd', 'w') as f:
                    f.write(password)
            return True, p12.get_friendlyname()
        except Exception as e:
            result["err_info"] = e
            return False, result

    def write_cert(self):
        for file in [self.app_dev_p12, self.app_dev_p12 + '.pwd', self.my_local_key, self.app_dev_pem]:
            if os.path.exists(file):
                os.rename(file, file + '.' + get_format_time() + '.bak')
            os.rename(file + '.bak', file)

    def make_cert_from_p12(self, password, p12_content=None):
        result = { 
   }
        try:
            if p12_content:
                p12_content_list = p12_content.split('data:application/x-pkcs12;base64,')
                if len(p12_content_list) == 2:
                    with open(self.app_dev_p12 + '.bak', 'wb+') as f:
                        f.write(base64.b64decode(p12_content.split('data:application/x-pkcs12;base64,')[1]))
                    if password:
                        with open(self.app_dev_p12 + '.pwd.bak', 'w') as f:
                            f.write(password)
                else:
                    result["err_info"] = '非法p12证书文件,请检查'
                    return False, result
            else:
                result["err_info"] = '证书内容有误,请检查'
                return False, result
            p12 = load_pkcs12(open(self.app_dev_p12 + '.bak', 'rb').read(), password)
            cert = p12.get_certificate()
            if cert.has_expired():
                result["err_info"] = '证书已经过期'
                return False, result
            with open(self.my_local_key + '.bak', 'wb+') as f:
                f.write(dump_privatekey(FILETYPE_PEM, p12.get_privatekey()))
            with open(self.app_dev_pem + '.bak', 'wb+') as f:
                f.write(dump_certificate(FILETYPE_PEM, cert))
            return True, cert.get_version()
        except Exception as e:
            for file in [self.app_dev_p12, self.app_dev_p12 + '.pwd', self.my_local_key, self.app_dev_pem]:
                if os.path.exists(file + '.bak'):
                    os.remove(file + '.bak')
            result["err_info"] = e
            if 'mac verify failure' in str(e):
                result["err_info"] = 'p12 导入密码错误,请检查'
            return False, result
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148550.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 请不要拿ipad和手机、上网本相提并论「建议收藏」

    请不要拿ipad和手机、上网本相提并论「建议收藏」苹果公司最近推出了ipad,但网上的评论不是很好,我觉得,一个好的产品会改变人们对某些事物的认识,甚至是人们的生活习惯。网上有ipad的十大罪状,有些我不了解,但有我认为是无稽之谈。不支持多点触摸首先,多点触摸苹果公司在他们的产品中应用的比较多的,比如iphone和macair,当然这样的技术迁移到ipad上面肯定没有任何问题,但是,网上认为这样的技术在ipad的设计上被取消

    2022年9月23日
  • Python基本数据类型

    Python基本数据类型一、简介Python基本数据类型一般分为:数字、字符串、列表、元组、字典、集合这六种基本数据类型。其中数字又包含整型(整型又包括标准整型、长整型(Python2.7及之前版本有))、浮点型、复数类

    2022年7月5日
  • 抽象工厂模式与工厂方法模式有哪些不同_抽象工厂模式java代码

    抽象工厂模式与工厂方法模式有哪些不同_抽象工厂模式java代码Abstract Factory动机实例模式定义结构要点总结笔记动机在软件系统中,经常面临着”一系列相互依赖的对象“的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作如果应对这种变换?如何绕过常规的对象创建方法(new),提供一种”封装机制“来避免客户程序和这种”多系列具体对象创建工作“的紧耦合?实例数据库连接的时候会有很多关联的对象,这些对象是一个整体朴素class EmployeeDAO{public: vector<EmployeeDAO> GetEm

    2022年8月11日
  • linux搭建apache_plsql安装教程及配置

    linux搭建apache_plsql安装教程及配置在CentOS上安装ApacheApache在默认的CentOS存储库中可用,并且安装非常简单。为了安装ApacheWebServer,首先通过运行以下命令更新本地软件包在基于RHEL的发行版中,Apache软件包和服务称为httpd。要安装Apache,运行以下命令:[root@localhost]#sudoyumupdate更新完成后,就可以安装Apache了。[root@localhost]#yuminstallhttpd启动ApacheWeb服..

    2022年9月21日
  • 一个发邮件的Python脚本。

    一个发邮件的Python脚本。

    2022年3月13日
  • 一步一步画战车(雷电3接口)

    在用EXCEL做量化分析的时候,经常需要通过一些金融数据平台的API接口,获取各种数据。最常用的公共API接口有YahooFinance,GoogleFinance,新浪财经,搜狐财经等。这些都不需要注册,就可以直接使用。获取方式相对简单,但数据种类不够丰富,通常只包括交易数据和财务数据。另外一些免费的金融数据平台,如国外的Quandl和国内的Tushare也都提供了API接口,数据种类更…

    2022年4月10日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号