From 0b89fd94b78f6e049614ab466a7eab7d6a2a33f2 Mon Sep 17 00:00:00 2001 From: Evilebot Tnawi Date: Wed, 30 Jan 2019 22:08:37 +0300 Subject: [PATCH] feat: allow to use `ca`, `pfx`, `key` and `cert` as string (#1542) --- bin/webpack-dev-server.js | 24 ----------- lib/Server.js | 9 +++++ test/Https.test.js | 44 +++++++++++++++++++++ test/cli.test.js | 26 ++++++++++++ test/fixtures/https-certificate/ca.pem | 27 +++++++++++++ test/fixtures/https-certificate/server.crt | 21 ++++++++++ test/fixtures/https-certificate/server.key | 28 +++++++++++++ test/fixtures/https-certificate/server.pfx | Bin 0 -> 2469 bytes 8 files changed, 155 insertions(+), 24 deletions(-) create mode 100644 test/fixtures/https-certificate/ca.pem create mode 100644 test/fixtures/https-certificate/server.crt create mode 100644 test/fixtures/https-certificate/server.key create mode 100644 test/fixtures/https-certificate/server.pfx 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 0000000000000000000000000000000000000000..4645e131de9b00367dd6ba1aca772c5ca31a1a81 GIT binary patch literal 2469 zcmV;W30n3rf(fAl0Ru3C31OKjdlAVPcck4he} zKtQd@c`rk7>p39zeCODu-xx#jdh*jO8;DZ3ikkUKYlnD_rQmI|Dmk`q0s?I7Qu@6q z$-ur;g|O6@&{v_A?)`7lz(Un!=W|`m{;n{+mp#KFxgVZP$3_pg?0*9tpIvIV2zdaQ ziezLVa~88CC(9Nd1l$p+RVlP5cb}>kA@oIjbP(7zCKp_|Ev)EO_OF44Oiyg>+O97$ zNm4%vKk3?v`f?u`Gt|x{!WfH00tQ>3Ha}%otT(j(Yhgtd9ns+^THgx_h|`Ih=>~0E zMXjG()R-sVy~^F?gWz8Cu%g_B> z$8sPeOHHW35S>wbeV3D=|As%J3j&wt2_C@>Xv{I4GMdT2WU4@ zv%%Ucl4FP7Cf*v;?`Y zD>>>;of+3q87X=vcjBV7svI66fp4O5R#s*aP-#J+2F8_ga&F(wdz%lA`g8s{hzHnu z5ka%Y&>tR8bc$Xqq>nsK6wZv9odEIDjNjCcInG?imAS#W*f`50)p|4iPtU<6 zo6??n*4qt*b~~2;M8+UE%*PP-?1K>RW1DrYdOl2ugWm@^sP%r;wx^RIg0lK*c~!Mj z2|y)Vrh?zpiM&s04^mtHPpp1Z#Vny&##ywrdDDDwnIIVwm2VnJ>Gkc^I0Z=^K0_Nj z^XjJqFeWN@u8|4j#2~bCt^(M2MGP+AA86|lDSm4%u#m9fv*7aip*IzP+ut?H*YT=M zhNXzQ-olP8IBfc*w1RWq z7HT%^HBqNITkcw5tuHeQt0I3{{t2aFoFd^1_>&LNQUazhm(@T-E^vLWl%=A zTq9>nqq`Kl{}*W&g9eF{{cYSJW;HxeNAKu~aKuSq3?;;GVpBJm2ud?VaRRqHO~OSx zRQfQhC}stMUj)CTAY{M^2M`W_$RO>`s?`ON;stqdai7@GK^P-$gFnMcl&iWHv4HrR zCdq2p=8fdDuEc|EiS%=YzFe#Ex4Aj5S*0E&=vaWaX4=4teuwK7CGdD{lSamcb8$@_ zUViDSWF8I0h$TAne!1vGT`^E2OmKmN`XiumncaMYI%J&mb{I(`HRD_8pdPLDvtr*P z!EjB{3i~*K7f57>IS%ym%mRWj&xi)=seUU;N7Y#267c|qClkD+;u1UjB`9hW{FJHC zJgie>&kbkZcmV(O5uh|YUL>m+od&N)kUu6xPmJ>>h}F%@sO8%nO927q9&N zQEx$eaSdt+!;E68?Jvn(30dPP-B?#VfVg^fM*&^DZ2)_ScV2SO+$&X=y7QGk;M#s) zCar)X@>bJ?4d^vOXxFf^gk8Flyv7iO$o9ON`?=21*6lWr6qD35ydn{xIE$P0xksjK zd%1NE?;70(Qg)_2Z?c{;H(DZfy?}^S{0*M6*oDVxw3ZLUN$eMAnf!_01_(TblvsRf z)DC;5jcNVR*dEBJW6ckS6}iK_UKZvZJ!CEI1D2p<2*7Fm?cJJcl+1; z9|L?;c-ySPzft*awmJaP96YlX6?dFi7r+qx>%RIz^xl2*Op?gXRlE0v%F{C`e{}b3(6x4` z`|`TkvLr7;Xe(3=H=N=pR(bSD?!T4HrxM%=GP#U0(|%7&GhkLI;EYLPg2zh*e#WSpX117k!{Ssm3l{<~nf3*&*U(U|+q?idPgmx}F)b`y> z4E^lqhH<=pF6ZJdt?5J_;rXysP8}kp)?Qu&F?)$qUO3?+yeOS%AXTM)eYq0!5bCp! zX9KM&wLBC9bU^iW3h4m;DY8s|8~#A+3HR{sWcwOGW9Aje-V-BjUNcK?+;pO;#9R=J zjzdBVOe3Go_|y!X39r2Yejr)2{d`IA_eUpE(3HkCcgswD`2!|2WGHtkVe@Pw>5ZSa z=QW2)6?}qZTw|N|=(ud?pHl6zjHdA75v9jy-#>5Jq)xAjX(zF544=_LAwo8x2;sCc zX)%S|I4xb-!d`@>ai)mkPAtB{{EIK<(w5-)8E