Node.js使用SSL通配符在移动设备上无法正常运行

3
我有一个运行在 sub.domain.com 上的 Node.js 服务器,使用 SSL。在桌面浏览器上它工作得很完美,但我刚刚发现它在移动浏览器上无法工作。
我进行了一些研究,有很多人认为我的证书链存在问题。尽管我已经按照建议更改了代码,但仍然没有成功。
以下是我的代码:
var httpsOptions = {
    ca: [fs.readFileSync("certrequest.csr")],
    key: fs.readFileSync("privatekey.pem"),
    cert: fs.readFileSync("certificate.pem")
};

var app = http.createServer(httpsOptions, function(req, res) {
    log.cnsl.write("HTTP Request received from " + req.connection.remoteAddress);
        //Do stuff
});

我正在运行以下命令以查看一些调试信息(我的服务器在端口5673上运行):
openssl s_client -connect sub.domain.com:5673 -showcerts | grep "^ "

以下是输出中的重要部分。
depth=0 O = *.domain.com, OU = Domain Control Validated, CN = *.domain.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 O = *.domain.com, OU = Domain Control Validated, CN = *.domain.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 O = *.domain.com, OU = Domain Control Validated, CN = *domain.com
verify error:num=21:unable to verify the first certificate
verify return:1

你能提供颁发证书的公司名称吗?这将有助于为您提供正确的配置。 - yadutaf
中间证书的完整列表可在此页面上找到:https://certs.godaddy.com/anonymous/repository.seam - yadutaf
1个回答

5

你把证书请求文件“certrequest.csr”放在CA中听起来相当奇怪。

CA字段应该包含从您的个人证书到根证书的证书链。在我的配置中,它包含两个条目。一个是根证书本身,第二个是中间证书,因为我的发行商提供多级认证。

顺便说一下,您的认证公司肯定会在其常见问题解答中提供这些信息。

以下是我的配置摘录作为示例:

var httpsOptions = {
    key:fs.readFileSync('/etc/ssl/private/ssl-main.key'),
    cert:fs.readFileSync('/etc/ssl/private/ssl-main.crt'),
    ca:[fs.readFileSync('/etc/ssl/private/ca.pem'),
        fs.readFileSync('/etc/ssl/private/sub.class2.server.ca.pem')]
};

无论如何,这并不能解释为什么它可以在非移动浏览器上运行。我唯一的猜测是因为它们可能会在链的某个部分嵌入自己,而移动设备由于磁盘空间原因可能不会这样做。
希望这有所帮助。

我在多个地方看到,相比移动浏览器,桌面浏览器对证书链更宽松。我会尝试找到正确的 CA 文件,如果有效就会接受。 - jwegner
我不知怎么的从捆绑包中拿到了错误的文件。实际上,我跟随的另一个教程使用了certrequest.csr作为CA...我想我被误导了。谢谢! - jwegner
这个对我解决了问题。不知道为什么它的评分是0,所以点了赞。 - daw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接