Spec-Zone.ru › Electron

Подпись кода

Подпись кода — это технология безопасности, которую вы используете для подтверждения того, что приложение было создано вами. Вы должны подписать своё приложение, чтобы оно не вызывало проверок безопасности операционной системы.

В macOS система может обнаружить любые изменения в приложении, внесенные случайно или вредоносным кодом.

В Windows система присваивает уровень доверия вашему сертификату подписи кода. Если у вас его нет или уровень доверия низкий, при запуске вашего приложения будут появляться диалоговые окна безопасности. Уровень доверия со временем возрастает, поэтому лучше начать подписывать код как можно раньше.

Хотя распространение неподписанных приложений возможно, это не рекомендуется. Как Windows, так и macOS по умолчанию препятствуют загрузке или выполнению неподписанных приложений. Начиная с macOS Catalina (версия 10.15), пользователи должны выполнять несколько ручных шагов для открытия неподписанных приложений.

macOS Catalina Gatekeeper warning: The app cannot be opened because the developer cannot be verified

Как видите, пользователи получают два варианта: сразу переместить приложение в корзину или отменить его запуск. Вам не нужно, чтобы пользователи видели это диалоговое окно.

Если вы создаёте приложение Electron, которое планируете упаковать и распространить, оно должно быть подписано кодом.

Подпись и нотаризация macOS-сборок​

Для надлежащей подготовки macOS-приложений к выпуску требуется два шага. Сначала приложение необходимо подписать кодом. Затем приложение необходимо загрузить в Apple для процесса, называемого нотаризацией, где автоматизированные системы дополнительно проверят, что ваше приложение не представляет опасности для пользователей.

Для начала процесса убедитесь, что вы выполнили требования для подписи и нотаризации вашего приложения:

  1. Зарегистрируйтесь в программе Apple Developer Program (требуется ежегодная плата)
  2. Скачайте и установите Xcode — это требует компьютера под управлением macOS
  3. Сгенерируйте, скачайте и установите сертификаты подписи

Экосистема Electron предпочитает конфигурацию и свободу, поэтому существуют различные способы подписи и нотаризации вашего приложения.

Использование Electron Forge​

Если вы используете любимый инструмент сборки Electron, для подписи и нотаризации вашего приложения требуется несколько дополнений к вашей конфигурации. Forge — это набор официальных инструментов Electron, использующих electron-packager, electron-osx-sign и electron-notarize под капотом.

Давайте рассмотрим пример package.json конфигурации со всеми необходимыми полями. Не все из них обязательны: инструменты достаточно умны, чтобы автоматически найти подходящий identity, но мы рекомендуем указывать его явно.

package.json
{
  "name": "my-app",
  "version": "0.0.1",
  "config": {
    "forge": {
      "packagerConfig": {
        "osxSign": {
          "identity": "Developer ID Application: Felix Rieseberg (LT94ZKYDCJ)",
          "hardened-runtime": true,
          "entitlements": "entitlements.plist",
          "entitlements-inherit": "entitlements.plist",
          "signature-flags": "library"
        },
        "osxNotarize": {
          "appleId": "felix@felix.fun",
          "appleIdPassword": "my-apple-id-password"
        }
      }
    }
  }
}

Файл entitlements.plist , на который здесь есть ссылка, нуждается в следующих специфичных для macOS правах доступа, чтобы убедить механизмы безопасности Apple, что ваше приложение выполняет эти действия без вреда пользователям:

entitlements.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>com.apple.security.cs.allow-jit</key>
    <true/>
    <key>com.apple.security.cs.debugger</key>
    <true/>
  </dict>
</plist>

Обратите внимание, что до Electron 12 право доступа com.apple.security.cs.allow-unsigned-executable-memory также было необходимо. Однако, если это возможно, его больше использовать не следует.

Чтобы увидеть всё это в действии, ознакомьтесь с исходным кодом Electron Fiddle, особенно с файлом конфигурации electron-forge.

Если вы планируете получить доступ к микрофону или камере в своём приложении с помощью API Electron, вам также необходимо добавить следующие права доступа:

entitlements.plist
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>

Если их нет в правах доступа вашего приложения при вызове, например:

main.js
const { systemPreferences } = require('electron')
const microphone = systemPreferences.askForMediaAccess('microphone')

Ваше приложение может аварийно завершить работу. Для получения дополнительной информации и прав доступа, которые могут потребоваться, см. раздел «Доступ к ресурсам» в Hardened Runtime.

Использование Electron Builder​

Electron Builder поставляется с собственным решением для подписи вашего приложения. Вы можете найти его документацию здесь.

Использование Electron Packager​

Если вы не используете интегрированную систему сборки, такую как Forge или Builder, вы, скорее всего, используете electron-packager, который включает electron-osx-sign и electron-notarize.

Если вы используете API Packager, вы можете передать конфигурацию, которая подписывает и нотаризует ваше приложение.

const packager = require('electron-packager')

packager({
  dir: '/path/to/my/app',
  osxSign: {
    identity: 'Developer ID Application: Felix Rieseberg (LT94ZKYDCJ)',
    'hardened-runtime': true,
    entitlements: 'entitlements.plist',
    'entitlements-inherit': 'entitlements.plist',
    'signature-flags': 'library'
  },
  osxNotarize: {
    appleId: 'felix@felix.fun',
    appleIdPassword: 'my-apple-id-password'
  }
})

