2017-10-01 1 views
0

Ich versuche Letsencrypt ohne Verwendung eines Reverse-Proxy wie Nginx zu verwenden, fand ich ein Modul namens Letsencrypt-Express (Greenlock-Express) auf npm. Aber ich kann es nicht funktionieren.Knoten: Letsencrypt-Express-Modul funktioniert nicht mit http und https Node-Server

Arbeitsbeispiel:

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 = '[email protected]', 
     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); 

Das Ober Beispiel arbeitet wie erwartet. Leitet http zu https um und gibt ein Zertifikat vom Letsencript staging server aus. und speichert sie im ~/Letsencript-Ordner.

Und hier ist, was ich will aber nicht funktioniert.

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 = '[email protected]', 
     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"); 
}); 

Ich wünsche den Server über https Knotenmodul dienen. und möchte etwas in dem Callback ausführen, das in der .listen() - Funktion bereitgestellt wird. Aber es erstellt nicht einmal lassen Sie uns den Ordner in home dir verschlüsseln.

Konsolenausgabe:

[email protected]:~/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 

Antwort

0

Ich löste das Problem selbst. Der "Greenlock-Express" ist nur ein Interceptor des "Greenlock" -Moduls.

Hier ist ein funktionierender Code.

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 = '[email protected]', 
     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); 
}) 

Ich weiß nicht, warum dieser Code funktioniert und warum der vorherige Code ist es nicht! Aber der Code funktioniert, das reicht!

Verwandte Themen