将letsencrypt与Node Express应用程序一起使用

时间:2017-07-25 12:34:50

标签: node.js express typescript https lets-encrypt

我试图用我的应用程序切换到https。我想使用Letsencrypt,但我在网上看到的所有教程都指出这需要单独的代理设置,以便以固定的时间间隔续订证书。我最近发现greenlock-express似乎将更新过程烘焙到我的快递应用程序的https包装中,所以我不需要设置一个单独的服务器作为续订代理(或者我误解了它的用途?)。

这是我到目前为止所做的:

// Express
import * as http from 'http';
import * as https from 'https';
import * as e from 'express';
const LEX = require('greenlock-express');

/** Run this using MyServer.Initialize(process.argv) **/
export class MyServer {
  public app: e.Express;
  private clientPath = path.join(__dirname, './public');

  static Initialize(args: string[]): Promise<any> {
    return new MyServer()
      .start(args)
      .catch((error: any) => console.error(error);
  }

  constructor() { }

  start(args: string[]): Promise<https.Server> {
    // Simplified the code here, in order to only display relevant info
    return Promise.resolve(this.createServer());
  }

  public createServer(): https.Server {
    this.app = e(); // Creates an express application

    // Setup routes and standard stuff, which I removed to keep this question simple

    // Setup base route to everything else
    this.app.get('/*', (req: e.Request, res: e.Response) => {
      res.sendFile(path.resolve(this.clientPath, 'index.html'));
    });

现在,如果我在此处返回以下内容,则应用启动正常并响应http://localhost

    return this.app.listen(80)
      .on('listening', () => console.log(`Serving on http://localhost/`));

但是,如果我尝试将greenlock-express的东西包裹在我的应用程序周围(这是来自https://www.npmjs.com/package/greenlock-express的示例,那么我有点失望,我无法让它工作开箱即用):

    const lex = LEX.create({
      server: 'staging',
      email: 'my.email@mailprovider.com',
      agreeTos: true,
      configDir: 'cert/',
      approveDomains: ['mydomain.org']
    });

    // Force redirect to https
    http.createServer(lex.middleware(require('redirect-https')())).listen(80, function () {
      console.log('Listening for ACME http-01 challenges on', this.address());
    });

    return <https.Server> https.createServer(lex.httpsOptions, lex.middleware(this.app))
      .listen(443, () => console.log(`Serving on http://localhost/`));
  }
}

没有任何作用。我确实从http://localhost重定向到https://localhost,但之后,浏览器放弃并声明The site cannot be reached

为什么呢?我误解了什么吗?

修改

我知道letsencrypt可能会将localhost解析为我的域。我的应用程序确实有一个域名,我只是不想部署一些我不能100%确定无效的东西。我希望应用程序可以从localhost运行和测试。这就是我的想法

server: 'staging'

greenlock-express配置的一部分用于。

2 个答案:

答案 0 :(得分:4)

是的,我想你可能有。 Letsencrypt为域和子域提供免费的,短期的,经过验证的SSL证书(我相信最高可达10个)。您要做的是让LetsEncrypt服务器在http://localhost/.well-known/acme-challenge向您的应用程序发出请求,以验证您拥有该域。让加密永远不会解析http://localhost到您的服务器。您需要在服务器上运行此代码和模块,并且可以从您拥有的域上的公共Internet访问该代码和模块。然后,LetsEncrypt将能够访问您的应用,验证域并颁发证书。然后您的网站将在SSL下运行。那,或者我误解了一些东西!

答案 1 :(得分:1)

没有本地主机

您不能将localhost与Greenlock™或任何Let's Encrypt™客户端一起使用。

您必须通过域访问该网站。

生产中的暂存

staging选项适用于面向公众的生产环境。如果您希望在部署到现有网站之前确保其有效,则可以使用test.mysite.comwww.test.mysite.com等测试域。

新版本,视频教程,更新文档

我建议看看最新版本,你可能会发现它更容易上手:

https://git.coolaj86.com/coolaj86/greenlock-express.js