我正在尝试将我的iOS应用程序连接到HTTPS Rails应用程序,该应用程序当前在我的网络中的本地主机上运行。我可以使用https://myIP:3000/display
从我的浏览器访问该站点,也可以在命令行中使用curl请求访问该站点。我正在尝试使用以下方式从我的应用访问它:
class FirstViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//let url = NSURL(string: "https://another/Sinatra/website/feed")
let url = NSURL(string: "https://myIP:3000/display")
let request = NSURLRequest(URL: url!)
let task = NSURLSession.sharedSession().dataTaskWithURL(url!)
task!.resume()
}
当我尝试访问sinatra网站时,我没有遇到任何麻烦,甚至可以使用正确的命令将JSON打印到控制台。但是,当我将URL设置到我的Rails网站时,我收到以下错误。
NSURLSession / NSURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-9813)
另外,我可以告诉我的localhost Rails应用程序(在另一台机器上)没有从iOS应用程序中删除,但是从浏览器和curl命令中进行了ping操作。
任何想法如何解决这个问题?
答案 0 :(得分:42)
如果我理解得很好,Apple现在希望开发人员使用HTTPS和TLS 1.2进行网络呼叫。
临时,您可以在“Info.plist”文件中添加:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
只需查看此链接,它也可以为您提供帮助:http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/
-
更新:根据一些评论,上述解决方案已不再适用。这是一个更新的解决方案。
Info.plist
文件。Dictionary
和键 App Transport Security Settings
。Boolean
,键 Allow Arbitrary Loads
和值 { {1}} <强> - 强>
否则您可以设置YES
。这是怎么做的:
Domain Exceptions
文件。Info.plist
和键 Dictionary
。App Transport Security Settings
和键 Dictionary
。Exception Domains
和键 Dictionary
。The domain
和 Key Boolean
&amp; NSExceptionAllowsInsecureHTTPLoads
值 NSIncludesSubdomains
。<强>链接强>
答案 1 :(得分:19)
这是一个信任问题。使用自签名证书时,SSL的身份验证组件不起作用。它仍然可以建立一个安全的连接,以便没有人在窃听,但应用程序无法确定谁在该行的另一端。
我有类似的设置,并通过将自签名根CA添加到iPad可信证书来解决此问题。此根CA用于签署我的所有其他开发证书。然后我只需要在任何可以使用SSL的地方添加这个单根证书。如果您只拥有直接使用的自签名证书,则可以添加该证书。
要将证书放到设备(或模拟器)上,我将文件放在我的Web服务器上。然后只需通过普通HTTP在Safari中打开它。应该打开“设置”应用,询问您是否要信任该证书。
当然,假设这只是用于开发,并且您的生产系统具有由知名权威机构签署的证书(即OS和根证书颁发机构数据库中包含的证书)。因为要求最终用户安装自签名证书不会飞。
答案 2 :(得分:6)
这是唯一适用于我的解决方案...在AppDelegate.m文件的末尾插入代码:
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
感谢jc ivancevich文章http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-android-ios/
答案 3 :(得分:1)
(编辑 - 我把它误读为9814,过期的证书。我不知道如何解决这个问题,但希望我的回答有助于指出正确的方向。)
看起来证书问题与通常的“允许任意负载”问题不同。
摘自:Apple Documentation - Appendix A: Common Server Trust Evaluation Errors
NSOSStatusErrorDomain errSSLNoRootCert -9813
答案 4 :(得分:1)
尝试更改会话变量,此更改可以帮助我
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
答案 5 :(得分:0)
修改info.plist也适用于我。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
答案 6 :(得分:-4)