我被问到是否可以在连接期间检查SSL证书的某些属性以提高性能。
请参阅PayPal网站附图:
有没有办法读取这些值?如果我能通过浏览器浏览网络来获取它们,我可以通过使用NSURLConnection,NSData或(最重要的)ASIHTTPRequest连接到服务器来读取它们吗?
当然,我正在处理的证书是有效的,而不是自签名/不可信的。这种验证是否确实提高了应用程序的安全性?
答案 0 :(得分:1)
对于ASIHTTPRequest,答案是否定的。
对于NSNURLConnection,可以使用
读取这些值- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
您可以在此处查看我对类似问题的回答:ASIHTTPRequest retrieve server certificate
这种技术称为SSL Pinning。它使SSL连接更强大。您可以在此处阅读更多内容:https://www.isecpartners.com/blog/2013/february/ssl-pinning-on-ios.aspx
答案 1 :(得分:0)
如果您的目标是提高性能,则需要在SSL握手完成之前检查证书。协商连接的对称密钥是建立连接的计算上昂贵的部分。
在建立SSL连接后,您可以检查证书中的任何内容。从性能角度来看,技巧是进入一种状态,在握手完成之前你可以反弹连接。
我有两个想法: 1 - 查看您可以在服务器中使用哪些SSL库,以及它们允许您执行哪些约束。通常SSL库会让你:
一些高端库还允许您进行OCSP检查或CRL检查以验证当前状态。
大多数图书馆都会允许您加入并编写自己的验证 - 但您必须深入了解详细信息,并确定是否允许您在建立连接之前或之后进行验证。
2 - SSL性能改进的另一个技巧是设置服务器,以便它们重用以前会话中的共享密钥。当相同的两点重新建立连接时,这消除了设置成本。如果您没有安全存储空间,则会使您的系统面临风险。但如果您正确保护密钥存储区,它可能是一个可接受的交易。
这在很大程度上取决于您的环境 - #2并非在具有大量连接的环境中获胜 - 您将无法充分回收连接以证明存储信息的合理性。