(Go: >> BACK << -|- >> HOME <<)

Skip to content

devind-team/CryptoPro-pycades

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ΠšΡ€ΠΈΠΏΡ‚ΠΎΠŸΡ€ΠΎ 5.0 Π² Π΄ΠΎΠΊΠ΅Ρ€ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ c Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ pycades

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΏΠΎ установкС ΠΈ сборкС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ для языка Python

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°:

  • python3.9.10 с установлСнным Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ pycades (CPStore, CPSigner, CPSignedData)
  • инструмСнты ΠšΡ€ΠΈΠΏΡ‚ΠΎΠŸΡ€ΠΎ: certmgr, cpverify, cryptcp, csptest, csptestf, der2xer, inittst, wipefile, cpconfig
  • Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ скрипты ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ строки
  • HTTP REST-сСрвСр

Π•ΡΡ‚ΡŒ 3 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° использования ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°:

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

β”œβ”€β”€ assets        - ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ для README.md
β”œβ”€β”€ devel         - devel скрипты
β”œβ”€β”€ certificates  - тСстовыС сСртификаты
β”œβ”€β”€ dist          - ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠšΡ€ΠΈΠΏΡ‚ΠΎΠŸΡ€ΠΎ (Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сайта)
β”œβ”€β”€ Dockerfile    - Ρ„Π°ΠΉΠ» сборки ΠΎΠ±Ρ€Π°Π·Π°
β”œβ”€β”€ README.md     - этот Ρ„Π°ΠΉΠ»
└── scripts       - Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ скрипты ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ строки
└── www           - HTTP REST-сСрвСр

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Π° ΠΈΠ· исходного ΠΊΠΎΠ΄Π°

Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сайта Π² dist/ (Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π»ΠΎΠ³ΠΈΠ½Π΅Π½Ρ‹ΠΌ Π² систСмС):

Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ:

docker build --tag cryptopro_5 .

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

Π’ Dockerfile содСрТатся названия ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ lsb-cprocsp-devel_5.0.12000-6_all.deb, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠΉ вСрсиСй. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ названия ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² Dockerfile.

Запуск ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°

Запустим ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ cryptopro, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…:

docker run -it --rm -p 8095:80 --name cryptopro cryptopro_5

Для сохранСния сСртификатов ΠΈ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ

docker run -it -p 8095:80 -v ./cryptopro-data:/var/opt/cprocsp/ -v ./cryptopro-etc:/etc/opt/cprocsp/ --name cryptopro cryptopro_5

Π Π°Π±ΠΎΡ‚Π° с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ Ρ‡Π΅Ρ€Π΅Π· интСрфСйс ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

ЛицСнзия

Установка сСрийного Π½ΠΎΠΌΠ΅Ρ€Π°:

docker exec -i cryptopro cpconfig -license -set <сСрийный_Π½ΠΎΠΌΠ΅Ρ€>

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€:

docker exec -i cryptopro cpconfig -license -view

license

Установка ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Ρ… сСртификатов

Для установки ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Ρ… сСртификатов Π½ΡƒΠΆΠ½ΠΎ Π½Π° stdin скрипта /scripts/root ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» с сСртификатами. Если Π² Ρ„Π°ΠΉΠ»Π΅ нСсколько сСртификатов, всС ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ установлСны.

Π§Π΅Ρ€Π΅Π· скачиваниС Π½Π° диск

Π‘ΠΊΠ°Ρ‡Π°Π΅ΠΌ сСртификат Π½Π° диск с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ curl ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π½Π° stdin с запуском ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π΅Π³ΠΎ установки:

curl -sS http://cpca.cryptopro.ru/cacer.p7b > certificates/cacer.p7b
cat certificates/cacer.p7b | docker exec -i cryptopro /scripts/root

Π‘Π΅Π· скачивания Π½Π° диск

# сСртификаты Π£Π¦
curl -sS http://cpca.cryptopro.ru/cacer.p7b | docker exec -i cryptopro /scripts/root
# сСртификаты тСстового Π£Π¦
curl -sS http://testca2012.cryptopro.ru/cert/rootca.cer | docker exec -i cryptopro /scripts/root
curl -sS http://testca2012.cryptopro.ru/cert/subca.cer | docker exec -i cryptopro /scripts/root

