苹果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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • SIGPIPE信号

    SIGPIPE信号当一个进程向某个已收到RST的套接字执行写操作时,内核向该进程发送一个SIGPIPE信号。该信号的默认行为是终止进程,因此进程必须捕获它以免不情愿地被终止。不论该进程是捕获了该信号并从其信号处理函数返回,还是简单地忽略该信号,写操作都将返回EPIPE错误。

  • intelj 2021 激活码(注册激活)[通俗易懂]

    (intelj 2021 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.htmlMLZPB5EL5Q-eyJsaWN…

  • 基于Mixin Network的C#语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币…

    基于Mixin Network的C#语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币…

  • JavaScript实现竖直文本滚动

    JavaScript实现竖直文本滚动

    2021年11月24日
  • apache配置基于域名访问

    apache配置基于域名访问编辑配置文件,注释掉directory文件,一共四个vim/etc/httpd/conf/httpd.conf然后保存退出检查一下httpd配置文件,ok正常创建虚拟主机,编辑文件路径/etc/httpd/conf.d/a123.confcd/etc/httpd/conf.dvia123.conf然后在a123.conf文件里加入这些东西可直接复制进去其中80是端口DocumentRoot/mnt/z里的/mnt/z是默认主页1.yao.com是域名(如何在主

  • CAS单点登录原理详解

    CAS单点登录原理详解1、基于Cookie的单点登录的回顾    基于Cookie的单点登录核心原理:   将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,如果没有权限则从Cookie中取出用户名密码进行登录,让用户从某种意义上觉得只登录了一次。   该方式缺点就是多次传送用户名密码,增加被盗风险,以及不能跨域。同时www.qiandu.co…

发表回复

您的电子邮箱地址不会被公开。

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