Я создаю приложение Electron Forge. Я считаю, что если я подпишу свое приложение как свое ООО, я избегу всплывающих окон «Неизвестный разработчик», которые пользователи получают при запуске моего exe. Я делаю это, потому что ошибка — это пугающий UX.
Я пытаюсь получить PFX-файл с USB-накопителя Sectigo, чтобы включить подпись моего приложения с помощью действия GitHub. Я понимаю, что USB не всегда требовался.
Вот шаги, которые я собираюсь выполнить, основываясь на документации Electron Forge:
{
name: '@electron-forge/maker-squirrel',
config: {
certificateFile: './cert.pfx', <- I need this pfx file
certificatePassword: process.env.CERTIFICATE_PASSWORD // <- This is the email password I asusme
}
}
Вот несколько способов, которыми я пытался получить PFX. База знаний Sectigo невероятно сложна для навигации и понимания. Я не вижу ни одного примера использования моего PFX. При поиске в pfx появляется только статья, в которой предполагается, что она у вас уже есть.
Tokens -> My Company LLC -> User Certificates -> My Company LLCMy Company LLC, используя пароль, отправленный по электронной почте.My Company LLC, экспортируйте..cer, когда .pfx — это то, что необходимо.certmgr.msc (обратите внимание, что поиск диспетчера сертификатов в Windows вызывает одно и то же приложение, но с разными сертификатами, я не знаю почему)My Company LLC в списке, составленном Sectigo Public Code Signing CA R36.Yes, export the private key размыта.Note: The associated private key is marked as not exportable. Only the certificate can be exported.certmgr.mscMy Company LLC, Подробности, прокрутите поля вниз.Thumbprint.signtool sign /sha1 THUMBPRINT_OF_CERTIFICATE /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /ksp "SafeNet Key Storage Provider" "path\to\program.exe"
Это дает мне
SignTool Error: Multiple certificates were found that meet all the given
criteria. Use the /a option to allow SignTool to choose the best
certificate automatically or use the /sha1 option with the hash of the
desired certificate.
The following certificates meet all given criteria:
Issued to: 12a07552-4d30-4fca-846c-a8be84912193
Issued by: 12a07552-4d30-4fca-846c-a8be84912193
Expires: Sat Mar 29 01:32:52 2025
SHA1 hash: HASH_ONE
Issued to: 2f31b0a3-ea27-4cd2-9667-2b0d00c33f1d
Issued by: 2f31b0a3-ea27-4cd2-9667-2b0d00c33f1d
Expires: Tue Mar 25 20:44:51 2025
SHA1 hash: HASH_TWO
Issued to: MY COMPANY LLC
Issued by: Sectigo Public Code Signing CA R36
Expires: Thu May 22 18:59:59 2025
SHA1 hash: MY_CERTIFICATE_THUMBPRINT
Несмотря на запуск команды подписи с помощью /a и /sha1, я получаю только эту ошибку.
Я понимаю, что Microsoft теперь требует физического устройства для подписи приложений. Означает ли это, что мое приложение будет невозможно подписать с помощью CI? Отсутствие необходимости создавать приложения вручную избавляет меня от тысяч человеческих ошибок.
В электронном письме Продукт указан как Сертификат подписи кода. Выпущено подпись открытого кода Sectigo CA R36, название продукта: SafeNet e Token 5110+ CC (940B). Были ли какие-либо из этих ценностей тем, что вы искали? Я новичок в этом пространстве, поэтому не знаю, что важно знать, спасибо за терпение.
Какие файлы вы получили от Sectigo (ключи, сгенерированные CA)? Или вам нужно создать запрос на подпись сертификата (CSR)? Проверьте документацию Sectigo.
Я добавил изображения, касающиеся характера моих сертификатов, с заблокированной конфиденциальной информацией.