cacer

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΈΠ½ΠΎΠ³Π΄Π° "Π·Π°Π΅Π΄Π°Π΅Ρ‚", Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ запускС - срабатываСт.

Установка сСртификатов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ подписания

НСобходимо ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ zip-Π°Ρ€Ρ…ΠΈΠ² bundle.zip ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° stdin скрипта /scripts/my. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠ³ΠΎ zip-Ρ„Π°ΠΉΠ»Π°:

β”œβ”€β”€ certificate.cer - Ρ„Π°ΠΉΠ» сСртификата (Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ)
└── le-09650.000 - ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° (Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ)
    β”œβ”€β”€ header.key
    β”œβ”€β”€ masks2.key
    β”œβ”€β”€ masks.key
    β”œβ”€β”€ name.key
    β”œβ”€β”€ primary2.key
    └── primary.key

Как ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ сСртификат ΠšΡ€ΠΈΠΏΡ‚ΠΎΠŸΡ€ΠΎ.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² ΠΊΠΎΡ€Π½Π΅ Π°Ρ€Ρ…ΠΈΠ²Π° Π±ΡƒΠ΄Π΅Ρ‚ воспринят ΠΊΠ°ΠΊ сСртификат, Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ - ΠΊΠ°ΠΊ связка Ρ„Π°ΠΉΠ»ΠΎΠ² Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°. ΠŸΠ°Ρ€ΠΎΠ»ΡŒ ΠΎΡ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Ссли Π΅ΡΡ‚ΡŒ, пСрСдаСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.

Π’ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ certificates/ содСрТатся Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ тСстового сСртификата ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°, с PIN ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ Π±Π΅Π·:

β”œβ”€β”€ bundle-cert-only.zip          - Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСртификат
β”œβ”€β”€ bundle-cosign.zip             - сСртификат + Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Π‘Π•Π— ΠΏΠΈΠ½-ΠΊΠΎΠ΄Π° (для добавлСния Π²Ρ‚ΠΎΡ€ΠΎΠΉ подписи)
β”œβ”€β”€ bundle-cyrillic.zip           - сСртификат + Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° "тСстовоС Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°" (ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Π°)
β”œβ”€β”€ bundle-no-pin.zip             - сСртификат + Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Π‘Π•Π— ΠΏΠΈΠ½-ΠΊΠΎΠ΄Π°
β”œβ”€β”€ bundle-pin.zip                - сСртификат + Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ с ΠΏΠΈΠ½-ΠΊΠΎΠ΄ΠΎΠΌ 12345678
└── bundle-private-key-only.zip   - Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

# сСртификат + Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ с ΠΏΠΈΠ½-ΠΊΠΎΠ΄ΠΎΠΌ
cat certificates/bundle-pin.zip | docker exec -i cryptopro /scripts/my 12345678

# сСртификат + Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Π‘Π•Π— ΠΏΠΈΠ½-ΠΊΠΎΠ΄Π°
cat certificates/bundle-no-pin.zip | docker exec -i cryptopro /scripts/my

# Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСртификат
cat certificates/bundle-cert-only.zip | docker exec -i cryptopro /scripts/my

# Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡
cat certificates/bundle-private-key-only.zip | docker exec -i cryptopro /scripts/my

# сСртификат + Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° "тСстовоС Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°" (ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Π°)
cat certificates/bundle-cyrillic.zip | docker exec -i cryptopro /scripts/my

my-cert

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ установлСнных сСртификатов

Π‘Π΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

docker exec -i cryptopro certmgr -list

show-certs

ΠšΠΎΡ€Π½Π΅Π²Ρ‹Π΅ сСртификаты:

docker exec -i cryptopro certmgr -list -store root

ПодписаниС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° установим этот тСстовый сСртификат:

# сСртификат + Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ с ΠΏΠΈΠ½-ΠΊΠΎΠ΄ΠΎΠΌ
cat certificates/bundle-pin.zip | docker exec -i cryptopro /scripts/my 12345678

