windowsExecutableCodeSignatureVerifier.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.verifySignature = verifySignature;
  6. function _bluebirdLst() {
  7. const data = _interopRequireDefault(require("bluebird-lst"));
  8. _bluebirdLst = function () {
  9. return data;
  10. };
  11. return data;
  12. }
  13. function _builderUtilRuntime() {
  14. const data = require("builder-util-runtime");
  15. _builderUtilRuntime = function () {
  16. return data;
  17. };
  18. return data;
  19. }
  20. function _child_process() {
  21. const data = require("child_process");
  22. _child_process = function () {
  23. return data;
  24. };
  25. return data;
  26. }
  27. function os() {
  28. const data = _interopRequireWildcard(require("os"));
  29. os = function () {
  30. return data;
  31. };
  32. return data;
  33. }
  34. function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
  35. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  36. // $certificateInfo = (Get-AuthenticodeSignature 'xxx\yyy.exe'
  37. // | where {$_.Status.Equals([System.Management.Automation.SignatureStatus]::Valid) -and $_.SignerCertificate.Subject.Contains("CN=siemens.com")})
  38. // | Out-String ; if ($certificateInfo) { exit 0 } else { exit 1 }
  39. function verifySignature(publisherNames, tempUpdateFile, logger) {
  40. return new (_bluebirdLst().default)((resolve, reject) => {
  41. // https://github.com/electron-userland/electron-builder/issues/2421
  42. // https://github.com/electron-userland/electron-builder/issues/2535
  43. (0, _child_process().execFile)("powershell.exe", ["-NoProfile", "-NonInteractive", "-InputFormat", "None", "-Command", `Get-AuthenticodeSignature '${tempUpdateFile}' | ConvertTo-Json -Compress`], {
  44. timeout: 30 * 1000
  45. }, (error, stdout, stderr) => {
  46. if (error != null || stderr) {
  47. if (isOldWin6()) {
  48. logger.warn(`Cannot execute Get-AuthenticodeSignature: ${error || stderr}. Ignoring signature validation due to unsupported powershell version. Please upgrade to powershell 3 or higher.`);
  49. resolve(null);
  50. return;
  51. }
  52. try {
  53. (0, _child_process().execFileSync)("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", "ConvertTo-Json test"], {
  54. timeout: 10 * 1000
  55. });
  56. } catch (testError) {
  57. logger.warn(`Cannot execute ConvertTo-Json: ${testError.message}. Ignoring signature validation due to unsupported powershell version. Please upgrade to powershell 3 or higher.`);
  58. resolve(null);
  59. return;
  60. }
  61. if (error != null) {
  62. reject(error);
  63. return;
  64. }
  65. if (stderr) {
  66. reject(new Error(`Cannot execute Get-AuthenticodeSignature: ${stderr}`));
  67. return;
  68. }
  69. }
  70. const data = JSON.parse(stdout);
  71. delete data.PrivateKey;
  72. delete data.IsOSBinary;
  73. delete data.SignatureType;
  74. const signerCertificate = data.SignerCertificate;
  75. if (signerCertificate != null) {
  76. delete signerCertificate.Archived;
  77. delete signerCertificate.Extensions;
  78. delete signerCertificate.Handle;
  79. delete signerCertificate.HasPrivateKey; // duplicates data.SignerCertificate (contains RawData)
  80. delete signerCertificate.SubjectName;
  81. }
  82. delete data.Path;
  83. if (data.Status === 0) {
  84. const name = (0, _builderUtilRuntime().parseDn)(data.SignerCertificate.Subject).get("CN");
  85. if (publisherNames.includes(name)) {
  86. resolve(null);
  87. return;
  88. }
  89. }
  90. const result = `publisherNames: ${publisherNames.join(" | ")}, raw info: ` + JSON.stringify(data, (name, value) => name === "RawData" ? undefined : value, 2);
  91. logger.info(`Sign verification failed, installer signed with incorrect certificate: ${result}`);
  92. resolve(result);
  93. });
  94. });
  95. }
  96. function isOldWin6() {
  97. const winVersion = os().release();
  98. return winVersion.startsWith("6.") && !winVersion.startsWith("6.3");
  99. }
  100. //# sourceMappingURL=windowsExecutableCodeSignatureVerifier.js.map