此测试程序连接到https服务器并获取一些内容。我已经在浏览器和curl中检查了我的服务器,证书工作正常。如果我运行curl从服务器获取数据,它会正确地抱怨证书未知,除非我使用--cacert传递它或使用-k关闭安全性。
所以我遇到的问题是,虽然我认为我的客户端应该进行证书身份验证,而且我告诉它公共证书的位置,但它始终有效。如果我删除ca:选项,以便它不知道证书来自服务器,那么它默默地工作。我想抓住身份验证错误,但我似乎无法这样做。
var https = require('https');
var fs = require('fs');
function main() {
var data = '';
var get = https.get({
path: '/',
host: 'localhost',
port: 8000,
agent: false,
ca: [ fs.readFileSync('https_simple/cacert.pem') ]
}, function(x) {
x.setEncoding('utf8');
x.on('data', function(c) {data += c});
x.on('error', function(e) {
throw e;
});
x.on('end', function() {
console.log('Hai!. Here is the response:');
console.log(data);
});
});
get.on('error', function(e) {throw e});
get.end();
}
main();
答案 0 :(得分:10)
为了完成这项工作,我需要升级到v0.7.8(尽管任何v0.7应该没问题),其中rejectUnauthorized功能已添加到https.get
需要这些选项组合:
agent: false, // or you can supply your own agent, but if you don't you must set to false
rejectUnauthorized: true,
ca: [ fs.readFileSync('https_simple/cacert.pem') ]
现在,如果身份验证失败,您将收到“错误”事件,请求将不会继续。
有关制作自己的代理
的详细信息,请参阅https.request documentation错误修复已在此更改中提交:https://github.com/joyent/node/commit/f8c335d0
答案 1 :(得分:4)
根据https.request
的{{3}},ca
和https.get
的{{1}}选项是来自documentation的选项。 https.request
模块功能选项的文档说明:
tls.connect
:一组字符串或受信任证书的缓冲区。如果是这样的话 省略了几个众所周知的“根”CA,就像VeriSign一样。 这些用于授权连接。
深入了解node.js源代码,可以在此处找到使用的根证书:tls.connect
因此,简而言之,由于ca
模块没有提供权限证书,https.get
模块将尝试使用根证书列表对连接进行身份验证。
答案 2 :(得分:2)
我使用request模块在npm中执行此操作。它是这样的:
var cacert = ... // in npm, this is a config setting
var request = require("request")
request.get({ url: "https://...",
ca: cacert,
strictSSL: true })
.on("response", function (resp) { ... })
.on("error", function (er) { ... })
如果ssl无效,将引发错误事件。
答案 3 :(得分:1)
在V 0.6.15中,无论证书验证是否通过,您都需要explicitly check。
if (x.connection.authorized === false) {
console.log('SSL Authentication failed');
} else if (x.connection.authorized === true) {
console.log('SSL Authentication succeeded');
}