此测试程序连接到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();
解决方法
为了完成这项工作,我需要升级到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