端口号的HTTPSurl在iOS上不可用

我在包含端口号的HTTPS URL上发送一个简单的GET请求。 该url看起来像这样

https://example.com:8080/v1/base

这完美的Android和任何浏览器..甚至curl。 但是,我在iOS上得到这个错误。 如果我从上面的URL中删除端口号,这工作得很好!

错误:错误域= NSURLErrorDomain代码= -1202“此服务器的证书无效,您可能正在连接假装为”example.com“的服务器,这可能会使您的机密信息处于危险之中。 UserInfo = 0xa694c50 {NSErrorFailingURLStringKey = https://example.com:8080/v1/base,NSLocalizedRecoverySuggestion =你想连接到服务器呢,NSErrorFailingURLKey = https://example.com:8080/api/v1/base ,NSLocalizedDescription =这个服务器的证书是无效的。 您可能正在连接到假装为“example.com”的服务器,这可能会使您的机密信息处于危险之中,NSUnderlyingError = 0xa2410a0“此服务器的证书无效。您可能正在连接到假装是“example.com”,这可能会使您的机密信息处于危险之中。“,NSURLErrorFailingURLPeerTrustErrorKey =}

SSL证书由DigiCert颁发。 服务器后端是节点v0.10.15和iOS SDK v6.1

任何想法,我在这里失踪?

你是否包含超出你自己的额外的父CA证书?

另外,如果你使用8080或443以外的端口,它是否工作? 如果你在443上进行监听,并明确地尝试请求https://example.com:443/v1/base ,它是否工作?

 var fs = require('fs'); var httpsOpt = { key : fs.readFileSync('ssl.plain.key').toString(), cert : fs.readFileSync('ssl.crt').toString(), ca:[fs.readFileSync('ca.pem').toString(), fs.readFileSync('sub.class1.server.ca.pem').toString()], }; https.createServer(httpsOpt, app) .listen('8080', function(){ console.log('Listening on 8080') }); 

添加requestCert: true和CA证书解决了这个问题

 var https = require('https'), // module for https fs = require('fs'); // required to read certs and keys var options = { key: fs.readFileSync('ssl/server.key'), cert: fs.readFileSync('ssl/server.crt'), ca: fs.readFileSync('ssl/ca.crt'), requestCert: true, rejectUnauthorized: false }; https.createServer(options, function (req, res) { if (req.client.authorized) { res.writeHead(200, {"Content-Type": "application/json"}); res.end('{"status":"approved"}'); } else { res.writeHead(401, {"Content-Type": "application/json"}); res.end('{"status":"denied"}'); } }).listen(443);