【问题标题】:How to configure an SSL certificate for an application that runs in Express?如何为在 Express 中运行的应用程序配置 SSL 证书?
【发布时间】:2019-01-02 11:50:31
【问题描述】:

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

【问题讨论】:

标签: javascript node.js express https


【解决方案1】:

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

  • private_key
  • server_certificate

首先,Lets Encrypt 是一项服务,它将支持您正在尝试做的事情。他们提供的服务允许您生成受信任的密钥和证书,以保护服务器上的流量AS WELL AS让其他人知道它是由受信任的证书颁发机构签署的。见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");
});

见:create a trusted self-signed SSL cert for localhost (for use with Express/Node)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-25
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多