如何从苹果全球开发者证书和 .p12 文件中提取公钥和私钥?

Posted

技术标签:

【中文标题】如何从苹果全球开发者证书和 .p12 文件中提取公钥和私钥?【英文标题】:How would I extract the public and private keys from the apple world wide developer certificate and .p12 file? 【发布时间】:2016-03-10 20:38:07 【问题描述】:

所以我正在尝试为存折或他们现在所说的“钱包”编写功能。我编写了所有必要的代码来编写 JSON,将文件写入临时目录,然后计算校验和并放回清单中。现在我被困在使用 pass.P12 文件的 .p12 签署 Apple World Wide Developer Certificate 以获得所需的 .der 文件的部分?

<cfset signer = new rsa_signer(fileRead(expandPath("test_code/public_key.txt")),fileRead(expandPath("test_code/private_key.pem")),"SHA512withRSA")>


<cffile action="READ" file="#xtemp_folder#\manifest.json" variable="xtext">
<cfset xsignature = signer.sign(xtext)>
<!---- write to file ----->
<cffile action="WRITE" file="#xtemp_folder#\signature.der" output="#xsignature#">

<!---- create zipped file for user downloading ----->
<cf_write_log log_key="#attributes.log_key#" data="<hr>create zip files from temp holding folder..">
<cfset xzip_filename = "h:\eshowtemp\#xtemp_folder_string#.pkpass">
<cfdirectory action="LIST" directory="#xtemp_folder#" name="files">
<cf_write_log log_key="#attributes.log_key#" data="files=#files.recordcount#">
<cfzip file="#xzip_filename#" source="#xtemp_folder#">

上面的代码是我的冷聚变程序的一个 sn-p,它理想地签名并打印出所需的 .pkpass 文件。我已确认此程序可与其他提供的公钥和私钥一起使用。在我阅读签名者的地方,我尝试将全球开发人员证书导出到 .pem 文件中。然后我对 .p12 做了同样的事情,将它导出到一个 pem 文件中,并将两个 pem 文件都插入到 rsa_signer 中,但没有运气。所以我被困在哪里去。

这是我注意到的。在有效的公钥和私钥上,它们看起来像这样:

-----开始私钥-----

加密.....

-----结束私钥-----

-----开始公钥-----

加密... -----结束公钥-----

与我的 2 个 .pem 文件(Apple 全球开发者证书 + pass.p12 文件)相比

///Apple dev cert.pem

-----开始证书-----

///加密

-----结束证书-----

//pass.pem(从.p12转换而来)

包属性 友好名称:通行证类型 ID:XXX 本地密钥ID:XXX subject=/UID=XXX/CN=通行证类型ID:XXX/OU=XXX/O=XXXC=US issuer=/C=US/O=Apple Inc./OU=Apple Worldwide Developer Relations/CN=Apple Worldwide Developer Relations 认证机构 -----开始证书-----

XXX -----结束证书-----

这可能是我的coldfusion程序不喜欢我的pem文件的原因吗? .pem 文件说“开始证书”,而其他 pem 说“开始公钥/私钥”。

任何帮助将不胜感激。谢谢!

https://rietta.com/blog/2012/01/27/openssl-generating-rsa-key-from-command/

【问题讨论】:

你似乎很困惑。你永远不会看到苹果全球开发者证书的私钥; Apple 将此密钥保密。您拥有的证书具有公钥,可用于验证某些内容是否由私钥的拥有者(即 Apple)签署。您需要使用从 Apple 开发者网站获得的 your 通行证签名证书来签署通行证。由于您为此证书生成 CSR,因此您拥有私钥。 从 Apple 取回签名证书后,您可以将其加载到 KeyChain 实用程序中,然后将其与包含的私钥一起导出 【参考方案1】:

创建签名文件的步骤是(获取 manifest.json 后) 1.加载p12文件内容(通过type id认证)-> $cert_info 2.使用密码解码$cert_info openssl_pkcs12_read($cert_store, $cert_info, $password) -> $cert_info 将保留所有解码信息 3. 使用 从 $cert_info 获取私钥 $pkey = openssl_pkey_get_private($cert_info['pkey'], ""); 并将 $pkey 保存到 pem 临时文件中 3.1 使用 $cert = openssl_x509_read($cert_info['cert']); 保存证书信息 4.使用manifest.json, cert info ($cert), Apple World Wide Developer Certificate 制作pkcs7文件(temp_signature) 使用 openssl_pkcs7_sign("./pass_file/manifest.json", "./pass_file/temp_signature", $cert, $pkey, array(), PKCS7_BINARY | PKCS7_DETACHED, "./AppleWWDRCA.pem") 5. 加载 temp_signature 文件内容并在 filename="smime.p7s" 之后和 ------ (substr) 之前提取数据并使用 base64_decode 进行编码并保存到'signature'文件中

【讨论】:

@user3766198 嗨,我卡住了,如果它对你有用,你能帮我吗。我无法阅读证书。p12 你能分享你的解决方案吗?这将是很大的帮助

以上是关于如何从苹果全球开发者证书和 .p12 文件中提取公钥和私钥?的主要内容,如果未能解决你的问题,请参考以下文章

如何从证书文件本身(.p12)确定 SSL 证书到期日期

使用openssl命令从.p12文件中提取证书和私钥。

ios开发--一个苹果证书怎么多次使用——导出p12文件

一个苹果证书怎么多次使用——导出p12文件

iOS证书(.p12)和描述文件(.mobileprovision)申请

P12, cer, provisioning profile