节点:letsencrypt-express 模块在使用 http 和 https 节点服务器时不工作

Node: letsencrypt-express module not working while using http and https node server

我试图在不使用像 Nginx 这样的反向代理的情况下使用 Letsencrypt,我在 npm 上发现了一个名为 letsencrypt-express (greenlock-express) 的模块。但我无法让它工作。

工作示例:

var express         = require('express')
var letsencript     = require('greenlock-express')
var leclg           = require('le-challenge-fs')
var lestore         = require('le-store-certbot')
var http                    = require('http');
var https               = require('https');
var redHttps        = require('redirect-https')

var app = express();

app.get('/', (req, res) => {
  res.send('Ok Working');
})

var lex = letsencript.create({

  server: 'staging',
  // agreeTos: true,
  approveDomains: (opts, certs, cb) => {
    if (certs) {
      // change domain list here
      opts.domains = ['10hd.in']
    } else {
      // change default email to accept agreement
      opts.email = 'test@gmail.com',
      opts.agreeTos = true;
    }
    cb(null, { options: opts, certs: certs });
  },
  // app: app,
  // challenges: { 'http-01': leclg.create({ webrootPath: '/tmp/acme-challenges' }) },
  // store: lestore.create({ webrootPath: '/tmp/acme-challenges' })


}).listen(80, 443);

上面的示例按预期工作。将 http 重定向到 https 并从 Letsencript 登台服务器颁发证书。并将它们存储在 ~/letsencript 文件夹中。

这就是我想要但没有用的东西。

var express         = require('express')
var letsencript     = require('greenlock-express')
var leclg           = require('le-challenge-fs')
var lestore         = require('le-store-certbot')
var http                    = require('http');
var https               = require('https');
var redHttps        = require('redirect-https')

var app = express();

app.get('/', (req, res) => {
  res.send('Ok Working');
})

var lex = letsencript.create({

  server: 'staging',
  // agreeTos: true,
  approveDomains: (opts, certs, cb) => {
    if (certs) {
      // change domain list here
      opts.domains = ['10hd.in']
    } else {
      // change default email to accept agreement
      opts.email = 'test@gmail.com',
      opts.agreeTos = true;
    }
    cb(null, { options: opts, certs: certs });
  },
  // app: app,
  // challenges: { 'http-01': leclg.create({ webrootPath: '/tmp/acme-challenges' }) },
  // store: lestore.create({ webrootPath: '/tmp/acme-challenges' })


})
// .listen(80, 443);

const middlewareWrapper = lex.middleware;
// redHttps()
http.createServer(lex.middleware(redHttps())).listen(80, ()=> {
    console.log("Listening for ACME http-01 challenges");
});
//
https.createServer(
  lex.httpsOptions,
  lex.middleware(app)
).listen(433, () => {
    console.log("Listening for ACME tls-sni-01 challenges and serve app");
});

我想通过 https 节点模块为服务器提供服务。并想在 .listen() 函数中提供的回调中做一些事情。 但它甚至没有创建 let's encrypt the folder in home dir.

控制台输出:

bubundas17@instance-2:~/test$ sudo node app.js 
le.challenges[tls-sni-01].loopback should be defined as function (opts, domain, token, cb) { ... } and should prove (by external means) that the ACME server challenge 'tls-sni-01' will succeed
Listening for ACME http-01 challenges
Listening for ACME tls-sni-01 challenges and serve app

我自己解决了这个问题。 "greenlock-express" 只是 "greenlock" 模块的拦截器。

这是一个工作代码。

 const http = require('http');
const https = require('https');
const redirectHttps = require('redirect-https')
var app = require('express')();
app.get('/', (req, res) => {
  res.send("Test Server")
})

var le = require('greenlock').create({
  server: 'staging',
  configDir: 'certs/etc',
  approveDomains: (opts, certs, cb) => {
    if (certs) {
      opts.domains = ['10hd.in']
    } else {
      opts.email = 'test@gmail.com',
        opts.agreeTos = true;
    }
    cb(null, {
      options: opts,
      certs: certs
    });
  },
});


http.createServer(le.middleware(redirectHttps())).listen(80, function() {
  console.log("Server Running On http" + 80);
})

https.createServer(le.httpsOptions, le.middleware(app)).listen(443, function() {
  console.log("Server Running On https" + 443);
})

我不知道为什么这段代码有效,为什么以前的代码无效!但是代码可以运行,这就够了!