Π•Π³ΠΎ SHA1 Hash Ρ€Π°Π²Π΅Π½ dd45247ab9db600dca42cc36c1141262fa60e3fe (ΡƒΠ·Π½Π°Ρ‚ΡŒ: certmgr -list), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ сСртификата.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Π½Π° stdin Ρ„Π°ΠΉΠ», Π² качСствС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ - ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий, ΠΈ Π½Π° stdout ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ подписанный Ρ„Π°ΠΉΠ»:

cat README.md | docker exec -i cryptopro sh -c 'tmp=`mktemp`; cat - > "$tmp"; cryptcp -sign -thumbprint dd45247ab9db600dca42cc36c1141262fa60e3fe -nochain -pin 12345678 "$tmp" "$tmp.sig" > /dev/null 2>&1; cat "$tmp.sig"; rm -f "$tmp" "$tmp.sig"'

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ довольно Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ. Π‘ΠΊΡ€ΠΈΠΏΡ‚ scripts/sign Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π° подписания Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

cat README.md | docker exec -i cryptopro /scripts/sign dd45247ab9db600dca42cc36c1141262fa60e3fe 12345678

sign

Об ошибкС ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· стандартный $?.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° подписи

ПодпишСм Ρ„Π°ΠΉΠ» ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²Ρ‹ΡˆΠ΅ ΠΈ сохраним Π΅Π³ΠΎ Π½Π° диск:

cat README.md | docker exec -i cryptopro /scripts/sign dd45247ab9db600dca42cc36c1141262fa60e3fe 12345678 > certificates/README.md.sig

Π’ΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° подписанного Ρ„Π°ΠΉΠ»Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

cat certificates/README.md.sig | docker exec -i cryptopro sh -c 'tmp=`mktemp`; cat - > "$tmp"; cryptcp -verify -norev -f "$tmp" "$tmp"; rm -f "$tmp"'

Π’ΠΎ ΠΆΠ΅ самоС, Π½ΠΎ с использованиСм скрипта:

cat certificates/README.md.sig | docker exec -i cryptopro scripts/verify

verify

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ исходного Ρ„Π°ΠΉΠ»Π° ΠΈΠ· sig-Ρ„Π°ΠΉΠ»Π°

Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ Ρ„Π°ΠΉΠ» ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²Ρ‹ΡˆΠ΅:

cat certificates/README.md.sig | docker exec -i cryptopro sh -c 'tmp=`mktemp`; cat - > "$tmp"; cryptcp -verify -nochain "$tmp" "$tmp.origin" > /dev/null 2>&1; cat "$tmp.origin"; rm -f "$tmp" "$tmp.origin"'

Π’ΠΎ ΠΆΠ΅ самоС, Π½ΠΎ с использованиСм скрипта:

cat certificates/README.md.sig | docker exec -i cryptopro scripts/unsign

unsign

ИспользованиС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ машинС

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ выглядят Ρ‚Π°ΠΊ: cat ... | docker ... ΠΈΠ»ΠΈ curl ... | docker ..., Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π·Π°ΠΏΡƒΡ‰Π΅Π½ Π½Π° локальной машинС. Если ΠΆΠ΅ Π΄ΠΎΠΊΠ΅Ρ€ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π·Π°ΠΏΡƒΡ‰Π΅Π½ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ машинС, Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ssh ΠΊΠ»ΠΈΠ΅Π½Ρ‚. НапримСр, ΠΊΠΎΠΌΠ°Π½Π΄Π° подписания:

cat README.md | ssh -q user@host 'docker exec -i cryptopro /scripts/sign dd45247ab9db600dca42cc36c1141262fa60e3fe 12345678'

ΠžΠΏΡ†ΠΈΡ -q ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ привСтствиС ΠΈΠ· Ρ„Π°ΠΉΠ»Π° /etc/banner (хотя ΠΎΠ½ΠΎ всС Ρ€Π°Π²Π½ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π² stderr). А /etc/motd ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠΎ ssh Π½Π΅ выводится.

Π’ качСствС экспСримСнта ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎ ssh Π½Π° свою ΠΆΠ΅ ΠΌΠ°ΡˆΠΈΠ½Ρƒ Ρ‚Π°ΠΊ:

# ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Π½Π° "ΡƒΠ΄Π°Π»Π΅Π½Π½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ" (Π½Π° самом Π΄Π΅Π»Π΅ - localhost)
ssh-copy-id $(whoami)@localhost
# ΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒ
cat README.md | ssh -q $(whoami)@localhost 'docker exec -i cryptopro /scripts/sign dd45247ab9db600dca42cc36c1141262fa60e3fe 12345678'

Π Π°Π±ΠΎΡ‚Π° с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ Ρ‡Π΅Ρ€Π΅Π· HTTP REST-сСрвСр

Установка сСртификатов осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄ΡƒΡŽ строку. ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ дСйствия доступны ΠΏΠΎ HTTP.

  • /certificates - всС установлСнныС сСртификаты ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (GET)
  • /certificate/root - установка ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Ρ… сСртификатов (POST)
  • /certificate/private_key - установка ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ»ΡŽΡ‡Π° (POST)
  • /license?serial_number= - установка сСрийной Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ (POST)
  • /signer - подписаниС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (POST)
  • /verify - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° подписанного Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° (POST)
  • /unsigner - ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ исходного Ρ„Π°ΠΉΠ»Π° Π±Π΅Π· подписСй (POST)

rest

Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ…

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок

Π£ΡΠΏΠ΅ΡˆΠ½Ρ‹Π΅ дСйствия Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΊΠΎΠ΄ 200 ΠΈ "status": "ok".

ДСйствия с ошибками Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ 4xx ΠΈ 5xx ΠΊΠΎΠ΄Ρ‹ ΠΈ "status": "fail", Π² полях errMsg содСрТится описаниС ошибки, Π² errCode - Π΅Π΅ ΠΊΠΎΠ΄.

НапримСр, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ

curl -sS -X POST --data-binary "bindata" http://localhost:8095/healthchecks

Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Ρ‚Π°ΠΊΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ:

{"status":"fail","errMsg":"Method must be one of: GET","errCode":405}

/certificates - всС установлСнныС сСртификаты ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

curl -X 'GET' \
  'http://localhost:8085/certificate' \
  -H 'accept: application/json'

Если сСртификатов Π½Π΅Ρ‚:

{"status":"fail","errMsg":"No certificates in store 'My'","errCode":404}

Если сСртификаты Π΅ΡΡ‚ΡŒ:

{
  "data_certificates": {
    "certificate_1": {
      "privateKey": {
        "providerName": "Crypto-Pro GOST R 34.10-2012 KC1 CSP",
        "uniqueContainerName": "HDIMAGE\\\\eb5f6857.000\\D160",
        "containerName": "eb5f6857-a08a-4510-8a96-df2f75b6d65a"
      },
      "algorithm": {
        "name": "Π“ΠžΠ‘Π’ Π  34.10-2012 256 Π±ΠΈΡ‚",
        "val": "1.2.643.7.1.1.1.1"
      },
      "valid": {
        "from": "23.08.2021 12:07:25",
        "to": "23.08.2022 12:17:25"
      },
      "issuer": {
        "CN": "Test",
        "O": "Test",
        "OU": "Test",
        "STREET": "Test",
        "L": "Москва",
        "C": "RU",
        "raw": "CN=Test, O=Test, OU=Test, STREET=Test, L=Москва, S=77 Москва, C=RU, INN=Test, OGRN=Test"
      },
      "subject": {
        "E": "Test@Test.ru",
        "C": "RU",
        "L": "г Москва",
        "O": "Test",
        "CN": "Test",
        "STREET": "Test",
        "G": "Test",
        "SN": "Test ",
        "raw": "SNILS=Test, OGRN=Test, INN=Test, E=Test@Test.ru, C=RU, S=77 г. Москва, L=г Москва, O=Test, CN=Test, STREET=Test, T=Test, G=Test, SN=Test"
      },
      "thumbprint": "982AA9E713A2F99B10DAA07DCDC94A4BC32A1027",
      "serialNumber": "120032C3567443029CC358FCDF00000032C356",
      "hasPrivateKey": true
    }
  }
}

/certificate/root - установка ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Ρ… сСртификатов

Для установки ΠΊΠΎΠ½Π΅Π²Ρ‹Ρ… сСртификатов Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» (с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ cer ΠΈΠ»ΠΈ p7b) Π² сСрвис.

