在 ios 上使用不受信任的证书加密数据

Posted

技术标签:

【中文标题】在 ios 上使用不受信任的证书加密数据【英文标题】:encrypt data with untrusted certificate on ios 【发布时间】:2012-03-20 17:19:08 【问题描述】:

我正在 iPhone 中开发一个应用程序,并在其中连接到 webService。要发送我要加密的用户密码。为此,我创建了一对公钥/私钥,私钥在服务器上用于解密密码,而公钥在我加密密码的 iPhone 应用程序上。我创建了这对:

$ openssl genrsa -out private.pem 1024
$ openssl rsa -in private.pem -out public.pem -outform PEM -pubout

当我加密消息时,我使用此代码创建 SecCertificateRef:

    NSData *certData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"wspublickey" ofType:@"pem"]];
SecCertificateRef cert = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)certData);

在这条指令 cert==nil 之后,我花了很多时间试图理解关于它的帖子(我理解非对称密钥的痛苦,但我完全没有实现它的经验)。我的结论是我的证书不受信任,这就是 SecCertificateCreateWithData 返回 nil 的原因。我的问题是如果我不想支付受信任的证书,我应该如何加密我的数据?抱歉,我对使用 rya 公钥证书加密数据的实现理解不佳,但我迷路了,我不知道应该如何解决这个问题。谢谢你的帮助。帖子阅读:

"untrusted server certificate" on iPhone http://omegadelta.net/2011/01/17/ios-untrusted-server-certificate/ http://lists.apple.com/archives/apple-cdsa/2009/Jun/msg00012.html

我想要的只是使命令等效:

$ openssl rsautl -encrypt -inkey public.pem -pubin -in file.txt -out file.ssl

【问题讨论】:

【参考方案1】:

我终于找到了我正在寻找的东西。我需要像 CodeInChaos 所说的是我的自签名证书。有了它,我的代码可以正常工作。为此,我使用以下命令:

openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650

我发现这篇文章非常有用:

http://blog.iamzsx.me/show.html?id=155002

它回答了很多问题。不是英文的,但谷歌翻译得很好,所以这不是一个大问题。我希望这可以帮助遇到同样问题的人。

【讨论】:

【参考方案2】:

为了安全地执行此操作,您必须使用 HTTPS 或 SSL/TLS。如果您不想花 5 美元购买证书,您可以使用自签名证书并硬核化公钥。无需构建自己的协议,那是浪费时间。

【讨论】:

我认为他想这样做,但要使用自签名证书。如果您将公钥硬编码到应用程序中,那就太好了。 @CodeInChaos 啊,是的,这可以说更安全。 没错,目前我没有 https 服务器,也无法拥有它,所以目前我正在搜索保护用户密码的解决方案【参考方案3】:

问题出在文件格式上。 您使用的是 PEM 而不是 DER 是 iOS API 的二进制格式 SecCertificateCreateWithData( )

【讨论】:

以上是关于在 ios 上使用不受信任的证书加密数据的主要内容,如果未能解决你的问题,请参考以下文章

iOS 10.3下解决Charles抓包ssl证书信任问题

解决Charles抓包ssl证书信任问题

服务器证书不受信任怎么解决

怎样的ssl证书才能被信任?

IIS 上使用 OpenSSL 的不受信任的证书

WCF 自签名证书在客户端上不受信任