0

我正在使用自签名 ssl 证书来设置 https 站点并使用请求包来访问该站点上的内容。但是,该程序似乎卡住了,并且没有打印该站点的内容。有什么办法可以克服这个问题。

4

1 回答 1

2

警告:这应该只用于调试。为错误的 SSL 证书自动添加覆盖会危及整个连接 - 如果您这样做,那么您可以首先跳过使用 SSL。当您为其他人发布此扩展时,您应该使用有效的证书。


您可能想要手动添加证书覆盖。这就是您将使用的东西nsICertOverrideService.rememberValidityOverride()需要 chrome 权限)。唯一的问题是获取要为其添加覆盖的证书。但是尝试联系服务器并打电话nsIRecentBadCertsService.getRecentBadCert()应该可以。像这样的东西:

var Request = require("request").Request;
var host = "example.com";
var port = "443";
Request({
  url: "https://" + host + ":" + port + "/foo",
  onComplete: function(response)
  {
    var status = null;
    try
    {
      status = response.status;
    } catch(e) {}

    if (!status)
    {
      // There was a connection error, probably a bad certificate
      var {Cc, Ci} = require("chrome");

      var badCerts = Cc["@mozilla.org/security/recentbadcerts;1"]
                       .getService(Ci.nsIRecentBadCertsService);
      var status = badCerts.getRecentBadCert(host + ":" + port);
      if (status)
      {
        var overrideService = Cc["@mozilla.org/security/certoverride;1"]
                                .getService(Ci.nsICertOverrideService);
        overrideService.rememberValidityOverride(host, port, status.serverCert,
                                Ci.nsICertOverrideService.ERROR_UNTRUSTED, false);

        // Override added, now you should re-do the request
        ...
      }
    }
  }
});

注意:此代码尚未经过测试,特别是我不确定通过检查检测连接错误是否真的有效response.status(我的猜测是,如果存在连接错误但文档没有说明任何内容,它应该抛出)。

于 2012-05-29T08:13:53.913 回答