curl -X 'POST' \
  'http://localhost:8085/certificate/root' \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'file=@filename.p7b;type=application/x-pkcs7-certificates'

/certificate/private_key - установка ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ»ΡŽΡ‡Π°

Для установки ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ»ΡŽΡ‡Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π°Ρ€Ρ…ΠΈΠ² Π² сСрвис. Π’ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ certificates/ содСрТатся Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ тСстового сСртификата ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°, с PIN ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ Π±Π΅Π·:

β”œβ”€β”€ bundle-cert-only.zip          - Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСртификат
β”œβ”€β”€ bundle-cosign.zip             - сСртификат + Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Π‘Π•Π— ΠΏΠΈΠ½-ΠΊΠΎΠ΄Π° (для добавлСния Π²Ρ‚ΠΎΡ€ΠΎΠΉ подписи)
β”œβ”€β”€ bundle-cyrillic.zip           - сСртификат + Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° "тСстовоС Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°" (ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Π°)
β”œβ”€β”€ bundle-no-pin.zip             - сСртификат + Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Π‘Π•Π— ΠΏΠΈΠ½-ΠΊΠΎΠ΄Π°
β”œβ”€β”€ bundle-pin.zip                - сСртификат + Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ с ΠΏΠΈΠ½-ΠΊΠΎΠ΄ΠΎΠΌ 12345678
└── bundle-private-key-only.zip   - Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡

Π‘ ΠΏΠΈΠ½-ΠΊΠΎΠ΄ΠΎΠΌ:

curl -X 'POST' \
  'http://localhost:8085/certificate/private_key?pin=1234' \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'file=@bundle-pin.zip;type=application/zip'

Π‘Π΅Π· ΠΏΠΈΠ½-ΠΊΠΎΠ΄ΠΎΠΌ:

curl -X 'POST' \
  'http://localhost:8085/certificate/private_key' \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'file=@bundle-no-pin.zip;type=application/zip'

/license?serial_number= - установка сСрийной Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ

Для установки сСрийного Π½ΠΎΠΌΠ΅Ρ€Π° Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€.

curl -X 'POST' \
  'http://localhost:8085/license?serial_number=12345-12345-12345-12345-12345' \
  -H 'accept: application/json' \
  -d ''

/signer - подписаниС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²

Для подписания Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Π² сСрвис.

Π‘ ΠΏΠΈΠ½-ΠΊΠΎΠ΄ΠΎΠΌ:

curl -X 'POST' \
  'http://localhost:8085/signer?pin=123' \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'file=@filename.pdf;type=application/pdf'

Π‘Π΅Π· ΠΏΠΈΠ½-ΠΊΠΎΠ΄Π°:

curl -X 'POST' \
  'http://localhost:8085/signer' \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'file=@filename.pdf;type=application/pdf'

ВСрнСтся JSON - Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, Π² signedContent Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ подписанный Ρ„Π°ΠΉΠ» ΠΈ Π² filename Π½ΠΎΠ²ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°.

/verify - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° подписанного Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°

Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ подписи ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ подписанный ΠΈ Π½Π΅ подписанный Ρ„Π°ΠΉΠ»Ρ‹.

curl -X 'POST' \
  'http://localhost:8085/verify' \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'original_file=@filename1.pdf;type=application/pdf' \
  -F 'signed_file=@filename2.pdf;type=application/pdf'

Если Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΡˆΠ΅Π» ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, вСрнСтся список подписантов signers.

/unsigner - ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ исходного Ρ„Π°ΠΉΠ»Π° Π±Π΅Π· подписСй

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» вСрнСтся Π² ΠΏΠΎΠ»Π΅ content.

curl -X 'POST' \
  'http://localhost:8085/unsigner' \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'file=@filename.sig;type=application/sig'

Бсылки

Аналоги

БущСствуСт Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚:

  • PHP CryptoPro Service (docker) with HTTP API, ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с PHP Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ;
  • cryptopro, Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с PHP Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ ΠΈ HTTP REST-сСрвСром;
  • CryptoProCSP, ΠΎΠ½ классный, Π½ΠΎ:
    • Π΄Π°Π²Π½ΠΎ Π½Π΅ обновлялся, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вСрсия PHP5.6
    • для запуска ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΎΠ΄Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Dockerfile