证书、配置文件、公钥/私钥揭秘

Posted

技术标签:

【中文标题】证书、配置文件、公钥/私钥揭秘【英文标题】:Certificates, Provisioning Profiles, public/private keys demystified 【发布时间】:2012-11-30 08:55:54 【问题描述】:

这个话题继续让我感到困惑。我想我会写出我目前的理解,并希望找出我对/错的事情。

当您创建开发证书时,有一个公钥和私钥的概念。可通过供应门户获得的证书持有一个公钥,而您的私钥存储在您的钥匙串中。为了对您的应用程序进行代码签名,您必须同时拥有两者。

为了运行应用,设备必须有一个配置文件,该配置文件本质上包含一个应用标识符、一组公认的证书(应用必须由其中一个证书签名)和一组设备标识符(指示允许哪些设备运行应用程序)。

“公认的证书”引用了公钥,而私钥本质上是由应用程序传递的。

因此,对于 App Store,我们可以将普通设备视为带有默认 prov 配置文件,该配置文件已经具有苹果的“公钥”,并且苹果在分发之前执行自己的代码签名操作,从而添加他们的私钥.

完美?关闭?走开?疯了吗?

【问题讨论】:

据我所知看起来很完美。 【参考方案1】:

对于它的价值,这是我的最新理解:

配置文件是一个文件,它告诉您哪些应用程序(通过 AppID)由哪个开发人员(通过证书)签名,可以在哪些设备(UDID)上运行。

对于证书,有一个公钥和私钥的概念。公钥和私钥在数学上是联系在一起的,这样一个人可以加密纯文本,一个人可以解密密文。证书允许苹果确保两件事:1,只有注册的开发人员才能分发他们的代码,2,正在分发的代码在发送到您的设备的过程中不会被更改。

当您在 Xcode 中构建代码时,您使用位于钥匙串中的私钥对您的应用程序进行“代码签名”,从而“锁定”它。为了解锁/解密代码,目标设备必须有权访问您的公钥。设备从配置文件中包含的证书中获取公钥。

为了验证代码在从开发人员到设备的过程中保持不变,您的证书包含一个算法,可以将您的代码/数据转换为所谓的“摘要”。在开发人员方面,数据/代码通过算法运行,生成单独的摘要,然后用私钥锁定。

当设备接收到应用包时,设备可以通过以下操作确保代码未被更改:使用私钥解锁摘要,通过算法运行未加密的数据(请记住,设备可以通过其 prov 配置文件访问证书),并确保结果是与开发人员发送的摘要相同的摘要。

除此之外,prov profile 只需检查手机的 UDID,并确保 profile 中的 AppID 与应用中的标识符匹配。

我认为,我们不需要为应用商店中的应用提供单独的 prov 配置文件的原因是因为每部 iPhone 都附带了苹果用来对签名分发应用进行编码的公钥。

【讨论】:

我认为 Ray 的 testflight 教程比他的代码签名教程解释得更好。 raywenderlich.com/48750/testflight-sdk-tutorial【参考方案2】:

Ray Wenderlich 已经很好地解释了here。为了改善您的描述,而不是

“公认的证书”引用了公钥,而 私钥本质上是由应用程序传递的。

我会说:

应用 .ipa 包含开发者证书。开发商 证书使用您的私钥签名 - 以及 Apple 官方私钥。

因此,通过使用 Apple 和您的公钥验证开发者证书,iPhone 可以验证:

您是此应用的开发者 您已获得 Apple 应用开发认证 允许在 iPhone 上运行此应用(只要手机上存在引用此开发者证书的配置文件)。

您的私钥不存储在任何证书或配置文件中,它仅用于签名。不确定是否存储了公钥。为了完全安全,手机在验证时应从 Apple 获取公钥。

【讨论】:

是否可以从ios应用证书中获取公钥/私钥? @iTroyd23 您当然不能从证书中获取私钥,因为这将是一个重大的安全漏洞。公钥,我不知道。即使它们在证书中,设备仍应向服务器请求它们,以避免其他安全漏洞。 好的,谢谢。苹果是否允许通过自己的应用访问配置文件?

以上是关于证书、配置文件、公钥/私钥揭秘的主要内容,如果未能解决你的问题,请参考以下文章

有人做过wp上如何从pfx文件中获取私钥吗

openssl使用多种方法签名自签名

关于公钥私钥是否可以互相加解密的理解(附苹果开发者证书配置时非对称加密算法的应用)

从jks证书中提取公钥和私钥(jks证书转pem证书)

https配置for apache

RSA公钥、私钥生成,详细讲解