gpt4 book ai didi

node.js - passport-saml 和 SAML 加密

转载 作者:搜寻专家 更新时间:2023-10-31 22:45:47 24 4
gpt4 key购买 nike

我是 passportpassport-saml 的新手,我正在尝试构建一个使用我们的 Node.js 服务器用于单点登录的大学 Shibboleth 身份提供者。我已经非常接近让一切正常工作了,但是我在/login/callback 期间遇到了一个障碍,我认为这与加密配置有关。

我能够将客户端重定向到登录页面,并且在成功登录后,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...

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

我正在使用最新版本的 Node 和所有各种模块(express、passport、passport-saml 等)

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

"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)
});

如有任何帮助或建议,我们将不胜感激!

最佳答案

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

您的 shibboleth 身份提供者应该有一个提供者元数据文档。如果您还没有,您可能想要确保 uwIdpCert 的内容。匹配 <ds:X509Certificate>阻止在该文档中。 (here 是该元数据文档的示例)

如果您非常确定证书是正确的,我很想看看 SAML.prototype.validatePostResponse 中的 xml 变量的内容。 . (即,只需输入 console.log 语句并查看它的样子)。 passport-saml 中的签名验证逻辑最近发生了一些变化,您的提供商可能正在做一些意想不到的事情。

关于node.js - passport-saml 和 SAML 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24419814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com