Skip to content

Commit dbdfc89

Browse files
authored
feat(staticserver): add option for use ssl into the static server (#293)
* feat(staticserver): add option for use ssl into the static server * feat(staticserver): add support for sslkey & sslcert file * feat(ssl): add certs for test
1 parent 613dcc7 commit dbdfc89

8 files changed

Lines changed: 166 additions & 9 deletions

File tree

certs/localhost.cert

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIC+zCCAeOgAwIBAgIJAKAmYVmZlyC9MA0GCSqGSIb3DQEBBQUAMBQxEjAQBgNV
3+
BAMMCWxvY2FsaG9zdDAeFw0yMDAyMTIxNTIxMjZaFw0zMDAyMDkxNTIxMjZaMBQx
4+
EjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
5+
ggEBANV/ouk9E2EIBrgN94Y8G6zqjFNNkKYUbB4HdSL/B3eGn1Jkk12XrGQ0af29
6+
WgS5NqKQSXEUDCQexePB8umISGgvhl/JZgzwPIAXGdRj5yLzsCI7jNmrmVHuEpxP
7+
ko6wUID/B76diuGP8RbXtKYlo9qygeHwP28u7Ov+BVQpZsi+Y6XXRwk+JVI+DGdn
8+
fNAkxH1LzSisIAq2xhvRuMIOyBXKuQyhIuXXGcKzmzcZBKodXCrTjiTe7vLySNKw
9+
dwlf0ouCoEQ3JRe5NPG2IR9vRoYw55V6eUszlNGJ9dMeL+8jQ5NKmYUVnZNRuRYe
10+
tWgkkUWKiuA1I1FCVpwUo/D0xsECAwEAAaNQME4wHQYDVR0OBBYEFNDjpi787A7T
11+
zP9Zt0FCeQI2C/vWMB8GA1UdIwQYMBaAFNDjpi787A7TzP9Zt0FCeQI2C/vWMAwG
12+
A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAMiRnVETWJecn/EOnY/0yvrf
13+
A5A1gVYJmOlhu1iLt73xDdAhwDw1FJjb0fbkqABMUmEc5VU2vMB9FTscggU2DrRu
14+
oO73qY3Q7FTo52IH3cYfpIjmV9EN4WbRfHjxVEcvkg+W4UoURebHyJFdAfIORE/8
15+
Y3XBB23lhAgBFiy8H/J5lFFmwRHFiQQpyQ2yE8ok7cKkcsagjnYAthY++OFCaL6D
16+
hTj3dV24Y1p5T2226wYbz34Z0QfnypiW3KGSXMv95ft+2OlVuMTn3CzXyxkgc2fd
17+
YEw3RdI98UosSfYoH3dxvbyFQqKuotaJmTy7BGvTrMs5N9K7fZvf+JJVyCXcKJA=
18+
-----END CERTIFICATE-----

certs/localhost.key

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpQIBAAKCAQEA1X+i6T0TYQgGuA33hjwbrOqMU02QphRsHgd1Iv8Hd4afUmST
3+
XZesZDRp/b1aBLk2opBJcRQMJB7F48Hy6YhIaC+GX8lmDPA8gBcZ1GPnIvOwIjuM
4+
2auZUe4SnE+SjrBQgP8Hvp2K4Y/xFte0piWj2rKB4fA/by7s6/4FVClmyL5jpddH
5+
CT4lUj4MZ2d80CTEfUvNKKwgCrbGG9G4wg7IFcq5DKEi5dcZwrObNxkEqh1cKtOO
6+
JN7u8vJI0rB3CV/Si4KgRDclF7k08bYhH29GhjDnlXp5SzOU0Yn10x4v7yNDk0qZ
7+
hRWdk1G5Fh61aCSRRYqK4DUjUUJWnBSj8PTGwQIDAQABAoIBAFoDUT1DCducFbEd
8+
+mE3EHgL/5PTnQvYimjyvfk+Svii4qNLUjJgk0dALfvUDJL3P8i0SrKJQEEuVEKd
9+
b/v0AIsklmPmNsd3thpPIw2//SBoW7djIhRX2/GGDYSnq+PLBHYOkEZWh8pn9L6r
10+
vTdboUTAhDAtKaGHyE4LMFX2iqZRkTJ1lpjbvGEI8O6gfK0KmDbNtOyWbxxpLMl/
11+
V9kGzsfDr6hTtWHnwM4m4twDPMGlJJhq4FxpICurOFFxea/bJUnBvXFr3wCwzc36
12+
GsL07LBtqePnFGlClkEYENXFjG3rbEOWsyVoA0Hn2g99aW8LwaHhrqYZNUe2PRYL
13+
cjQn3j0CgYEA/wM8uyBTJTtqi1Mbkkn1oOLpCmMYmJock+tZDBMIfhfrV6e3SDXr
14+
/qgPTXYtcA3n4xW+PZpAwPbeFE9GyL6BbZJFCPLUlRBAVZX30tPLSf48V19a8UQW
15+
icHb8YLJ4UwaqOZndb2vyFYFUBL/Zb07RgS0oEx2p9dj6B4UQUp77V8CgYEA1lNA
16+
V6a+nBg45BRPqmWBDrT3ua4dNYeh4lZ03QsX9+Yc57VImbJ0qlT3so6oLhqTFXg5
17+
Io6NDXdyjOBXnOrnY61qelqqY8/F5ZFjaOdjLA6Zg36hiMjMIKkrWDWfyXLij4LO
18+
YSPElrrDdLhNrHrOTuEUUfUhHREfrWOswe9Nn98CgYEAxBzZN49EYf2vkjX3nikC
19+
nRfj3/kVkUXzdE4pzP9WKKJ8eoyghwfw1YapPgkEKIiJLDosc3ONGNjBMR1GclsP
20+
bhRuwtL8aSZ2U1thmuEGFYFPJmJOrfyO2KIdYz4RwxGj7wBB0GpwJMEClPIHN1av
21+
nsk/n4cuOSWLz5ZSPWPqqkECgYEArBEEXBpjdyA/NGVWHCAHv83sAGdXze0JO5Rb
22+
mEbaxEw7Mo8pLTPHVCSJBBJh1TnCkf8GJ8c4WPJnxdAqprE0eaL1FCwMFbvuTkMu
23+
Az+ZL/q8poQYnZ9Punz2bogGs42HdN34YKZ9ouFoICIDQhEJ5uvvC2l4X0SrIOIg
24+
BUbhFBMCgYEAwSLgj8dWwwpjOBj2PMAVqPq3O0+SKXPXy5FGFfMi+g0sViCudBSe
25+
QNJpMhHgYeWc+jcqtryQG6lmSSfq4l3A1+ZGDWMwgsg0vkk4O1U9PqkCnzjMeLsd
26+
kvJ0GnJW77//DANnjNSIzp0Eg61QEaQrGMziCSS/ARv8+MHcKQjCzrM=
27+
-----END RSA PRIVATE KEY-----

docs/scully-cmd-line.md

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ Scully CLI has the following options available:
1111
- [project](#project)
1212
- [baseFilter](#basefilter)
1313
- [removeStaticDist](#removestaticdist)
14-
- [open](#openNavigator)
14+
- [open](#open)
15+
- [ssl](#ssl)
16+
- [ssl-cert](#ssl-cert)
17+
- [ssl-key](#ssl-key)
1518

1619
## serve
1720

@@ -76,3 +79,27 @@ npx scully serve/watch --open
7679
```
7780

7881
Alias `--o`. Open the default browser and show the scully dist.
82+
83+
## ssl
84+
85+
```bash
86+
npx scully serve/watch --ssl
87+
```
88+
89+
Run the scully server with ssl.
90+
91+
## ssl-cert
92+
93+
```bash
94+
npx scully serve/watch --ssl --ssl-cert=./url/to/file
95+
```
96+
97+
Add url to ssl cert file for SSL server
98+
99+
## ssl-key
100+
101+
```bash
102+
npx scully serve/watch --ssl --ssl-key=./url/to/file
103+
```
104+
105+
Add url to ssl key file for SSL server

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
"scully:publish:patch": "cd ./scully && tsc -p ./tsconfig.scully.json && npm version patch && cp ./package.json ../dist/scully &&cp ./readme.md ../dist/scully && cd ../dist/scully && npm publish --access=public",
2222
"scully:publish:minor": "tsc -p ./tsconfig.scully.json && npm version minor",
2323
"scully:publish:major": "tsc -p ./tsconfig.scully.json && npm version major",
24+
"scully:test:ssl:self": "npm run generate -- serve --ssl",
25+
"scully:test:ssl:file": "npm run generate -- serve --ssl --ssl-cert=./certs/localhost.cert --ssl-key=./certs/localhost.key",
2426
"commit": "git add . && npx git-cz",
2527
"commit:select": "npx git-cz",
2628
"build-bazel": "bazel build //...",

scully/package-lock.json

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scully/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
"puppeteer": "^2.0.0",
2424
"yamljs": "^0.3.0",
2525
"yargs": "^14.2.0",
26-
"open": "^7.0.2"
26+
"open": "^7.0.2",
27+
"selfsigned": "^1.10.7"
2728
},
2829
"author": "@herodevs",
2930
"license": "MIT",

scully/utils/cli-options.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,20 @@ export const {openNavigator} = yargs
2424
.alias('o', 'openNavigator')
2525
.alias('open', 'openNavigator')
2626
.describe('o', 'Use this flag for open the browser with the serve').argv;
27+
28+
export const {ssl} = yargs
29+
.boolean('ssl')
30+
.default('ssl', false)
31+
.describe('ssl', 'Add self ssl into the server').argv;
32+
33+
export const {sslKey} = yargs
34+
.string('sslKey')
35+
.default('sslKey', undefined)
36+
.alias('ssl-key', 'sslKey')
37+
.describe('sslKey', 'Add ssl-key into the server').argv;
38+
39+
export const {sslCert} = yargs
40+
.string('sslCert')
41+
.default('sslCert', undefined)
42+
.alias('ssl-cert', 'sslCert')
43+
.describe('sslCert', 'Add ssl-cert into the server').argv;

scully/utils/staticServer.ts

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
import {join} from 'path';
22
import {traverseAppRoutes} from '../routerPlugins/traverseAppRoutesPlugin';
33
import {scullyConfig} from './config';
4-
import {log, logError, yellow} from './log';
4+
import {log, logError, red, yellow} from './log';
5+
import {ssl, sslCert, sslKey} from '../utils/cli-options';
6+
import {readFileSync} from 'fs';
7+
58
const express = require('express');
9+
const https = require('https');
10+
const selfsigned = require('selfsigned');
611

712
let angularServerInstance: {close: () => void};
813
let scullyServerInstance: {close: () => void};
14+
let httpsServer;
915

1016
export async function staticServer(port?: number) {
1117
try {
@@ -29,13 +35,56 @@ export async function staticServer(port?: number) {
2935
scullyServer.use(express.static(scullyConfig.outDir, options));
3036
scullyServer.get('/', (req, res) => res.sendFile(join(distFolder, '/index.html')));
3137

32-
scullyServerInstance = scullyServer.listen(port, scullyConfig.hostName, x => {
33-
log(
34-
`Scully static server started on "${yellow(
35-
`http://${scullyConfig.hostName}:${scullyConfig.staticport}/`
36-
)}"`
38+
if (!ssl) {
39+
scullyServerInstance = scullyServer.listen(port, scullyConfig.hostName, x => {
40+
log(
41+
`Scully static server started on "${yellow(
42+
`http://${scullyConfig.hostName}:${scullyConfig.staticport}/`
43+
)}"`
44+
);
45+
});
46+
} else {
47+
let pems = {
48+
private: '',
49+
cert: '',
50+
};
51+
if (sslCert && sslKey) {
52+
try {
53+
pems.private = readFileSync(sslKey).toString();
54+
pems.cert = readFileSync(sslCert).toString();
55+
} catch (e) {
56+
logError(`Could not read the file: ${e.path}`);
57+
log(`${yellow(`Please check the path for the certificate.`)}`);
58+
process.exit(0);
59+
}
60+
} else {
61+
const attrs = [
62+
{
63+
name: 'scully',
64+
value: `${scullyConfig.hostName}:${scullyConfig.staticport}`,
65+
type: 'RSAPublicKey',
66+
},
67+
];
68+
pems = selfsigned.generate(attrs, {days: 365});
69+
console.log(pems);
70+
}
71+
// serve the API with signed certificate on 443 (SSL/HTTPS) port
72+
httpsServer = https.createServer(
73+
{
74+
key: pems.private,
75+
cert: pems.cert,
76+
},
77+
scullyServer
3778
);
38-
});
79+
80+
httpsServer.listen(port, () => {
81+
log(
82+
`Scully static server started on "${yellow(
83+
`https://${scullyConfig.hostName}:${scullyConfig.staticport}/`
84+
)}"`
85+
);
86+
});
87+
}
3988

4089
const angularDistServer = express();
4190
angularDistServer.get('/_pong', (req, res) => {
@@ -79,4 +128,7 @@ export function closeExpress() {
79128
if (angularServerInstance && angularServerInstance.close) {
80129
angularServerInstance.close();
81130
}
131+
if (httpsServer) {
132+
httpsServer.close();
133+
}
82134
}

0 commit comments

Comments
 (0)