Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js passport saml和saml加密_Node.js_Encryption_Passport.js_Saml 2.0_Shibboleth - Fatal编程技术网

Node.js passport saml和saml加密

Node.js passport saml和saml加密,node.js,encryption,passport.js,saml-2.0,shibboleth,Node.js,Encryption,Passport.js,Saml 2.0,Shibboleth,我是passport和passport saml的新手,我正在尝试构建一个Node.js服务器,该服务器使用我们大学的Shibboleth身份提供者进行单点登录。我很快就能让一切正常工作,但在/login/callback过程中遇到了一个障碍,我认为这与加密配置有关 我可以将客户端重定向到登录页面,成功登录后,IdP会发回我的/login/callback路由。然后我得到这个错误: Error: Invalid signature at SAML.validatePostResponse (..

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

我可以将客户端重定向到登录页面,成功登录后,IdP会发回我的/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
config设置的证书不正确?我假设
decryptionPvk
cert
配置设置分别是我用来创建服务器证书和身份提供商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标识提供程序应具有提供程序元数据文档。如果还没有,可能需要确保
uwidcert
的内容与该文档中的
块匹配。(是元数据文档应该是什么样子的示例)


如果您非常确定证书是正确的,那么我很想看看
SAML.prototype.validatePostResponse
中xml变量的内容。(也就是说,只需输入一个console.log语句,看看它是什么样子)。passport saml中的签名验证逻辑最近发生了一些更改,您的提供商可能做了一些意外的事情。

我对其进行了调试,XML出现错误消息,显示“不支持必需的NameID格式”。NameIDFormat的默认值似乎是urn:oasis:names:tc:saml:1.1:NameID格式:emailAddress,我猜我们的IdP不支持。我有一封电子邮件给我们的IT人员,询问我应该使用哪个值。看起来我还可以将其设置为null以完全忽略它。你那边有什么建议吗?谢谢你的帮助!顺便说一句,我确实返回了一个元数据文档——请参见上面的
/Shibboleth.sso/Metadata
的路径。但是当我调用
samlStrategy.generateServiceProviderMetadata(cert)
时,我想我应该使用我的证书。你是说我应该使用IdP的证书吗?如果你找到元数据文档,它应该有
标签,告诉你什么是可以接受的。(例如,在我链接到的TestShib示例中,
urn:oasis:names:tc:SAML:2.0:nameid格式:transient
urn:mace:shibboleth:1.0:nameIdentifier
)并回答您的第二条评论——您(服务提供商)和身份提供商都有元数据文档。您的评论是关于您的SP元数据的,您确实在该上下文中使用了自己的证书。在我的回答中,我提到了IdP的元数据文档。在下面的回答和评论中,您没有看到解决方案吗?