Файл entitlements.plist , на который здесь есть ссылка, нуждается в следующих специфичных для macOS правах доступа, чтобы убедить механизмы безопасности Apple, что ваше приложение выполняет эти действия без вреда пользователям:

entitlements.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>com.apple.security.cs.allow-jit</key>
    <true/>
    <key>com.apple.security.cs.debugger</key>
    <true/>
  </dict>
</plist>

До Electron 12 право доступа com.apple.security.cs.allow-unsigned-executable-memory также было необходимо. Однако, если это возможно, его больше использовать не следует.

Подпись приложений Mac App Store​

См. Руководство по подаче в Mac App Store.

Подпись сборок Windows​

Перед подписью сборок Windows необходимо выполнить следующие действия:

  1. Получить сертификат подписи кода Authenticode для Windows (требуется ежегодная плата)
  2. Установить Visual Studio для получения утилиты подписи (достаточно бесплатной версии Community Edition)

Сертификаты подписи кода можно получить от многих реселлеров. Цены различаются, поэтому стоит потратить время на сравнение предложений. К популярным реселлерам относятся:

  • digicert
  • Sectigo
  • И другие, пожалуйста, сравните предложения, чтобы найти подходящий для вас вариант! 😄
Сохраняйте пароль от сертификата в секрете

Пароль от вашего сертификата должен быть секретным. Не разглашайте его публично и не включайте в исходный код.

Использование Electron Forge​

После получения файла сертификата подписи кода (.pfx), вы можете подписать Squirrel.Windows и MSI установщики в Electron Forge с полями certificateFile и certificatePassword в соответствующих объектах конфигурации.

Например, если вы храните конфигурацию Forge в файле package.json и создаёте установщик Squirrel.Windows:

package.json
{
  "name": "my-app",
  "version": "0.0.1",
  //...
  "config": {
    "forge": {
      "packagerConfig": {},
      "makers": [
        {
          "name": "@electron-forge/maker-squirrel",
          "config": {
            "certificateFile": "./cert.pfx",
            "certificatePassword": "this-is-a-secret"
          }
        }
      ]
    }
  }
  //...
}

Использование electron-winstaller (Squirrel.Windows)​

electron-winstaller — это пакет, который может генерировать установщики Squirrel.Windows для вашего приложения Electron. Это инструмент, используемый под капотом создателем Squirrel.Windows Maker в Electron Forge. Если вы не используете Electron Forge и хотите использовать electron-winstaller напрямую, используйте параметры конфигурации certificateFile и certificatePassword при создании установщика.

const electronInstaller = require('electron-winstaller')
// NB: Use this syntax within an async function, Node does not have support for
//     top-level await as of Node 12.
try {
  await electronInstaller.createWindowsInstaller({
    appDirectory: '/tmp/build/my-app-64',
    outputDirectory: '/tmp/build/installer64',
    authors: 'My App Inc.',
    exe: 'myapp.exe',
    certificateFile: './cert.pfx',
    certificatePassword: 'this-is-a-secret',
  })
  console.log('It worked!')
} catch (e) {
  console.log(`No dice: ${e.message}`)
}

Для полной настройки, ознакомьтесь с репозиторием electron-winstaller!

Использование electron-wix-msi (WiX MSI)​

electron-wix-msi — это пакет, который может генерировать MSI-инсталляторы для вашего приложения Electron. Это инструмент, используемый в Electron Forge's MSI Maker.

Если вы не используете Electron Forge и хотите использовать electron-wix-msi напрямую, используйте параметры конфигурации certificateFile и certificatePassword или передайте параметры напрямую в SignTool.exe с параметром signWithParams.

import { MSICreator } from 'electron-wix-msi'

// Step 1: Instantiate the MSICreator
const msiCreator = new MSICreator({
  appDirectory: '/path/to/built/app',
  description: 'My amazing Kitten simulator',
  exe: 'kittens',
  name: 'Kittens',
  manufacturer: 'Kitten Technologies',
  version: '1.1.2',
  outputDirectory: '/path/to/output/folder',
  certificateFile: './cert.pfx',
  certificatePassword: 'this-is-a-secret',
})

// Step 2: Create a .wxs template file
const supportBinaries = await msiCreator.create()

// 🆕 Step 2a: optionally sign support binaries if you
// sign you binaries as part of of your packaging script
supportBinaries.forEach(async (binary) => {
  // Binaries are the new stub executable and optionally
  // the Squirrel auto updater.
  await signFile(binary)
})

// Step 3: Compile the template to a .msi file
await msiCreator.compile()

Для полной настройки, ознакомьтесь с репозиторием electron-wix-msi!

Использование Electron Builder​

Electron Builder поставляется с настраиваемым решением для подписи вашего приложения. Вы можете найти его документацию здесь.

Подпись приложений для Windows Store​

См. Руководство по Windows Store.

© GitHub Inc.
Licensed under the MIT license.
https://www.electronjs.org/docs/latest/tutorial/code-signing

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API