1

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

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 颁发。服务器后端是 node v0.10.15 和 iOS SDK v6.1

知道我在这里缺少什么吗?

4

2 回答 2

1

添加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);
于 2013-08-08T22:35:09.260 回答
0

除了您自己的之外,您是否包括任何其他父 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')
  }); 
于 2013-08-08T15:28:51.673 回答