diff --git a/dashcaddy-api/routes/ca.js b/dashcaddy-api/routes/ca.js index a9ac9a8..0616d53 100644 --- a/dashcaddy-api/routes/ca.js +++ b/dashcaddy-api/routes/ca.js @@ -2,7 +2,7 @@ const express = require('express'); const fs = require('fs'); const fsp = require('fs').promises; const path = require('path'); -const { execSync } = require('child_process'); +const { execSync, execFileSync } = require('child_process'); const { exists } = require('../src/utilities/fs-helpers'); const { ValidationError } = require('../src/utilities/errors'); const { ok } = require('../src/utils/responses'); @@ -207,7 +207,9 @@ ${safeDomain.includes('.') ? `DNS.2 = *.${safeDomain}` : ''}`; const rootCertContent = await fsp.readFile(rootCert, 'utf8'); await fsp.writeFile(fullChainFile, serverCertContent + '\n' + intermediateCertContent + '\n' + rootCertContent); - execSync(`openssl pkcs12 -export -out "${pfxFile}" -inkey "${keyFile}" -in "${certFile}" -certfile "${intermediateCert}" -password "pass:${password}"`, { stdio: 'pipe' }); + // P0-2 fix: was execSync(`... -password "pass:${password}"`) which interpolates the user-controlled + // password into a shell string. execFileSync passes it as an argv element instead, no shell parsing. + execFileSync('openssl', ['pkcs12', '-export', '-out', pfxFile, '-inkey', keyFile, '-in', certFile, '-certfile', intermediateCert, '-password', `pass:${password}`], { stdio: 'pipe' }); const keyContent = await fsp.readFile(keyFile, 'utf8'); await fsp.writeFile(pemFile, keyContent + '\n' + serverCertContent + '\n' + intermediateCertContent);