Skip to content

Instantly share code, notes, and snippets.

@abakum
Last active February 25, 2024 09:58
Show Gist options
  • Save abakum/4f714770a23a2b5dc620760b0bbf5d2a to your computer and use it in GitHub Desktop.
Save abakum/4f714770a23a2b5dc620760b0bbf5d2a to your computer and use it in GitHub Desktop.
rutoken for OpenSSH client
У меня есть RSA:2048 ключ в шифрованном паролем id_rsa.ppk
Запишем его в шифрованный паролем PKCS #8 pem PRIVATE KEY ENCRYPTED
MINGW64
`pacman -S mingw-w64-x86_64-putty`
`puttygen id_rsa.ppk`
Вводим пароль и в меню Conversion~Export OpenSSH key~id_rsa.pem
Чтоб не вводить пароль расшифруем его в PKCS #1 pem https://gist.github.com/tuansoibk/0b1f279be5c1b782d95f4e15af1442cb
Не забыть удалить этот расшифрующий и подписывающий ключ (РиПК) PRIVATE KEY
`openssl rsa -in id_rsa.pem -out priv.pem`
`del id_rsa.ppk id_rsa.pem`
Если бы у меня не было ключа его можно было создать
`openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out priv.pem`
Извлечём шифрующий и проверяющий подпись ключ (ШиППК) PUBLIC KEY
`openssl rsa -in priv.pem -pubout -out pub.pem`
Запишем ШиППК в Рутокен (именно в таком порядке сначала ШиППК потом РиПК)
используя GnuTLS https://www.man7.org/linux/man-pages/man1/p11tool.1.html
`pacman -S mingw-w64-x86_64-gnutls`
`p11tool --provider c:/windows/system32/rtpkcs11ecp.dll --login --load-pubkey pub.pem --write --label 2048 --id 32303438`
используя OpenSC https://man.archlinux.org/man/pkcs11-tool.1
`openssl rsa -in priv.pem -pubout -outform der -out pub.der`
`pkcs11-tool --module rtPKCS11ECP.dll -ly pubkey -w pub.der -a 2048 -d 32303438`
Не обращаем внимание на ошибку
Запишем РиПК в Рутокен
`p11tool --provider c:/windows/system32/rtpkcs11ecp.dll --login --load-privkey priv.pem --write --label 2048 --id 32303438`
или
`openssl rsa -in priv.pem -outform der -out priv.der`
`pkcs11-tool --module rtPKCS11ECP.dll -ly privkey -w priv.der -a 2048 -d 32303438`
Если бы у меня не было ключа его можно было создать сразу на Рутокене
Внимание! После ввода пинкода может сложится ощущение что программка висит, но это не так - надо ждать (для rsa:4096 4-5 минут)!
У Рутокена проблема с --id -d именем контейнера ключей (ИКК) для RSA
вернее pkcs11-tool и p11tool и пишут и читают ИКК но `В панель управления Рутокен` его видно под другим именем
хотя если генерить ключи в ГОСТе то ИКК отражаются правильно
`pkcs11-tool.exe --module rtPKCS11.dll -lk --key-type rsa:2048 -a 2048 -d 32303438`
Посмотрим Рутокен по метке --label -a
`p11tool --provider c:/windows/system32/rtpkcs11ecp.dll --login --list-all pkcs11:object=2048`
или
`pkcs11-tool --module rtPKCS11ECP.dll -Ola 2048`
Посмотрим Рутокен по ИКК --id -d
`p11tool --provider c:/windows/system32/rtpkcs11ecp.dll --login --list-all pkcs11:id=2048`
или
`pkcs11-tool --module rtPKCS11ECP.dll -Old 32303438`
Прочитаем ШиППК без ввода пинкода
`openssl pkey -engine pkcs11 -inform engine -pubin -in "pkcs11:object=2048" -pubout -out 2048.pem`
Извлечём ШиППК из РиПК
`openssl pkey -engine pkcs11 -inform engine -in "pkcs11:object=2048" -pubout -out 2048.pem`
Рутокены ECP 2.0 и 3.0 это уже сертифицированные свистки и поэтому ключи там неизвлекаемые.
Прочитать РиПК даже импортированный в Рутокен не получется
Если что-то не так можно удалить
`p11tool --provider c:/windows/system32/rtpkcs11ecp.dll --login --delete pkcs11:object=2048`
или
`pkcs11-tool --module rtPKCS11ECP.dll -Olba 2048`
Создадим запрос на сертификат (этикетка koka на ШиППК) CERTIFICATE REQUEST
`openssl req -new -key priv.pem -out cert.csr -subj "/CN=koka"`
или используя GnuTLS
`certtool --generate-request --load-privkey priv.pem --load-pubkey pub.pem --outfile cert.csr`
или с Рутокена
`openssl req -new -engine pkcs11 -keyform engine -key "pkcs11:object=2048" -out req.csr -subj "/CN=koka"`
или используя GnuTLS
`certtool --generate-request --load-privkey "pkcs11:object=2048" --load-pubkey "pkcs11:object=2048" --outfile cert.csr`
Самоподпишем запрос на 10 лет CERTIFICATE
`openssl x509 -req -in cert.csr -signkey priv.pem -out cert.pem -days 3653`
Ну или сразу самоподпишем
`openssl req -x509 -key priv.pem -out cert.pem -subj "/CN=koka" -days 3653`
или с Рутокена
для GnuTLS
`openssl req -x509 -engine pkcs11 -keyform engine -key "pkcs11:object=2048" -out cert.pem -subj "/CN=koka" -days 3653`
для OpenSC
`openssl req -x509 -engine pkcs11 -keyform engine -key "pkcs11:object=2048" -outform der -out cert.der -subj "/CN=koka" -days 3653`
Запишем сертификат в Рутокен
`p11tool --provider c:/windows/system32/rtpkcs11ecp.dll --login --load-certificate cert.pem --write --label 2048 --id 32303438`
или
`pkcs11-tool --module rtPKCS11ECP.dll -ly cert -w cert.der -a 2048 -d 32303438`
Попробуем подключится к sshd
ssh -I rtPKCS11ECP.dll root@127.0.0.1
вводим пинкод rutoken
Это работает!
Видел openssh-gostcrypto может пригодятся ключи по ГОСТу
Создадим новый ключ по ГОСТ Р 34.10-2012
`pkcs11-tool.exe --module rtPKCS11ECP.dll -lk --key-type GOSTR3410-2012-256:A --usage-derive -a 256 -d 323536`
Запрос на сертификат
`openssl req -new -engine rtengine -keyform engine -key "pkcs11:object=256" -out req.csr -subj "/CN=koka"`
Самоподписанный сертификат
`openssl req -x509 -engine rtengine -keyform engine -key "pkcs11:object=256" -out cert.pem -subj "/CN=koka" -days 3653`
для OpenSC
`openssl req -x509 -engine rtengine -keyform engine -key "pkcs11:object=256" -outform der -out cert.der -subj "/CN=koka" -days 3653`
Запишем подписанный сертификат c ШиППК в Рутокен
`p11tool --provider c:/windows/system32/rtpkcs11ecp.dll --login --load-certificate cert.pem --write --label 256 --id 323536`
или
`pkcs11-tool --module rtPKCS11ECP.dll -l -y cert -w cert.der -d 323536 -a 256`
Прочитаем ШиППК без ввода пинкода
`openssl pkey -engine rtengine -inform engine -pubin -in "pkcs11:object=256" -pubout -out 256.pem`
Извлечём ШиППК из РиПК
`openssl pkey -engine rtengine -inform engine -in "pkcs11:object=256" -pubout -out 256.pem`
@abakum
Copy link
Author

abakum commented Feb 22, 2024

Для самых маленьких:
Несимметричные шифры они такие симметричные:
То, что закрывается открытым ключём открывается закрытым.
И наоборот:
То, что подписывается закрытым ключём проверяется открытым.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment