Files
umbrix/update-server/CODE_SIGNING_WINDOWS.md

285 lines
12 KiB
Markdown
Raw Normal View History

# Подпись кода для 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. (Опционально) Купить сертификат для публичного релиза