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引擎)中,所以你可能需要添加一个模块,例如:

要安装/编译此类模块,您可能需要安装Visual Studio。


要设置环境, – 在所有计算机上,必须在端口88(Kerberos)和53(dns)上启用tcp和udp。 – 在Windows服务器上Active Directory必须正在运行(ldap,dns,kdc) – 在页面https://www.npmjs.org/package/passport-kerberos上使用术语REALM&#x3002; 这是域名, 大写

来自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,然后使用“授权”标头中提供的票据数据重新请求资源。 这两步跳舞发生在每一个资源。 我不确定这是否意味着什么。