passport-saml和SAMLencryption

我是新来的passportpassport-saml ,我试图build立一个Node.js服务器,使用我们大学的Shibboleth身份提供者进行单点login。 我相当接近所有工作,但我在/ login /callback,我认为是与encryptionconfiguration相关的打击。

我可以将客户端redirect到login页面,login成功后,IdP将POST发回到我的/ login / callback路由。 然后我得到这个错误:

 Error: Invalid signature at SAML.validatePostResponse (.../node_modules/passport-saml/lib/passport-saml/saml.js:357:21) at Strategy.authenticate (.../node_modules/passport-saml/lib/passport-saml/strategy.js:68:18) at ...etc... 

这听起来像是我传递给certconfiguration设置的cert可能不正确? 我假设decryptionPvkcertconfiguration设置应该是我用来创build我的服务器证书的私钥和身份提供商的HTTPS证书,分别? 或者他们应该是别的东西?

我正在使用最新版本的节点和所有各种模块(快递,护照,passport-saml等)

而作为参考,这里是我用来testing所有这些的服务器脚本:

 "use strict;" var https = require('https'); var fs = require('fs'); var express = require("express"); var morgan = require('morgan'); var bodyParser = require('body-parser'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var passport = require('passport'); var saml = require('passport-saml'); var cert = fs.readFileSync('./certs/my-server-https-cert.crt', 'utf-8'); var pvk = fs.readFileSync('./certs/my-server-private.key', 'utf-8'); var uwIdpCert = fs.readFileSync('./certs/our-idp-server-https-cert.pem', 'utf-8'); passport.serializeUser(function(user, done){ done(null, user); }); passport.deserializeUser(function(user, done){ done(null, user); }); var samlStrategy = new saml.Strategy({ callbackUrl: 'https://my-domain-name.whatever.edu/login/callback', entryPoint: 'https://my-university/idp/entry/point', issuer: 'my-entity-id (domain name registered with university IdP)', decryptionPvk: pvk, cert: uwIdpCert }, function(profile, done){ console.log('Profile: %j', profile); return done(null, profile); }); passport.use(samlStrategy); var app = express(); app.use(morgan('dev')); app.use(bodyParser.urlencoded({extended: true})); app.use(cookieParser()); app.use(session({secret: fs.readFileSync('./certs/session-secret.txt', 'utf-8')})); app.use(passport.initialize()); app.use(passport.session()); app.get('/', passport.authenticate('saml', {failureRedirect: '/login/fail'}), function(req, res) { res.send('Hello World!'); } ); app.post('/login/callback', passport.authenticate('saml', { failureRedirect: '/login/fail', failureFlash: true }), function(req, res) { res.redirect('/'); } ); app.get('/login/fail', function(req, res) { res.send(401, 'Login failed'); } ); app.get('/Shibboleth.sso/Metadata', function(req, res) { res.type('application/xml'); res.send(200, samlStrategy.generateServiceProviderMetadata(cert)); } ); //general error handler app.use(function(err, req, res, next){ console.log('Express error!'); console.error(err.stack); next(err); }); var server = https.createServer({ key: pvk, cert: cert }, app); server.listen(process.argv[2] || 44300, function(){ console.log('Listening on port %d', server.address().port) }); 

任何帮助或build议将不胜感激!

是的, cert是身份提供者的证书 – 不一定是HTTPS证书。

您的shibboleth身份提供商应该有一个提供商元数据文档。 如果您还没有,则可能需要确保uwIdpCert的内容与该uwIdpCert中的<ds:X509Certificate>块匹配。 ( 这里是一个元数据文件应该看起来像什么的例子)

如果你确定证书是正确的,我会很好奇的看到SAML.prototype.validatePostResponse xmlvariables的内容。 (即,只需引入一个console.log语句,看看它是什么样子)。 最近Passport-saml中的签名validation逻辑发生了一些变化,您的提供者可能会做出一些意想不到的事情。