Я пытаюсь получить PFX-файл с USB-накопителя Sectigo, чтобы включить подпись моего приложения с помощью действия GitHub. Я понимаю, что USB не всегда требовался.
Это невозможно, вы не можете извлечь закрытый ключ из USB-токена в файловое хранилище ключей. Новые ключи подписи кода, поставляемые с 1 июня 2023 г., должны храниться в аппаратном модуле хранения.
Вместо создания PFX-файла вам необходимо установить параметр signWithParams в конфигурации белки и указать параметры Signtool для использования USB-токена.
Что-то вроде этого:
"makers": [
{
"name": "@electron-forge/maker-squirrel",
"config": {
"signWithParams": " /a /tr http://rfc3161timestamp.globalsign.com/advanced /fd SHA256 /td SHA256 /sha1 [thumbprint]"
}
}
],
Спасибо вам за это, это очень полезно. Тем не менее, это может работать только на машине, где я могу ввести пароль, и только на компьютере с физическим токеном. Так что никакой непрерывной интеграции, верно?
Пароль можно передать как параметр, но вам действительно нужен доступ к токену от работника CI. Либо через прокси, например github.com/iksaif/pkcs11-proxy, либо через такой сервис, как SignServer. И в следующий раз, когда вы продлите свой сертификат, вы, возможно, захотите использовать облачную службу подписи, например Azure Trusted Signing, вместо аппаратного токена.
Боже, как бы мне хотелось знать, что это существует, прежде чем зайти так далеко, чтобы использовать свой жетон.
Первоначальный ответ, как сказал Эммануэль Бург, заключается в том, что вы не можете экспортировать PFX, используя новомодные физические токены.
Мое более масштабное решение заключалось в том, чтобы подписать OSX обычным способом, отправить файлы Windows в неподписанную папку и подписать их вручную с помощью сценария.
Вот мой процесс CI, который, как мне кажется, на данный момент максимально безболезненный:
keyResolver: (fileName, platform, arch) => {
return `${platform}/unsigned/${arch}/${fileName}`
}
updateElectronApp({
updateSource: {
type: UpdateSourceType.StaticStorage,
baseUrl: `https://BUCKET.s3.amazonaws.com/${process.platform}/${process.arch}`
},
updateInterval: '1 hour',
logger: require('electron-log')
})
{
name: '@electron-forge/maker-squirrel',
config: (arch) => ({
...
remoteReleases: `https://BUCKET.s3.amazonaws.com/win32/${arch}`,
})
}
Однако для Windows мы должны просмотреть каждый файл в неподписанной папке, проверить, есть ли у него подписанная версия в подписанной папке, а если нет, загрузить его, подписать и загрузить в подписанную папку. Важно отметить, что создатель белок полагается на файл RELEASES и наличие файлов nupkg для создания дельт, поэтому будьте осторожны при удалении файлов, которые могут понадобиться позже.
...
sign_setup_exe() {
local version=$1
TIMESTAMP_SERVER = "http://timestamp.sectigo.com"
echo "Signing..."
signtool sign -sha1 "$THUMBPRINT" -tr "$TIMESTAMP_SERVER" -td sha256 -fd sha256 "$LOCAL_DIR/APP-$version Setup.exe"
signtool sign -sha1 "$THUMBPRINT" -tr "$TIMESTAMP_SERVER" -td sha256 -fd sha256 "$LOCAL_DIR/APP-win32-x64-$version/APP-$version Setup.exe"
}
process_setup_file() {
local setup_file=$1
local version
version=$(echo "$setup_file" | grep -oP '(?<=APP-).*')
echo "Considering $version..."
if aws s3api head-object --bucket "BUCKET" --key "win32/x64/APP-win32-x64-$version.zip" >/dev/null 2>&1; then
echo "BUCKET/win32/x64/APP-$version Setup.exe already exists so we are skipping."
return 1
fi
download_files "$version"
if [ $? -ne 0 ]; then
echo "Failed to download files for version $version."
return 1
fi
unzip_file "$version"
if [ $? -ne 0 ]; then
echo "Error Unzipping $version."
return 1
fi
sign_setup_exe "$version"
if [ $? -ne 0 ]; then
echo "Error signing $version."
return 1
fi
rezip_directory "$version"
if [ $? -ne 0 ]; then
echo "Error zipping directory signed files $version."
return 1
fi
upload_signed_files "$version"
if [ $? -ne 0 ]; then
echo "Error uploading signed files $version."
return 1
fi
remove_local_files
if [ $? -ne 0 ]; then
echo "Error removing local files for $version."
return 1
fi
return 0
}
# The releases file is used to manage versions, I think both post and getting versions relies on this.
copy_releases_file() {
aws s3 cp s3://$TEMP_BUCKET/RELEASES s3://$FINAL_BUCKET/RELEASES
}
check_for_new_files() {
echo "Checking for new setup.exe in $TEMP_BUCKET..."
setup_files=$(aws s3 ls "s3://$TEMP_BUCKET/" | grep 'Setup.exe' | awk '{print $4}')
for setup_file in $setup_files; do
process_setup_file "$setup_file"
done
copy_releases_file
}
check_for_new_files
Устойчиво ли это для более чем одного человека? Нет. Поможет ли приобретение выделенного сервера Windows для создания кода решить эту проблему? Нет! Кто-то все равно должен каждый раз подходить к компьютеру и вводить пароль. Я просмотрел статью, где один парень сказал, что может дать пароль для токена один раз за сеанс, но я не знаю, как они это сделали.
Вы пробовали использовать Jsign (ebourg.github.io/jsign) вместо Signtool? Это кроссплатформенный проект, и вы можете передать пароль в командной строке: jsign --storetype ETOKEN --storepass 123456 setup.exe (отказ от ответственности, я автор этого проекта).
я буду чувствовать себя глупо, разве вы не используете разные сертификаты для OSX и Microsoft?
Правильно. Но вы можете подписать двоичные файлы Windows в macOS, для этого не обязательно иметь сервер Windows.
Чтобы не вводить пароль каждый раз, когда вы можете включить единый вход, перейдите в настройки клиента, затем «Дополнительно», и вы увидите кнопку единого входа.
Вопрос в подписи кода. Если где-то полезно настроить параметры входа в систему, прежде чем пытаться подписать, отредактируйте ответ, чтобы уточнить, где находятся эти настройки клиента и на каком этапе длительных шагов Олвера это следует сделать.
Итак, вы купили сертификат подписи и что вы получили? Для создания файла pfx/p12 нам сначала нужно знать, что вы получили от Sectigo, обновите это в своем вопросе.