繁体   English   中英

如何为Express中运行的应用程序配置SSL证书?

[英]How to configure an SSL certificate for an application that runs in Express?

我正在尝试配置已创建的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'); }) 

准备好密钥并准备好密码后,您只需参考它们启动应用程序。 这些名称只是使用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);

使用TLS保护Web服务器时,您需要做两件事:

  • PRIVATE_KEY
  • server_certificate

首先, Lets Encrypt是一项服务,它将完全支持您要尝试执行的操作。 他们提供的服务,您可以产生哪些保护通信的服务器上,也可让的人知道它是由受信任的证书颁发机构签署可信的密钥和证书。 参见https://letsencrypt.org/how-it-works/

如果你只是想TLS可以生成像这样一个自签名证书: 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");
});

请参阅: 为本地主机创建受信任的自签名SSL证书(用于Express / Node)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM