// Example of the server https is taken from here: https://engineering.circle.com/https-authorized-certs-with-node-js-315e548354a2 // Renew certificates: // - openssl x509 -req -extfile server.cnf -days 9999 -passin "pass:password" -in server-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out server-crt.pem // - openssl x509 -req -extfile client1.cnf -days 9999 -passin "pass:password" -in client1-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out client1-crt.pem // - openssl x509 -req -extfile client2.cnf -days 9999 -passin "pass:password" -in client2-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out client2-crt.pem // Verify certificates: // - openssl verify -CAfile ca-crt.pem server-crt.pem // - openssl verify -CAfile ca-crt.pem client1-crt.pem // - openssl verify -CAfile ca-crt.pem client2-crt.pem // Conversion of client1-crt.pem to certificate.pfx: https://stackoverflow.com/a/38408666/4637638 // - openssl pkcs12 -export -out certificate.pfx -inkey client1-key.pem -in client1-crt.pem -certfile ca-crt.pem // - Overwrite certificate.pfx to example/test_assets/certificate.pfx const express = require('express'); const http = require('http'); const https = require('https'); const cors = require('cors'); const auth = require('basic-auth'); const app = express(); const appHttps = express(); const appAuthBasic = express(); const fs = require('fs') const path = require('path') const bodyParser = require('body-parser'); const multiparty = require('multiparty'); var options = { key: fs.readFileSync('server-key.pem'), cert: fs.readFileSync('server-crt.pem'), ca: fs.readFileSync('ca-crt.pem'), requestCert: true, rejectUnauthorized: false, ciphers: "DEFAULT:@SECLEVEL=0" }; appHttps.get('/', (req, res) => { console.log(JSON.stringify(req.headers)) const cert = req.connection.getPeerCertificate() // The `req.client.authorized` flag will be true if the certificate is valid and was issued by a CA we white-listed // earlier in `opts.ca`. We display the name of our user (CN = Common Name) and the name of the issuer, which is // `localhost`. if (req.client.authorized) { res.send(`
HELLO
`); res.end() }) app.get("/echo-headers", (req, res) => { res.send(`${JSON.stringify(req.headers)}`); res.end() }) app.get('/test-index', (req, res) => { res.sendFile(__dirname + '/public/test-index.html'); }) app.post("/test-post", (req, res) => { console.log(JSON.stringify(req.headers)) console.log(JSON.stringify(req.body)) res.send(`
HELLO ${req.body.name}!
`); res.end() }) app.post("/test-ajax-post", (req, res) => { console.log(JSON.stringify(req.headers)); if (req.headers["content-type"].indexOf("multipart/form-data;") === 0) { const form = new multiparty.Form(); form.parse(req, function(err, fields, files) { console.log(fields); res.set("Content-Type", "application/json") res.send(JSON.stringify({ "firstname": fields.firstname[0], "lastname": fields.lastname[0], })); res.end(); }); } else { console.log(req.body); res.set("Content-Type", "application/json") res.send(JSON.stringify({ "firstname": req.body.firstname, "lastname": req.body.lastname, })); res.end(); } }) app.get("/test-download-file", (req, res) => { console.log(JSON.stringify(req.headers)) const filePath = path.join(__dirname, 'assets', 'flutter_logo.png'); const stat = fs.statSync(filePath); const file = fs.readFileSync(filePath, 'binary'); res.setHeader('Content-Length', stat.size); res.setHeader('Content-Type', 'image/png'); res.setHeader('Content-Disposition', 'attachment; filename=flutter_logo.png'); res.write(file, 'binary'); res.end(); }) app.listen(8082) // Proxy server http.createServer(function (req, res) { res.setHeader('Content-type', 'text/html'); res.write(`${req.url}
${req.method}
${JSON.stringify(req.headers)}
`); res.end(); }).listen(8083);