diff --git a/bin/webpack-dev-server.js b/bin/webpack-dev-server.js index d58daf2954..a58a86564a 100755 --- a/bin/webpack-dev-server.js +++ b/bin/webpack-dev-server.js @@ -237,30 +237,6 @@ function processOptions (config) { options.https = true; } - if (argv.cert) { - options.cert = fs.readFileSync( - path.resolve(argv.cert) - ); - } - - if (argv.key) { - options.key = fs.readFileSync( - path.resolve(argv.key) - ); - } - - if (argv.cacert) { - options.ca = fs.readFileSync( - path.resolve(argv.cacert) - ); - } - - if (argv.pfx) { - options.pfx = fs.readFileSync( - path.resolve(argv.pfx) - ); - } - if (argv['pfx-passphrase']) { options.pfxPassphrase = argv['pfx-passphrase']; } diff --git a/lib/Server.js b/lib/Server.js index 5c4cb42203..a5d17bf3b6 100644 --- a/lib/Server.js +++ b/lib/Server.js @@ -553,6 +553,15 @@ function Server (compiler, options = {}, _log) { }; } + for (const property of ['ca', 'pfx', 'key', 'cert']) { + const value = options.https[property]; + const isBuffer = value instanceof Buffer; + + if (value && !isBuffer && fs.lstatSync(value).isFile()) { + options.https[property] = fs.readFileSync(path.resolve(value)); + } + } + let fakeCert; if (!options.https.key || !options.https.cert) { diff --git a/test/Https.test.js b/test/Https.test.js index a0822ae147..8b32cb739f 100644 --- a/test/Https.test.js +++ b/test/Https.test.js @@ -1,11 +1,13 @@ 'use strict'; const path = require('path'); +const fs = require('fs'); const request = require('supertest'); const helper = require('./helper'); const config = require('./fixtures/contentbase-config/webpack.config'); require('mocha-sinon'); +const httpsCertificateDirectory = path.join(__dirname, 'fixtures/https-certificate'); const contentBasePublic = path.join(__dirname, 'fixtures/contentbase-config/public'); describe('HTTPS', function testHttps() { @@ -30,4 +32,46 @@ describe('HTTPS', function testHttps() { .expect(200, /Heyo/, done); }); }); + + describe('ca, pfx, key and cert are buffer', () => { + before((done) => { + server = helper.start(config, { + contentBase: contentBasePublic, + https: { + ca: fs.readFileSync(path.join(httpsCertificateDirectory, 'ca.pem')), + pfx: fs.readFileSync(path.join(httpsCertificateDirectory, 'server.pfx')), + key: fs.readFileSync(path.join(httpsCertificateDirectory, 'server.key')), + cert: fs.readFileSync(path.join(httpsCertificateDirectory, 'server.crt')), + passphrase: 'webpack-dev-server' + } + }, done); + req = request(server.app); + }); + + it('Request to index', (done) => { + req.get('/') + .expect(200, /Heyo/, done); + }); + }); + + describe('ca, pfx, key and cert are string', () => { + before((done) => { + server = helper.start(config, { + contentBase: contentBasePublic, + https: { + ca: path.join(httpsCertificateDirectory, 'ca.pem'), + pfx: path.join(httpsCertificateDirectory, 'server.pfx'), + key: path.join(httpsCertificateDirectory, 'server.key'), + cert: path.join(httpsCertificateDirectory, 'server.crt'), + passphrase: 'webpack-dev-server' + } + }, done); + req = request(server.app); + }); + + it('Request to index', (done) => { + req.get('/') + .expect(200, /Heyo/, done); + }); + }); }); diff --git a/test/cli.test.js b/test/cli.test.js index b4a7a10e5e..ad6a7d3f74 100644 --- a/test/cli.test.js +++ b/test/cli.test.js @@ -8,6 +8,12 @@ const path = require('path'); const execa = require('execa'); const runDevServer = require('./helpers/run-webpack-dev-server'); +const httpsCertificateDirectory = path.join(__dirname, 'fixtures/https-certificate'); +const caPath = path.join(httpsCertificateDirectory, 'ca.pem'); +const pfxPath = path.join(httpsCertificateDirectory, 'server.pfx'); +const keyPath = path.join(httpsCertificateDirectory, 'server.key'); +const certPath = path.join(httpsCertificateDirectory, 'server.crt'); + describe('CLI', () => { it('--progress', (done) => { runDevServer('--progress') @@ -19,6 +25,26 @@ describe('CLI', () => { .catch(done); }).timeout(18000); + it('--https', (done) => { + runDevServer('--https') + .then((output) => { + assert(output.code === 0); + assert(output.stdout.indexOf('Project is running at') >= 0); + done(); + }) + .catch(done); + }).timeout(18000); + + it('--https --cacert --pfx --key --cert --pfx-passphrase', (done) => { + runDevServer(`--https --cacert ${caPath} --pfx ${pfxPath} --key ${keyPath} --cert ${certPath} --pfx-passphrase webpack-dev-server`) + .then((output) => { + assert(output.code === 0); + assert(output.stdout.indexOf('Project is running at') >= 0); + done(); + }) + .catch(done); + }).timeout(18000); + it('should exit the process when SIGINT is detected', (done) => { const cliPath = path.resolve(__dirname, '../bin/webpack-dev-server.js'); const examplePath = path.resolve(__dirname, '../examples/cli/public'); diff --git a/test/fixtures/https-certificate/ca.pem b/test/fixtures/https-certificate/ca.pem new file mode 100644 index 0000000000..05b314535b --- /dev/null +++ b/test/fixtures/https-certificate/ca.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEAxAUVLFM+K3XDLQkBi7xt0s1Ip7JoHYDskzUDQNHjjMkUq5kv +C/hf5Ei1J6qruJs3Xqg86Nl4+ed4ynUajAkRRibhp0P1SG1tgPssIK6iC7g8heYu +Dy9WkFuMie0513zjSn6bMEAK5TegxYAWCbaCZX/Fw9bDniabL/zuOv4sf8J4EPhs +EENnH6sUE9HxPUgQmNt1Tbd0j1Cd5PXrSTLyfVPRh0m9QhXTUHuxsse8XSn9U2sw +duxJTWRINmhffYn+O7kbJGI77xYr8u58Rsf3HCMI8DTKZNvQLChvvtLJ9ckyu7Q+ +T8emgklStASm3V2UtnriaK/IQEhgSdxqVRib3QIDAQABAoIBAGqWKPE1QnT3T+3J +G+ITz9P0dDFbvWltlTZmeSJh/s2q+WZloUNtBxdmwbqT/1QecnkyGgyzVCjvSKsu +CgVjWNVAhysgtNtxRT4BVflffBXLVH2qsBjpsLRGU6EcMXuPGTiEp3YRHNuO6Aj8 +oP8fEsCGPc9DlJMGgxQRAKlrVF8TN/0j6Qk+YpS4MZ0YFQfBY+WdKu04Z8TVTplQ +tTkiGpBI+Oj85jF59aQiizglJgADkAZ6zmbrctm/G9jPxh7JLS2cKI0ECZgK5yAc +pk10E1YWhoCksjr9arxy6fS9TiX9P15vv06k+s7c4c5X7XDm3X0GWeSbqBMJb8q7 +BhZQNzECgYEA4kAtymDBvFYiZFq7+lzQBRKAI1RCq7YqxlieumH0PSkie2bba3dW +NVdTi7at8+GDB9/cHUPKzg/skfJllek57MZmusiVwB/Lmp/IlW8YyGShdYZ7zQsV +KMWJljpky3BEDM5sb08wIkfrOkelI/S4Bqqabd9JzOMJzoTiVOlMam8CgYEA3ctN +yonWz2bsnCUstQvQCLdI5a8Q7GJvlH2awephxGXIKGUuRmyyop0AnRnIBEWtOQV7 +yZjW32bU+Wt+2BJ247EyJiIQ4gT+T51t+v/Wt1YNbL3dSj9ttOvwYd4H2W4E7EIO +GKIF4I39FM7r8NfG7YE7S1aVcnrqs01N3nhd9HMCgYEAjepbzpmqbAxLPk97oase +AFB+d6qetz5ozklAJwDSRprKukTmVR5hwMup5/UKX/OQURwl4WVojKCIb3NwLPxC +DTbVsUuoQv6uo6qeEr3A+dHFRQa6GP9eolhl2Ql/t+wPg0jn01oEgzxBXCkceNVD +qUrR2yE4FYBD4nqPzVsZR5kCgYEA1yTi7NkQeldIpZ6Z43T18753A/Xx4JsLyWqd +uAT3mV9x7V1Yqg++qGbLtZjQoPRFt85N6ZxMsqA5b0iK3mXq1auJDdx1rAlT9z6q +9JM/YNAkbZsvEVq9vIYxw31w98T1GYhpzBM+yDhzir+9tv5YhQKa1dXDWi1JhWwz +YN45pWkCgYEAxuVsJ4D4Th5o050ppWpnxM/WuMhIUKqaoFTVucMKFzn+g24y9pv5 +miYdNYIk4Y+4pzHG6ZGZSHJcQ9BLui6H/nLQnqkgCb2lT5nfp7/GKdus7BdcjPGs +fcV46yL7/X0m8nDb3hkwwrDTU4mKFkMrzKpjdZBsttEmW0Aw/3y36gU= +-----END RSA PRIVATE KEY----- diff --git a/test/fixtures/https-certificate/server.crt b/test/fixtures/https-certificate/server.crt new file mode 100644 index 0000000000..1992bb1610 --- /dev/null +++ b/test/fixtures/https-certificate/server.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDXTCCAkWgAwIBAgIJALz8gD/gAt0OMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMTgxMDIzMTgyMTQ5WhcNMTkxMDIzMTgyMTQ5WjBF +MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAxAUVLFM+K3XDLQkBi7xt0s1Ip7JoHYDskzUDQNHjjMkUq5kvC/hf5Ei1 +J6qruJs3Xqg86Nl4+ed4ynUajAkRRibhp0P1SG1tgPssIK6iC7g8heYuDy9WkFuM +ie0513zjSn6bMEAK5TegxYAWCbaCZX/Fw9bDniabL/zuOv4sf8J4EPhsEENnH6sU +E9HxPUgQmNt1Tbd0j1Cd5PXrSTLyfVPRh0m9QhXTUHuxsse8XSn9U2swduxJTWRI +NmhffYn+O7kbJGI77xYr8u58Rsf3HCMI8DTKZNvQLChvvtLJ9ckyu7Q+T8emgklS +tASm3V2UtnriaK/IQEhgSdxqVRib3QIDAQABo1AwTjAdBgNVHQ4EFgQUDZBhVKdb +3BRhLIhuuE522Vsul0IwHwYDVR0jBBgwFoAUDZBhVKdb3BRhLIhuuE522Vsul0Iw +DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEABh9WWZwWLgb9/DcTxL72 +6pI96t4jiF79Q+pPefkaIIi0mE6yodWrTAsBQu9I6bNRaEcCSoiXkP2bqskD/UGg +LwUFgSrDOAA3UjdHw3QU5g2NocduG7mcFwA40TB98sOsxsUyYlzSyWzoiQWwPYwb +hek1djuWkqPXsTjlj54PTPN/SjTFmo4p5Ip6nbRf2nOREl7v0rJpGbJvXiCMYyd+ +Zv+j4mRjCGo8ysMR2HjCUGkYReLAgKyyz3M7i8vevJhKslyOmy6Txn4F0nPVumaU +DDIy4xXPW1STWfsmSYJfYW3wa0wk+pJQ3j2cTzkPQQ8gwpvM3U9DJl43uwb37v6I +7Q== +-----END CERTIFICATE----- diff --git a/test/fixtures/https-certificate/server.key b/test/fixtures/https-certificate/server.key new file mode 100644 index 0000000000..c002d19e49 --- /dev/null +++ b/test/fixtures/https-certificate/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDEBRUsUz4rdcMt +CQGLvG3SzUinsmgdgOyTNQNA0eOMyRSrmS8L+F/kSLUnqqu4mzdeqDzo2Xj553jK +dRqMCRFGJuGnQ/VIbW2A+ywgrqILuDyF5i4PL1aQW4yJ7TnXfONKfpswQArlN6DF +gBYJtoJlf8XD1sOeJpsv/O46/ix/wngQ+GwQQ2cfqxQT0fE9SBCY23VNt3SPUJ3k +9etJMvJ9U9GHSb1CFdNQe7Gyx7xdKf1TazB27ElNZEg2aF99if47uRskYjvvFivy +7nxGx/ccIwjwNMpk29AsKG++0sn1yTK7tD5Px6aCSVK0BKbdXZS2euJor8hASGBJ +3GpVGJvdAgMBAAECggEAapYo8TVCdPdP7ckb4hPP0/R0MVu9aW2VNmZ5ImH+zar5 +ZmWhQ20HF2bBupP/VB5yeTIaDLNUKO9Iqy4KBWNY1UCHKyC023FFPgFV+V98FctU +faqwGOmwtEZToRwxe48ZOISndhEc247oCPyg/x8SwIY9z0OUkwaDFBEAqWtUXxM3 +/SPpCT5ilLgxnRgVB8Fj5Z0q7ThnxNVOmVC1OSIakEj46PzmMXn1pCKLOCUmAAOQ +BnrOZuty2b8b2M/GHsktLZwojQQJmArnIBymTXQTVhaGgKSyOv1qvHLp9L1OJf0/ +Xm+/TqT6ztzhzlftcObdfQZZ5JuoEwlvyrsGFlA3MQKBgQDiQC3KYMG8ViJkWrv6 +XNAFEoAjVEKrtirGWJ66YfQ9KSJ7Zttrd1Y1V1OLtq3z4YMH39wdQ8rOD+yR8mWV +6Tnsxma6yJXAH8uan8iVbxjIZKF1hnvNCxUoxYmWOmTLcEQMzmxvTzAiR+s6R6Uj +9LgGqppt30nM4wnOhOJU6UxqbwKBgQDdy03KidbPZuycJSy1C9AIt0jlrxDsYm+U +fZrB6mHEZcgoZS5GbLKinQCdGcgERa05BXvJmNbfZtT5a37YEnbjsTImIhDiBP5P +nW36/9a3Vg1svd1KP2206/Bh3gfZbgTsQg4YogXgjf0Uzuvw18btgTtLVpVyeuqz +TU3eeF30cwKBgQCN6lvOmapsDEs+T3uhqx4AUH53qp63PmjOSUAnANJGmsq6ROZV +HmHAy6nn9Qpf85BRHCXhZWiMoIhvc3As/EINNtWxS6hC/q6jqp4SvcD50cVFBroY +/16iWGXZCX+37A+DSOfTWgSDPEFcKRx41UOpStHbITgVgEPieo/NWxlHmQKBgQDX +JOLs2RB6V0ilnpnjdPXzvncD9fHgmwvJap24BPeZX3HtXViqD76oZsu1mNCg9EW3 +zk3pnEyyoDlvSIreZerVq4kN3HWsCVP3Pqr0kz9g0CRtmy8RWr28hjHDfXD3xPUZ +iGnMEz7IOHOKv722/liFAprV1cNaLUmFbDNg3jmlaQKBgQDG5WwngPhOHmjTnSml +amfEz9a4yEhQqpqgVNW5wwoXOf6DbjL2m/maJh01giThj7inMcbpkZlIclxD0Eu6 +Lof+ctCeqSAJvaVPmd+nv8Yp26zsF1yM8ax9xXjrIvv9fSbycNveGTDCsNNTiYoW +QyvMqmN1kGy20SZbQDD/fLfqBQ== +-----END PRIVATE KEY----- diff --git a/test/fixtures/https-certificate/server.pfx b/test/fixtures/https-certificate/server.pfx new file mode 100644 index 0000000000..4645e131de Binary files /dev/null and b/test/fixtures/https-certificate/server.pfx differ