Node.js https.get或https.request中的Kerberos身份validation
我正试图编写一个简单的脚本来请求内部networking上的工具的一些数据。 这里是代码:
#!/usr/bin/node var https = require('https'); var fs = require('fs'); var options = { host: '<link>', port: 443, path: '<path>', auth: 'username:password', ca: [fs.readFileSync('../.cert/newca.crt')] }; https.get(options, function(res) { console.log("Got response: " + res.statusCode); res.on('data', function (d) { console.log('BODY: ' + d); }); }).on('error', function(e) { console.log("Got error: " + e.message); });
现在的问题是,如何使用Kerberos票证进行身份validation而不是在auth:
提供我的凭证auth:
纯文本?
在Paul Scheltema的回答中,您需要从操作系统深度获取票据数据。 您(或代表您的模块)必须使用GSS-API为您提供由Active Directory生成的票据数据。
这种机制存在于Chrome中,但似乎并没有包含在Node.js(只有Chrome的JavaScript引擎)中,所以你可能需要添加一个模块,例如:
- Passport-Kerberos: https : //www.npmjs.org/package/passport-kerberos和http://passportjs.org/guide/
- Kerberos(npm install kerberos)
- 在github的Node.js的源代码中,有一个用户使用Bones模块的跟踪( https://github.com/joyent/node/search?q=kerberos&ref=cmdform )。 3年前,与DES(这种编码types是非常薄弱的,已被废弃多年)
要安装/编译此类模块,您可能需要安装Visual Studio。
要设置环境, – 在所有计算机上,必须在端口88(Kerberos)和53(dns)上启用tcp和udp。 – 在Windows服务器上Active Directory必须正在运行(ldap,dns,kdc) – 在页面https://www.npmjs.org/package/passport-kerberos上使用术语REALM。 这是域名, 大写 。
来自http://docs.oracle.com/cd/E24191_01/common/tutorials/authn_kerberos_service.html
用于消息级标准的客户端令牌位置:Kerberos服务票据可以在Authorization HTTP头中或者在消息内部发送,例如在一个元素内。 或者,它可以包含在消息属性中。 select以下选项之一:
所以而不是你提供的用户名:密码
或者你也可以如下所述将这些信息放在消息体中或作为消息属性
var request = https.request(options, function(resource) { var chunks = []; resource.on('data', function (chunk) { chunks.push(chunk); }); resource.on('end', function () { var data = chunks.join(''); console.log(data); }); } request.on('error',...) request.send('<body-with-ticket>'); request.end();
编辑:
“”部分是我在哪里使用ticket的例子,把它放在multiytype主体中发送,或者使用WWW-Authenticate头来发送它
例如。 将其添加到https.request上的选项
options = { host: 'hostname', port: 443, 'WWW-Authenticate': 'Negotiate ' + ticketdata };
谷歌有如何工作的一些很好的图表: https : //developers.google.com/search-appliance/kb/secure/kerberos-diagram
我已经得到了这个使用“kerberos”模块,版本0.0.12的工作。 我已经创build了一个以工作为例的Gist:
https://gist.github.com/dmansfield/c75817dcacc2393da0a7
基本上,您使用三种方法来获取“授权”标题数据:
- authGSSClientInit,它需要服务名称,例如HTTP@somehost.com
- authGSSClientStep,它需要存在一个凭证caching(在Linux上,你可以通过执行“kinit”来得到这个信息,并且可以用“klist”来validation),并且实际上给你回base64你需要的东西(没有领先的“Negotiate”string)
- authGSSClientClean,它释放所有分配的内存结构
然后你创build一个“Authorization”头(不是WWW-Authenticate,如上所示,这是服务器发回的),它应该工作。
另请注意:通常情况下,Web浏览器请求资源,在响应中获得一个带有WWW-Authenticate:Negotiate标头的401,然后使用“授权”标头中提供的票据数据重新请求资源。 这两步跳舞发生在每一个资源。 我不确定这是否意味着什么。