
Клиентский инструментарий PKI, который декодирует артефакты X.509, CSR, цепочки, CRL, PKCS#7 и PKCS#12, просматривает ASN.1, конвертирует форматы и генерирует самоподписанные сертификаты в браузере.
Самостоятельно размещаемый, на 100 % клиентский набор инструментов для артефактов PKI: сертификаты X.509, CSR PKCS#10, цепочки, CRL, пакеты PKCS#7 и PKCS#12, необработанный ASN.1, преобразование форматов, отпечатки и выпуск сертификатов. Уважающая приватность, самостоятельно размещаемая замена онлайн-декодерам сертификатов.
Живая демонстрация: https://pki-toolbox.youkyi.net (демонстрация — это та же статическая сборка, которую вы можете разместить самостоятельно, как описано ниже; всё, что вы вставляете, не покидает ваш браузер).
Каждый байт разбирается внутри вашего браузера с помощью @peculiar/x509 и pkijs. Ничего никогда не загружается на сервер, бэкенд лишь отдаёт статические файлы. Вам не нужно верить нам на слово: см. Проверяемая приватность ниже.
| Инструмент | Категория | Описание |
|---|
| Декодер сертификатов | Декодирование | Все поля сертификата X.509: субъект, издатель, срок действия, SAN, использование ключа, отпечатки |
| Декодер CSR | Декодирование | Субъект, открытый ключ, алгоритм подписи и запрошенные расширения запроса PKCS#10 |
| Декодер цепочки | Декодирование | Разбивает объединённый пакет PEM на упорядоченную цепочку и проверяет каждую связь издатель-субъект |
| Декодер CRL | Декодирование | Отозванные записи, даты и причины отзыва |
| Декодер PKCS#7 | Декодирование | Каждый сертификат, содержащийся в пакете PKCS#7 / CMS |
| Декодер PKCS#12 | Декодирование | Открывает защищённые паролем файлы .p12 / .pfx |
| Отпечатки | Инспекция | SHA-1 / SHA-256 / SHA-512 от DER |
| Просмотр ASN.1 | Инспекция | Раскрываемое дерево тег/длина/значение для любого артефакта DER |
| Преобразование форматов | Преобразование | PEM ↔ DER ↔ PKCS#7 |
| Самоподписанный сертификат | Генерация | Самоподписанный сертификат и пара ключей (RSA / EC / Ed25519) через WebCrypto |
| Подпись от CA | Генерация | Выпускает сертификат от существующего CA: новая пара ключей или CSR, конечный или промежуточный, с готовой к использованию полной цепочкой |
Каталог хранится в едином реестре (src/lib/tools.ts), который управляет навигационной панелью и домашней сеткой.
Вокруг самих инструментов:
src/lib/pki/detect.ts) и открывается в инструменте, который его читает./ помещает курсор в поле ввода.Утверждение «это никогда не покидает ваш браузер» можно проверить прямо со страницы:
connect-src страницы из политики, с которой она была отдана, подсчитывает запросы, способные вынести данные, с момента вашей вставки, и выполняет живую попытку, которую браузер отклоняет на ваших глазах, цитируя директиву, которая её заблокировала.Всегда запускайте закреплённый, неизменяемый тег релиза (vX.Y.Z), никогда latest: движущийся тег нельзя проверить или откатить. Для самой сильной гарантии закрепите дайджест образа (...@sha256:...).
docker run -p 8080:8080 ghcr.io/youkyi/pki-toolbox:v2.2.0
Затем откройте http://localhost:8080.
Каждый релиз публикуется под одним и тем же неизменяемым тегом vX.Y.Z в:
| Реестр | Образ |
|---|---|
| GitHub Container Registry | ghcr.io/youkyi/pki-toolbox |
| Docker Hub | youkyi/pki-toolbox |
docker pull ghcr.io/youkyi/pki-toolbox:v2.2.0 # или
docker pull youkyi/pki-toolbox:v2.2.0
services:
pki-toolbox:
image: ghcr.io/youkyi/pki-toolbox:v2.2.0
ports:
- '8080:8080'
restart: unless-stopped
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
read_only: true
docker compose up -d
Репозиторий поставляется с полностью усиленным docker-compose.yml (корневая файловая система только для чтения, отброшенные возможности, ограничения памяти и CPU); используйте этот файл напрямую, а не этот минимальный пример.
Образ собран из nginx:alpine-slim, весит около 25 МБ, слушает непривилегированный порт 8080 и работает от непривилегированного пользователя.
Требуется Node 24 (версия, с которой собираются образ и CI) и pnpm 11. Точная версия pnpm закреплена полем packageManager в package.json, поэтому достаточно corepack enable.
pnpm install
pnpm dev # dev server on http://localhost:5173
pnpm test # unit tests, single run (Vitest)
pnpm test:unit # the same tests, in watch mode
pnpm test:e2e # end-to-end tests (Playwright)
pnpm test:e2e:ui # the same, in the Playwright UI
pnpm check # svelte-check / TypeScript
pnpm lint # Prettier + ESLint
pnpm format # rewrite files with Prettier
pnpm build # static build into ./build
pnpm preview # serve ./build locally
docker build -t pki-toolbox .
docker run -p 8080:8080 pki-toolbox
adapter-static в чистый HTML/JS: каждый маршрут предварительно отрендерен, и в продакшене нет среды выполнения Node.src/lib/pki/, без импорта Svelte: parse.ts, chain.ts, crl.ts, pkcs7.ts, pkcs12.ts, asn1.ts, convert.ts, format.ts, pem.ts, oids.ts, detect.ts, generate.ts и sign.ts. Каждый маршрут в src/routes/ — это тонкая оболочка UI вокруг них.@peculiar/x509 v2 строит свои объекты через tsyringe, которому на стороне потребителя нужен полифилл метаданных Reflect, поэтому @abraham/reflection импортируется перед ним в каждом модуле, использующем библиотеку.pkijs, чей движок Web Crypto регистрируется один раз в src/lib/pki/engine.ts.tests/pki/ (Vitest), а браузерные тесты в e2e/ (Playwright). Фикстуры — это реальные публичные корни (ISRG Root X1/X2) плюс сгенерированная цепочка EC и CSR, см. scripts/generate-fixtures.mjs.<meta> с connect-src 'none'; nginx добавляет frame-ancestors 'none', X-Frame-Options, X-Content-Type-Options, Referrer-Policy: no-referrer, ограничительную Permissions-Policy и заголовки кросс-доменной изоляции. Демонстрация на Vercel отправляет тот же набор заголовков (см. vercel.json).docker-compose.yml добавляет корневую файловую систему только для чтения, cap_drop: ALL, no-new-privileges и ограничения ресурсов.trivy fs), так и в только что собранном образе, который также отклоняется, если его базовая ОС достигла конца жизненного цикла, поэтому уязвимый образ никогда не публикуется. Лицензии сканируются в отдельном, неблокирующем проходе.Этот проект следует семантическому версионированию и Conventional Commits. Значимые изменения записываются в CHANGELOG.md. Правила участия находятся в CONTRIBUTING.md.
CHANGELOG.md переименуйте заголовок ## [Unreleased] в новую версию с сегодняшней датой, например ## [1.2.3] - 2026-06-01, добавьте свежий пустой ## [Unreleased] над ним и обновите ссылки внизу файла."version" в package.json до того же номера.main (conventional commit, например chore(release): 1.2.3) и запушьте.git tag -a v1.2.3 -m "pki-toolbox v1.2.3"
git push origin v1.2.3
Линтинг, модульные тесты и сквозные тесты запускаются при каждом пуше. Этапы сканирования, сборки и релиза берутся из общих компонентов YouKyi-Infra/ci-infrastructure/ci-catalog (trivy-scan, docker-build, gitlab-release), закреплённых по версии в .gitlab-ci.yml.
Тег vX.Y.Z запускает всю цепочку: сканирование, сборку образа, сканирование образа, публикацию vX.Y.Z в реестр GitLab и в публичные зеркала (ghcr.io, Docker Hub), затем GitLab Release, примечания к которому — это соответствующий раздел ## [X.Y.Z], извлечённый из CHANGELOG.md (пустой раздел приводит к сбою задания, а не к публикации пустых примечаний).
Пуш в main запускает тот же конвейер без этапа релиза, а задание образа запускается только когда изменился файл, влияющий на сборку, поэтому пуш только документации или конфигурации не пересобирает образ.
Зависимости поддерживаются в актуальном состоянии с помощью Renovate, который расширяет общий пресет Renovate-Bot/renovate-config (см. renovate.json).