Some checks failed
CI / run (push) Has been cancelled
- Detailed guide for obtaining code signing certificates - Comparison of EV vs standard Code Signing certificates - Provider pricing: DigiCert, Sectigo, Certum - Instructions for signing .exe with signtool - GitHub Actions automation examples - FAQ: can work without certificate (shows warning but works)
285 lines
12 KiB
Markdown
285 lines
12 KiB
Markdown
# Подпись кода для Windows (Code Signing)
|
||
|
||
## Зачем нужен сертификат?
|
||
|
||
При установке `.exe` файла без цифровой подписи Windows показывает предупреждения:
|
||
- ⚠️ "Неизвестный издатель"
|
||
- ⚠️ "Windows защитила ваш компьютер"
|
||
- ⚠️ Windows Defender может блокировать файл
|
||
|
||
**С сертификатом:**
|
||
- ✅ "Проверенный издатель: Umbrix Team"
|
||
- ✅ Нет предупреждений SmartScreen
|
||
- ✅ Пользователи доверяют приложению
|
||
|
||
## Текущее состояние (БЕЗ сертификата)
|
||
|
||
Приложение **РАБОТАЕТ**, но:
|
||
1. При установке Windows показывает "Неизвестный издатель"
|
||
2. Пользователь должен нажать "Все равно запустить"
|
||
3. Антивирус может блокировать (ложное срабатывание)
|
||
|
||
**Для внутреннего использования это НОРМАЛЬНО** ✅
|
||
|
||
## Где получить сертификат?
|
||
|
||
### 1. Коммерческие сертификаты (EV Code Signing)
|
||
|
||
**Recommended:** Extended Validation (EV) - сразу доверие Windows
|
||
|
||
| Провайдер | Цена/год | Особенности |
|
||
|-----------|----------|-------------|
|
||
| **DigiCert** | $469-799 | Лучшая репутация, EV на USB токене |
|
||
| **Sectigo (Comodo)** | $399-599 | Популярный, хорошая поддержка |
|
||
| **GlobalSign** | $349-599 | Быстрое получение (1-2 дня) |
|
||
| **SSL.com** | $299-499 | Дешевле, но дольше проверка |
|
||
| **Certum** | €199-399 | Европейский, принимают криптовалюту |
|
||
|
||
**EV сертификат (Extended Validation):**
|
||
- ✅ Сразу доверие Windows SmartScreen
|
||
- ✅ Зелёная подпись "Проверенный издатель"
|
||
- ✅ Никаких предупреждений
|
||
- 📦 Выдается на USB токене (нельзя скопировать)
|
||
- ⏱️ Проверка документов 3-7 дней
|
||
|
||
**Обычный Code Signing (не EV):**
|
||
- ⚠️ Доверие нарастает со временем (нужно минимум 100-1000 установок)
|
||
- ⚠️ Первые месяцы будут предупреждения SmartScreen
|
||
- 💾 Файл .pfx/.p12 (можно хранить локально)
|
||
- ⏱️ Получение 1-2 дня
|
||
|
||
### 2. Требования для получения
|
||
|
||
**Документы:**
|
||
- Регистрация компании (ИНН, ОГРН, выписка из ЕГРЮЛ)
|
||
- ИЛИ ИП (ОГРНИП)
|
||
- ИЛИ личность физлица (паспорт, утилиты)
|
||
|
||
**Проверка:**
|
||
- Подтверждение номера телефона
|
||
- Email компании (домен должен совпадать)
|
||
- Банковские реквизиты
|
||
- Адрес офиса (могут позвонить или прислать письмо с кодом)
|
||
|
||
### 3. Процесс получения (DigiCert EV пример)
|
||
|
||
```
|
||
1. Заказ → 2-3 минуты (онлайн форма)
|
||
↓
|
||
2. Оплата → $799/год
|
||
↓
|
||
3. Проверка документов → 3-7 дней
|
||
- Загрузка ЕГРЮЛ/паспорта
|
||
- Подтверждение телефона
|
||
- Проверка адреса
|
||
↓
|
||
4. Отправка USB токена → 1-5 дней (DHL/FedEx)
|
||
↓
|
||
5. Установка драйверов → 10 минут
|
||
↓
|
||
6. Готово! Можно подписывать код
|
||
```
|
||
|
||
## Как подписать файл после получения сертификата
|
||
|
||
### С EV сертификатом (USB токен)
|
||
|
||
```powershell
|
||
# 1. Установить Windows SDK (включает signtool.exe)
|
||
# Скачать: https://developer.microsoft.com/windows/downloads/windows-sdk/
|
||
|
||
# 2. Подключить USB токен
|
||
|
||
# 3. Подписать EXE
|
||
$signtool = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\signtool.exe"
|
||
& $signtool sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /a "umbrix-1.7.3-windows-setup.exe"
|
||
|
||
# Результат:
|
||
# Successfully signed: umbrix-1.7.3-windows-setup.exe
|
||
```
|
||
|
||
### С обычным Code Signing (.pfx файл)
|
||
|
||
```powershell
|
||
# 1. Экспортировать сертификат в .pfx с паролем
|
||
|
||
# 2. Подписать EXE
|
||
$signtool = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\signtool.exe"
|
||
& $signtool sign /f "umbrix-cert.pfx" /p "PASSWORD" /tr http://timestamp.digicert.com /td sha256 /fd sha256 "umbrix-1.7.3-windows-setup.exe"
|
||
```
|
||
|
||
### Проверка подписи
|
||
|
||
```powershell
|
||
# Посмотреть информацию о подписи
|
||
$signtool verify /pa /v "umbrix-1.7.3-windows-setup.exe"
|
||
|
||
# Или через GUI: ПКМ → Свойства → Цифровые подписи
|
||
```
|
||
|
||
## Автоматизация с GitHub Actions
|
||
|
||
```yaml
|
||
name: Build & Sign Windows
|
||
|
||
on:
|
||
push:
|
||
tags: ['v*']
|
||
|
||
jobs:
|
||
build-windows:
|
||
runs-on: windows-latest
|
||
steps:
|
||
- uses: actions/checkout@v3
|
||
|
||
- name: Setup Flutter
|
||
uses: subosito/flutter-action@v2
|
||
with:
|
||
flutter-version: '3.24.0'
|
||
|
||
- name: Build Windows
|
||
run: flutter build windows --release
|
||
|
||
- name: Build Installer
|
||
run: iscc windows/installer.iss
|
||
|
||
# Для EV сертификата - использовать self-hosted runner с USB токеном
|
||
# Для обычного - загрузить .pfx в GitHub Secrets
|
||
|
||
- name: Sign EXE
|
||
env:
|
||
CERT_PASSWORD: ${{ secrets.CERT_PASSWORD }}
|
||
run: |
|
||
# Импорт .pfx из секрета
|
||
$cert = [Convert]::FromBase64String("${{ secrets.CERT_BASE64 }}")
|
||
[IO.File]::WriteAllBytes("cert.pfx", $cert)
|
||
|
||
# Подпись
|
||
$signtool = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\signtool.exe"
|
||
& $signtool sign /f cert.pfx /p $env:CERT_PASSWORD /tr http://timestamp.digicert.com /td sha256 /fd sha256 dist/umbrix-1.7.3-windows-setup.exe
|
||
|
||
# Удалить временный .pfx
|
||
Remove-Item cert.pfx
|
||
|
||
- name: Upload to Gitea
|
||
run: |
|
||
curl -X POST "https://update.umbrix.net/api/v1/repos/vodorod/umbrix/releases/assets" `
|
||
-H "Authorization: token ${{ secrets.GITEA_TOKEN }}" `
|
||
--data-binary "@dist/umbrix-1.7.3-windows-setup.exe"
|
||
```
|
||
|
||
## Альтернативы (НЕ рекомендуется)
|
||
|
||
### 1. Self-Signed сертификат (для тестирования)
|
||
|
||
```powershell
|
||
# Создать self-signed сертификат
|
||
$cert = New-SelfSignedCertificate -Type CodeSigningCert -Subject "CN=Umbrix Team" -CertStoreLocation Cert:\CurrentUser\My
|
||
|
||
# Экспортировать
|
||
$pwd = ConvertTo-SecureString -String "password123" -Force -AsPlainText
|
||
Export-PfxCertificate -Cert $cert -FilePath umbrix-selfsigned.pfx -Password $pwd
|
||
|
||
# Подписать
|
||
signtool sign /f umbrix-selfsigned.pfx /p password123 /fd sha256 umbrix-1.7.3.exe
|
||
```
|
||
|
||
**⚠️ Проблемы:**
|
||
- Windows все равно показывает предупреждение
|
||
- Нужно вручную добавлять сертификат в доверенные
|
||
- НЕ работает на других компьютерах
|
||
- Только для внутреннего тестирования
|
||
|
||
### 2. Open Source Certificate (StartSSL, Let's Encrypt)
|
||
|
||
❌ **Не работает для Code Signing!**
|
||
- Let's Encrypt выдает только SSL/TLS (для HTTPS)
|
||
- Code Signing требует проверку юрлица
|
||
- Нет бесплатных Code Signing сертификатов
|
||
|
||
### 3. Использование osslsigncode (Linux подпись Windows файлов)
|
||
|
||
```bash
|
||
# Установка на Linux
|
||
sudo apt install osslsigncode
|
||
|
||
# Подпись (с .pfx сертификатом)
|
||
osslsigncode sign \
|
||
-pkcs12 umbrix-cert.pfx \
|
||
-pass "PASSWORD" \
|
||
-ts http://timestamp.digicert.com \
|
||
-in umbrix-1.7.3-windows-setup.exe \
|
||
-out umbrix-1.7.3-windows-setup-signed.exe
|
||
```
|
||
|
||
## Рекомендации для Umbrix
|
||
|
||
### Для разработки и тестирования (СЕЙЧАС):
|
||
✅ **Без сертификата** - просто предупреждение Windows
|
||
- Пользователи могут нажать "Все равно запустить"
|
||
- Работает для внутреннего использования
|
||
- Бесплатно
|
||
|
||
### Для публичного релиза (БУДУЩЕЕ):
|
||
✅ **DigiCert EV Code Signing** ($799/год)
|
||
- Сразу доверие Windows
|
||
- Нет предупреждений
|
||
- Профессиональный вид
|
||
- Рекомендуется для коммерческого продукта
|
||
|
||
### Для малого бюджета:
|
||
✅ **Certum Open Source Code Signing** (€199/год)
|
||
- Дешевле других
|
||
- Принимают криптовалюту
|
||
- Специальная цена для Open Source проектов
|
||
- Требуют ссылку на GitHub/GitLab
|
||
|
||
## Ссылки
|
||
|
||
**Покупка сертификатов:**
|
||
- DigiCert: https://www.digicert.com/signing/code-signing-certificates
|
||
- Sectigo: https://sectigo.com/ssl-certificates-tls/code-signing
|
||
- GlobalSign: https://www.globalsign.com/en/code-signing-certificate
|
||
- SSL.com: https://www.ssl.com/certificates/code-signing/
|
||
- Certum: https://en.sklep.certum.pl/data-safety/code-signing-certificates/
|
||
|
||
**Документация:**
|
||
- Microsoft Code Signing: https://learn.microsoft.com/windows/win32/seccrypto/cryptography-tools
|
||
- signtool.exe: https://learn.microsoft.com/windows-hardware/drivers/devtest/signtool
|
||
|
||
**Проверка репутации SmartScreen:**
|
||
- https://www.microsoft.com/en-us/wdsi/filesubmission
|
||
|
||
## FAQ
|
||
|
||
**Q: Можно ли работать без сертификата?**
|
||
A: Да! Приложение будет работать, но Windows покажет предупреждение "Неизвестный издатель". Для личного/внутреннего использования это OK.
|
||
|
||
**Q: Как быстро получить доверие SmartScreen с обычным сертификатом?**
|
||
A: Нужно минимум 100-1000 установок за 2-3 месяца. EV сертификат дает доверие сразу.
|
||
|
||
**Q: Можно ли использовать сертификат на Linux для подписи Windows файлов?**
|
||
A: Да, через `osslsigncode`. Но EV сертификаты на USB токене работают только на Windows.
|
||
|
||
**Q: Что дешевле - EV или обычный Code Signing?**
|
||
A: Обычный дешевле ($299 vs $799), но нужно ждать наработки репутации. EV дороже, но доверие сразу.
|
||
|
||
**Q: Сертификат для Umbrix - обязателен?**
|
||
A: Для закрытого тестирования - НЕТ. Для публичного релиза - ОЧЕНЬ ЖЕЛАТЕЛЬНО.
|
||
|
||
## Итого
|
||
|
||
**Текущая конфигурация обновлений:**
|
||
- ✅ Файл: `.exe` установщик (Inno Setup)
|
||
- ✅ Приоритет поиска: x64 → amd64 → win64 → setup → installer → любой .exe
|
||
- ✅ Установка: PowerShell с `/VERYSILENT /SUPPRESSMSGBOXES /NORESTART`
|
||
- ✅ Автоперезагрузка: через 2 секунды
|
||
- ⚠️ Сертификат: НЕТ (показывает предупреждение, но работает)
|
||
|
||
**Следующие шаги:**
|
||
1. Собрать Windows версию на машине с Windows
|
||
2. Создать Inno Setup установщик
|
||
3. Загрузить в Gitea релиз
|
||
4. Протестировать автообновление
|
||
5. (Опционально) Купить сертификат для публичного релиза
|