Skip to content

Commit 0b89fd9

Browse files
feat: allow to use ca, pfx, key and cert as string (#1542)
1 parent 4bf1f76 commit 0b89fd9

File tree

8 files changed

+155
-24
lines changed

8 files changed

+155
-24
lines changed

bin/webpack-dev-server.js

-24
Original file line numberDiff line numberDiff line change
@@ -237,30 +237,6 @@ function processOptions (config) {
237237
options.https = true;
238238
}
239239

240-
if (argv.cert) {
241-
options.cert = fs.readFileSync(
242-
path.resolve(argv.cert)
243-
);
244-
}
245-
246-
if (argv.key) {
247-
options.key = fs.readFileSync(
248-
path.resolve(argv.key)
249-
);
250-
}
251-
252-
if (argv.cacert) {
253-
options.ca = fs.readFileSync(
254-
path.resolve(argv.cacert)
255-
);
256-
}
257-
258-
if (argv.pfx) {
259-
options.pfx = fs.readFileSync(
260-
path.resolve(argv.pfx)
261-
);
262-
}
263-
264240
if (argv['pfx-passphrase']) {
265241
options.pfxPassphrase = argv['pfx-passphrase'];
266242
}

lib/Server.js

+9
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,15 @@ function Server (compiler, options = {}, _log) {
553553
};
554554
}
555555

556+
for (const property of ['ca', 'pfx', 'key', 'cert']) {
557+
const value = options.https[property];
558+
const isBuffer = value instanceof Buffer;
559+
560+
if (value && !isBuffer && fs.lstatSync(value).isFile()) {
561+
options.https[property] = fs.readFileSync(path.resolve(value));
562+
}
563+
}
564+
556565
let fakeCert;
557566

558567
if (!options.https.key || !options.https.cert) {

test/Https.test.js

+44
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
'use strict';
22

33
const path = require('path');
4+
const fs = require('fs');
45
const request = require('supertest');
56
const helper = require('./helper');
67
const config = require('./fixtures/contentbase-config/webpack.config');
78
require('mocha-sinon');
89

10+
const httpsCertificateDirectory = path.join(__dirname, 'fixtures/https-certificate');
911
const contentBasePublic = path.join(__dirname, 'fixtures/contentbase-config/public');
1012

1113
describe('HTTPS', function testHttps() {
@@ -30,4 +32,46 @@ describe('HTTPS', function testHttps() {
3032
.expect(200, /Heyo/, done);
3133
});
3234
});
35+
36+
describe('ca, pfx, key and cert are buffer', () => {
37+
before((done) => {
38+
server = helper.start(config, {
39+
contentBase: contentBasePublic,
40+
https: {
41+
ca: fs.readFileSync(path.join(httpsCertificateDirectory, 'ca.pem')),
42+
pfx: fs.readFileSync(path.join(httpsCertificateDirectory, 'server.pfx')),
43+
key: fs.readFileSync(path.join(httpsCertificateDirectory, 'server.key')),
44+
cert: fs.readFileSync(path.join(httpsCertificateDirectory, 'server.crt')),
45+
passphrase: 'webpack-dev-server'
46+
}
47+
}, done);
48+
req = request(server.app);
49+
});
50+
51+
it('Request to index', (done) => {
52+
req.get('/')
53+
.expect(200, /Heyo/, done);
54+
});
55+
});
56+
57+
describe('ca, pfx, key and cert are string', () => {
58+
before((done) => {
59+
server = helper.start(config, {
60+
contentBase: contentBasePublic,
61+
https: {
62+
ca: path.join(httpsCertificateDirectory, 'ca.pem'),
63+
pfx: path.join(httpsCertificateDirectory, 'server.pfx'),
64+
key: path.join(httpsCertificateDirectory, 'server.key'),
65+
cert: path.join(httpsCertificateDirectory, 'server.crt'),
66+
passphrase: 'webpack-dev-server'
67+
}
68+
}, done);
69+
req = request(server.app);
70+
});
71+
72+
it('Request to index', (done) => {
73+
req.get('/')
74+
.expect(200, /Heyo/, done);
75+
});
76+
});
3377
});

test/cli.test.js

