在iOS上使用RSA公钥

3

我正在开发一个应用,需要从我们的服务器检索用户的公钥。一旦获得公钥,我需要使用它进行RSA加密。从服务器获取的公钥是Base64编码。

我该如何将公钥加载到iOS KeyChain中,以便我可以使用它执行RSA密码学功能?证书加载似乎很简单,但原始公钥不是。

3个回答

4

这不被支持,因为这是"错误的"方法

正确的方法是使用证书

引用 "Quinn The Eskimo!"

这非常容易。你不需要将证书添加到钥匙串中来处理此情况。相反,只需在应用程序中加载证书数据(即.cer文件的内容)(您可以从捆绑包或网络上获取此文件),然后使用SecCertificateCreateWithData创建证书引用。从那里,您可以使用SecTrust对象提取公钥引用(SecTrustCreateWithCertificates,SecTrustEvaluate - 您可以选择忽略生成的SecTrustResultType - 和SecTrustCopyPublicKey)。从那里,您可以使用SecKey API(SecKeyEncrypt,SecKeyRawVerify)进行加密和验证。

这里有一个关于如何创建自签名证书的教程

基本步骤如下:

#Make the -----RSA PRIVATE KEY----- file in PEM format
openssl genrsa -out privKey.pem 2048

#Make the -----CERTIFICATE REQUEST-----
openssl req -new -key privKey.pem -out certReq.pem

#Make the actual -----CERTIFICATE-----
openssl x509 -req -days 30 -in certReq.pem -signkey privKey.pem -out certificate.pem

#Make the DER certificate.crt file from the certificate.pem
openssl x509 -outform der -in certificate.pem -out certificate.cer

如果在Mac机器上双击那个.cer文件,它会提示将其导入钥匙串。
资源:

考虑到当时我只有一个裸公钥,这个解决方法是唯一的选择。没有证书可以用来加载它。我们最终将该公钥放入证书以供其他用途。 - John Haager
API正在通过其公开的方法来强制执行其认为正确的安全性实践。 - bobobobo

1

传输公钥的常规方式是将其放在由某些CA签名以证明其真实性的证书中。

或者您可能在谈论ssh公钥? 在这种情况下,您需要一个特殊的ssh应用程序来使用它,这些密钥通常不存储在iOS钥匙串中。


不幸的是,服务器将所有公钥存储为Bas64编码的ASN.1格式。无法更改服务器,因为有太多其他现有客户端依赖它。而且由于我们没有使用这些密钥进行身份验证,因此将它们放在证书中并不必要。 - John Haager
证书通常被编码为base64编码的asn1编码x509包装的公钥。您应该检查 openssl x509 -in yourcert -text 是否给出任何可读输出。否则,可以尝试使用 openssl x509 -in yourcert -inform DER -text - Willem Hengeveld

0

我在苹果网站上找到了必要的代码,描述了如何从公钥中剥离ASN.1标头并将其加载到KeyChain中。


2
你能提供你找到的链接吗? - trojanfoe
1
这是一个链接,指向苹果开发者论坛上有关尝试加载私钥的讨论:https://devforums.apple.com/message/684705。加载公钥只需切换 kSecAttrKeyClass 以指定公钥即可。 - John Haager
Chris Luke写了关于这个的文章。 - bobobobo
我不建议尝试绕过可用的证书系统。 - bobobobo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接