I'm running a micro-service API, and I use express-gateway. This API has been running since 1 years. I need to implement HTTPS connection to it, and I have difficulties to do.
I've generated SSL certificate thanks to openssl. I have server keys and clients key.
I've configurate my gateway this way gateway.config.yml
:
http:
port: 8000
https:
port: 9443
hostname: localhost
tls:
"default":
key: ‘path/to/server.key'
cert: 'path/to/server.crt'
admin:
port: 9876
host: localhost
apiEndpoints:
api:
host: '*'
paths: '/ip'
test:
host: '*'
paths: ['/test', '/test/*']
voice:
host: '*'
paths: ['/voices', '/voices/*']
serviceEndpoints:
httpbin:
url: 'https://httpbin.org'
testService:
url: 'http://localhost:6969'
voiceService:
url: 'http://localhost:6965'
policies:
- basic-auth
- cors
- expression
- key-auth
- log
- oauth2
- proxy
- rate-limit
pipelines:
default:
apiEndpoints:
- api
policies:
- proxy:
- action:
serviceEndpoint: httpbin
changeOrigin: true
testPipeline:
apiEndpoints:
- test
policies:
- proxy:
- action:
serviceEndpoint: testService
changeOrigin: true
voicePipeline:
apiEndpoints:
- voice
policies:
- proxy:
- action:
serviceEndpoint: voiceService
changeOrigin: true
and here is my voice-service.js
:
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const middleware = require('./middleware/index');
const firebase = require('./config/firebase-config');
const { spawn, execSync } = require('child_process');
const fs = require('fs');
const app = express();
const port = 6965;
var jsonParser = bodyParser.json();
app.use(express.json({limit: '100mb'}));
app.use(cors());
app.use(middleware.decodeToken);
app.get('/', (req, res) => {
res.send('Welcome to the Voice API');
})
app.get('/voices', async (req, res) => {
...
});
app.post('/voices', jsonParser, async (req, res) => {
...
});
app.delete('/voices', async (req, res) => {
...
});
app.listen(port, () => {
console.log(`server is running on port ${port}`);
});
My API use firebase bearers tokens and have a middleware to check it validity middleware.js
:
const admin = require('../config/firebase-config');
class Middleware {
async decodeToken(req, res, next) {
try {
const token = req.headers.authorization.split(' ')[1];
const decodeValue = await admin.admin.auth().verifyIdToken(token);
if (decodeValue)
return next();
return res.json({ message: 'Invalid Token' });
} catch (e) {
return res.json({ message: 'Invalid Token' });
}
}
}
module.exports = new Middleware();
When I tried to test https, I tried with Postman. I added my client ssl key into it and a valid bearer token. I tried to get the 'voices/' route. With http method it's working fine, but with https it's always result timeout.
Could anyone help me? I tried to be as exhaustive as I can but if you need more informations, ask it!
After a lot of investigations, it turns out I simply forgot to open my port. This project is self hosted.
I also need to change gateway.config.yml
https part :
https:
port: 9443
hostname: localhost
tls:
"default":
key: ‘path/to/server.key'
cert: 'path/to/server.crt'