首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >护照- SAML和SAML加密

护照- SAML和SAML加密
EN

Stack Overflow用户
提问于 2014-06-25 22:45:13
回答 1查看 11.5K关注 0票数 9

我是passportpassport-saml的新手,我正在尝试构建一个Node.js服务器,该服务器使用我们大学的Shibboleth身份提供者进行单点登录。我很接近让它全部工作,但我在/login/回调过程中遇到了一个障碍,我认为这与加密配置有关。

我能够将客户端重定向到登录页面,在成功登录后,/login/callback IdP会回发到我的IdP路由。然后我得到了这个错误:

代码语言:javascript
复制
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...

这听起来可能是我传递给cert配置设置的证书不正确吗?我假设decryptionPvkcert配置设置分别是我用来创建服务器证书的私钥和身份提供者的HTTPS证书?或者应该是别的什么东西?

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

作为参考,下面是我用来测试所有这些的服务器脚本:

代码语言:javascript
复制
"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)
});

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-26 23:58:01

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

您的shibboleth标识提供程序应该有提供程序元数据文档。如果还没有,您可能希望确保uwIdpCert的内容与该文档中的<ds:X509Certificate>块匹配。(这里是元数据文档应该是什么样子的一个例子)

如果您非常确定证书是正确的,我会好奇地看到SAML.prototype.validatePostResponse中的xml变量的内容。(也就是说,只需提交一个console.log语句,看看它是什么样子)。最近,passport中的签名验证逻辑发生了一些变化,而且您的提供者可能正在做一些意想不到的事情。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24419814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档