+26
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ const path = require('path');
88
const execa = require('execa');
99
const runDevServer = require('./helpers/run-webpack-dev-server');
1010

11+
const httpsCertificateDirectory = path.join(__dirname, 'fixtures/https-certificate');
12+
const caPath = path.join(httpsCertificateDirectory, 'ca.pem');
13+
const pfxPath = path.join(httpsCertificateDirectory, 'server.pfx');
14+
const keyPath = path.join(httpsCertificateDirectory, 'server.key');
15+
const certPath = path.join(httpsCertificateDirectory, 'server.crt');
16+
1117
describe('CLI', () => {
1218
it('--progress', (done) => {
1319
runDevServer('--progress')
@@ -19,6 +25,26 @@ describe('CLI', () => {
1925
.catch(done);
2026
}).timeout(18000);
2127

28+
it('--https', (done) => {
29+
runDevServer('--https')
30+
.then((output) => {
31+
assert(output.code === 0);
32+
assert(output.stdout.indexOf('Project is running at') >= 0);
33+
done();
34+
})
35+
.catch(done);
36+
}).timeout(18000);
37+
38+
it('--https --cacert --pfx --key --cert --pfx-passphrase', (done) => {
39+
runDevServer(`--https --cacert ${caPath} --pfx ${pfxPath} --key ${keyPath} --cert ${certPath} --pfx-passphrase webpack-dev-server`)
40+
.then((output) => {
41+
assert(output.code === 0);
42+
assert(output.stdout.indexOf('Project is running at') >= 0);
43+
done();
44+
})
45+
.catch(done);
46+
}).timeout(18000);
47+
2248
it('should exit the process when SIGINT is detected', (done) => {
2349
const cliPath = path.resolve(__dirname, '../bin/webpack-dev-server.js');
2450
const examplePath = path.resolve(__dirname, '../examples/cli/public');
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpQIBAAKCAQEAxAUVLFM+K3XDLQkBi7xt0s1Ip7JoHYDskzUDQNHjjMkUq5kv
3+
C/hf5Ei1J6qruJs3Xqg86Nl4+ed4ynUajAkRRibhp0P1SG1tgPssIK6iC7g8heYu
4+
Dy9WkFuMie0513zjSn6bMEAK5TegxYAWCbaCZX/Fw9bDniabL/zuOv4sf8J4EPhs
5+
EENnH6sUE9HxPUgQmNt1Tbd0j1Cd5PXrSTLyfVPRh0m9QhXTUHuxsse8XSn9U2sw
6+
duxJTWRINmhffYn+O7kbJGI77xYr8u58Rsf3HCMI8DTKZNvQLChvvtLJ9ckyu7Q+
7+
T8emgklStASm3V2UtnriaK/IQEhgSdxqVRib3QIDAQABAoIBAGqWKPE1QnT3T+3J
8+
G+ITz9P0dDFbvWltlTZmeSJh/s2q+WZloUNtBxdmwbqT/1QecnkyGgyzVCjvSKsu
9+
CgVjWNVAhysgtNtxRT4BVflffBXLVH2qsBjpsLRGU6EcMXuPGTiEp3YRHNuO6Aj8
10+
oP8fEsCGPc9DlJMGgxQRAKlrVF8TN/0j6Qk+YpS4MZ0YFQfBY+WdKu04Z8TVTplQ
11+
tTkiGpBI+Oj85jF59aQiizglJgADkAZ6zmbrctm/G9jPxh7JLS2cKI0ECZgK5yAc
12+
pk10E1YWhoCksjr9arxy6fS9TiX9P15vv06k+s7c4c5X7XDm3X0GWeSbqBMJb8q7
13+
BhZQNzECgYEA4kAtymDBvFYiZFq7+lzQBRKAI1RCq7YqxlieumH0PSkie2bba3dW
14+
NVdTi7at8+GDB9/cHUPKzg/skfJllek57MZmusiVwB/Lmp/IlW8YyGShdYZ7zQsV
15+
KMWJljpky3BEDM5sb08wIkfrOkelI/S4Bqqabd9JzOMJzoTiVOlMam8CgYEA3ctN
16+
yonWz2bsnCUstQvQCLdI5a8Q7GJvlH2awephxGXIKGUuRmyyop0AnRnIBEWtOQV7
17+
yZjW32bU+Wt+2BJ247EyJiIQ4gT+T51t+v/Wt1YNbL3dSj9ttOvwYd4H2W4E7EIO
18+
GKIF4I39FM7r8NfG7YE7S1aVcnrqs01N3nhd9HMCgYEAjepbzpmqbAxLPk97oase
19+
AFB+d6qetz5ozklAJwDSRprKukTmVR5hwMup5/UKX/OQURwl4WVojKCIb3NwLPxC
20+
DTbVsUuoQv6uo6qeEr3A+dHFRQa6GP9eolhl2Ql/t+wPg0jn01oEgzxBXCkceNVD
21+
qUrR2yE4FYBD4nqPzVsZR5kCgYEA1yTi7NkQeldIpZ6Z43T18753A/Xx4JsLyWqd
22+
uAT3mV9x7V1Yqg++qGbLtZjQoPRFt85N6ZxMsqA5b0iK3mXq1auJDdx1rAlT9z6q
23+
9JM/YNAkbZsvEVq9vIYxw31w98T1GYhpzBM+yDhzir+9tv5YhQKa1dXDWi1JhWwz
24+
YN45pWkCgYEAxuVsJ4D4Th5o050ppWpnxM/WuMhIUKqaoFTVucMKFzn+g24y9pv5
25+
miYdNYIk4Y+4pzHG6ZGZSHJcQ9BLui6H/nLQnqkgCb2lT5nfp7/GKdus7BdcjPGs
26+
fcV46yL7/X0m8nDb3hkwwrDTU4mKFkMrzKpjdZBsttEmW0Aw/3y36gU=
27+
-----END RSA PRIVATE KEY-----
+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDXTCCAkWgAwIBAgIJALz8gD/gAt0OMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
3+
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
4+
aWRnaXRzIFB0eSBMdGQwHhcNMTgxMDIzMTgyMTQ5WhcNMTkxMDIzMTgyMTQ5WjBF
5+
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
6+
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
7+
CgKCAQEAxAUVLFM+K3XDLQkBi7xt0s1Ip7JoHYDskzUDQNHjjMkUq5kvC/hf5Ei1
8+
J6qruJs3Xqg86Nl4+ed4ynUajAkRRibhp0P1SG1tgPssIK6iC7g8heYuDy9WkFuM
9+
ie0513zjSn6bMEAK5TegxYAWCbaCZX/Fw9bDniabL/zuOv4sf8J4EPhsEENnH6sU
10+
E9HxPUgQmNt1Tbd0j1Cd5PXrSTLyfVPRh0m9QhXTUHuxsse8XSn9U2swduxJTWRI
11+
NmhffYn+O7kbJGI77xYr8u58Rsf3HCMI8DTKZNvQLChvvtLJ9ckyu7Q+T8emgklS
12+
tASm3V2UtnriaK/IQEhgSdxqVRib3QIDAQABo1AwTjAdBgNVHQ4EFgQUDZBhVKdb
13+
3BRhLIhuuE522Vsul0IwHwYDVR0jBBgwFoAUDZBhVKdb3BRhLIhuuE522Vsul0Iw
14+
DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEABh9WWZwWLgb9/DcTxL72
15+
6pI96t4jiF79Q+pPefkaIIi0mE6yodWrTAsBQu9I6bNRaEcCSoiXkP2bqskD/UGg
16+
LwUFgSrDOAA3UjdHw3QU5g2NocduG7mcFwA40TB98sOsxsUyYlzSyWzoiQWwPYwb
17+
hek1djuWkqPXsTjlj54PTPN/SjTFmo4p5Ip6nbRf2nOREl7v0rJpGbJvXiCMYyd+
18+
Zv+j4mRjCGo8ysMR2HjCUGkYReLAgKyyz3M7i8vevJhKslyOmy6Txn4F0nPVumaU
19+
DDIy4xXPW1STWfsmSYJfYW3wa0wk+pJQ3j2cTzkPQQ8gwpvM3U9DJl43uwb37v6I
20+
7Q==
21+
-----END CERTIFICATE-----
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDEBRUsUz4rdcMt
3+
CQGLvG3SzUinsmgdgOyTNQNA0eOMyRSrmS8L+F/kSLUnqqu4mzdeqDzo2Xj553jK
4+
dRqMCRFGJuGnQ/VIbW2A+ywgrqILuDyF5i4PL1aQW4yJ7TnXfONKfpswQArlN6DF
5+
gBYJtoJlf8XD1sOeJpsv/O46/ix/wngQ+GwQQ2cfqxQT0fE9SBCY23VNt3SPUJ3k
6+
9etJMvJ9U9GHSb1CFdNQe7Gyx7xdKf1TazB27ElNZEg2aF99if47uRskYjvvFivy
7+
7nxGx/ccIwjwNMpk29AsKG++0sn1yTK7tD5Px6aCSVK0BKbdXZS2euJor8hASGBJ
8+
3GpVGJvdAgMBAAECggEAapYo8TVCdPdP7ckb4hPP0/R0MVu9aW2VNmZ5ImH+zar5
9+
ZmWhQ20HF2bBupP/VB5yeTIaDLNUKO9Iqy4KBWNY1UCHKyC023FFPgFV+V98FctU
10+
faqwGOmwtEZToRwxe48ZOISndhEc247oCPyg/x8SwIY9z0OUkwaDFBEAqWtUXxM3
11+
/SPpCT5ilLgxnRgVB8Fj5Z0q7ThnxNVOmVC1OSIakEj46PzmMXn1pCKLOCUmAAOQ
12+
BnrOZuty2b8b2M/GHsktLZwojQQJmArnIBymTXQTVhaGgKSyOv1qvHLp9L1OJf0/
13+
Xm+/TqT6ztzhzlftcObdfQZZ5JuoEwlvyrsGFlA3MQKBgQDiQC3KYMG8ViJkWrv6
14+
XNAFEoAjVEKrtirGWJ66YfQ9KSJ7Zttrd1Y1V1OLtq3z4YMH39wdQ8rOD+yR8mWV
15+
6Tnsxma6yJXAH8uan8iVbxjIZKF1hnvNCxUoxYmWOmTLcEQMzmxvTzAiR+s6R6Uj
16+
9LgGqppt30nM4wnOhOJU6UxqbwKBgQDdy03KidbPZuycJSy1C9AIt0jlrxDsYm+U
17+
fZrB6mHEZcgoZS5GbLKinQCdGcgERa05BXvJmNbfZtT5a37YEnbjsTImIhDiBP5P
18+
nW36/9a3Vg1svd1KP2206/Bh3gfZbgTsQg4YogXgjf0Uzuvw18btgTtLVpVyeuqz
19+
TU3eeF30cwKBgQCN6lvOmapsDEs+T3uhqx4AUH53qp63PmjOSUAnANJGmsq6ROZV
20+
HmHAy6nn9Qpf85BRHCXhZWiMoIhvc3As/EINNtWxS6hC/q6jqp4SvcD50cVFBroY
21+
/16iWGXZCX+37A+DSOfTWgSDPEFcKRx41UOpStHbITgVgEPieo/NWxlHmQKBgQDX
22+
JOLs2RB6V0ilnpnjdPXzvncD9fHgmwvJap24BPeZX3HtXViqD76oZsu1mNCg9EW3
23+
zk3pnEyyoDlvSIreZerVq4kN3HWsCVP3Pqr0kz9g0CRtmy8RWr28hjHDfXD3xPUZ
24+
iGnMEz7IOHOKv722/liFAprV1cNaLUmFbDNg3jmlaQKBgQDG5WwngPhOHmjTnSml
25+
amfEz9a4yEhQqpqgVNW5wwoXOf6DbjL2m/maJh01giThj7inMcbpkZlIclxD0Eu6
26+
Lof+ctCeqSAJvaVPmd+nv8Yp26zsF1yM8ax9xXjrIvv9fSbycNveGTDCsNNTiYoW
27+
QyvMqmN1kGy20SZbQDD/fLfqBQ==
28+
-----END PRIVATE KEY-----
2.41 KB
Binary file not shown.

0 commit comments

Comments
 (0)