我正在尝试配置已创建的Express服务器,以通过SSL证书并从http转到https。
我阅读了Express文档,但找不到解决方案。他们向我提出了诸如Lets Encrypt之类的东西,但它不支持Node.js,我不知道是否应该修改hosts文件(已经为运行该应用程序而对其进行了修改)或我必须做的事情。我看到了一种形式,但是它仅适用于Unix系统。我展示了配置服务器文件的方式,以防万一他们可以帮助我,但花了三天的时间才找到解决方法,但没有成功。我看到的不支持Node.js。谢谢
我编辑问题: 抱歉,没有提供更多详细信息,问题是我的应用程序不在生产中,并且我的域是临时的:michaelgram.test。我认为,Lets Encrypt不会向我授予证书。我不知道该怎么办。问题是该应用程序托管在本地计算机上
我再次编辑: 原谅,忘了说我的目的是为一个应用程序创建证书,在该证书中,您可以向Facebook进行注册,并尝试了我同事所提供的方法,但是由于新的facebook政策,该方法无效。 如果您有其他想法,那么我的域名将是michaelgram.test 谢谢您,对于给您带来的不便,请原谅。
let express = require('express');
let aws = require('aws-sdk');
let multer = require('multer');
let multerS3 = require('multer-s3');
let ext = require('file-extension');
let cookieParser = require('cookie-parser');
let bodyParser = require('body-parser');
let expressSession = require('express-session');
let passport = require('passport');
let michaelgram = require('michaelgram-client');
let auth = require('./auth')
let config = require('./config');
let port = process.env.PORT || 5050;
let client = michaelgram.createClient(config.client);
let s3 = new aws.S3({
accessKeyId: config.aws.accessKey,
secretAccessKey: config.aws.secretKey
});
let storage = multerS3({
s3: s3,
bucket: 'michaelgram',
acl: 'public-read',
metadata: function (req, file, cb) {
cb(null, { fieldName: file.fieldname })
},
key: function (req, file, cb) {
cb(null, +Date.now() + '.' + ext(file.originalname))
}
});
let upload = multer({ storage: storage }).single('picture');
let app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(expressSession({
secret: config.secret,
resave: false,
saveUninitialized: false
}))
app.use(passport.initialize())
app.use(passport.session())
app.set('view engine', 'pug');
app.use(express.static('public'));
passport.use(auth.localStrategy);
passport.use(auth.facebookStrategy);
passport.deserializeUser(auth.deserializeUser);
passport.serializeUser(auth.serializeUser);
app.get('/', function (req, res) {
res.render('index', { title: 'Michaelgram' });
})
app.get('/signup', function (req, res) {
res.render('index', { title: 'Michaelgram - Signup' });
})
app.post('/signup', function (req, res) {
let user = req.body;
client.saveUser(user, function (err, usr) {
if (err) return res.status(500).send(err.message)
debugger
res.redirect('/signin');
});
});
app.get('/signin', function (req, res) {
res.render('index', { title: 'Michaelgram - Signin' });
})
app.post('/login', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/signin'
}));
app.get('/auth/facebook', passport.authenticate('facebook', { scope: 'email' }));
app.get('/auth/facebook/callback', passport.authenticate('facebook', {
successRedirect: '/',
failureRedirect: '/signin'
}));
function ensureAuth (req, res, next) {
if (req.isAuthenticated()) {
return next()
}
res.status(401).send({ error: 'not authenticated' })
}
app.get('/api/pictures', function (req, res, next) {
let pictures = [ ];
setTimeout(function () {
res.send(pictures);
}, 2000)
});
app.post('/api/pictures', ensureAuth,function (req, res) {
upload(req, res, function (err) {
if (err) {
return res.send(500, "Error uploading file");
}
res.send('File uploaded');
})
})
app.get('/api/user/:username', (req, res) => {
const user = {
username: 'miguelito',
avatar: '',
pictures: [ ]
}
res.send(user);
})
app.get('/:username', function (req, res) {
res.render('index', { title: `Michaelgram - ${req.params.username}` });
})
app.get('/:username/:id', function (req, res) {
res.render('index', { title: `Michaelgram - ${req.params.username}` });
})
app.listen(port, function (err) {
if (err) return console.log('Hubo un error'), process.exit(1);
console.log('Michaelgram escuchando en el puerto 5050');
})
答案 0 :(得分:1)
一旦您准备好密钥并准备好了,您只需启动引用它们的应用程序即可。这些名称只是使用letsencrypt的默认命名来提供的。
var options = {
key: fs.readFileSync(__dirname + '/components/ssl/privkey.pem'),
cert: fs.readFileSync(__dirname + '/components/ssl/fullchain.pem')
};
server = require('https').createServer(options, app);
答案 1 :(得分:1)
使用TLS保护Web服务器时,您需要做两件事:
首先,让加密是一项服务,它将完全支持您要执行的操作。他们提供的服务允许您生成受信任的密钥和证书,以保护服务器上的流量 AS WELL AS ,让其他人知道它是由受信任的证书颁发机构签名的。参见https://letsencrypt.org/how-it-works/
如果您只需要,则可以生成一个自签名证书,如下所示: https://www.akadia.com/services/ssh_test_certificate.html
获得证书和密钥后,这里是服务器的https配置:
var https = require('https');
var fs = require('fs');
var express = require('express');
var options = {
key: fs.readFileSync('/etc/apache2/ssl/server.key'),
cert: fs.readFileSync('/etc/apache2/ssl/server.crt'),
requestCert: false,
rejectUnauthorized: false
};
var app = express();
var server = https.createServer(options, app).listen(3000, function(){
console.log("server started at port 3000");
});
请参阅:create a trusted self-signed SSL cert for localhost (for use with Express/Node)