Как конвертировать сертификат RSA в формат с которым работает менеджер криптографии

1. FreeArcher 159 02.10.20 07:17 Сейчас в теме
Приветствую.
Что работать с сервисом яндекс навигатора, мне требуется шифровать запросы RSA ключом.
Ключ у меня в виде:
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJ
****
IIBOgIBAAJKF
-----END RSA PRIVATE KEY-----


Менеджер криптографии 1С такой не понимает. Как-то могу я преобразовать этот ключ в нужный формат или нет?

Вобщем любая помощь приветствуется, у меня пока нет понимания всего этого зоопарка сертификатов и того, с чем из этого может работать 1С...
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
30. v_vladislav 02.04.21 17:51 Сейчас в теме
(1)Добрый День. Пишу вам снова. Если у вас получилось сделать, могу ли я купить вашу реализацию?
34. uno-c 235 06.06.23 06:31 Сейчас в теме
(30) Если кому-то до сих пор актуально - вот здесь решение выложил https://infostart.ru/public/1875205/
3. FreeArcher 159 02.10.20 11:37 Сейчас в теме
(2) Спасибо, но я не понял, может ли мне это все помочь? Там же реализация через COM Windows, а у меня Android.
4. malikov_pro 1293 02.10.20 12:14 Сейчас в теме
(3) По первой ссылке реализация RS256 кодом 1C.
5. FreeArcher 159 05.10.20 05:47 Сейчас в теме
(4) Спасибо, за ссылку. Разбираюсь, но тяжело идет.
Выполнил парсинг ключа. Получил в обработке структуру. Но мне не понятно, что является итогом?
Мне нужно получить то, что в примере в переменой "signature":
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA256
from Crypto.Signature import PKCS1_v1_5
from base64 import b64encode
# from urllib import quote
from urllib.parse import quote


with open("268_private_key.pem") as f:
    private_key = RSA.importKey(f.read())

print("private_key:")
print(private_key)

src_data = b"yandex"
h = SHA256.new(src_data)
print("hash value")
# print(h)

hexdigest = h.hexdigest()

print("hexdigest:")
print(hexdigest)

signer = PKCS1_v1_5.new(private_key)
signature = quote(b64encode(signer.sign(h)), safe='')

print("signature:")
print(signature)
Показать


И как передать строку, которую нужно зашифровать?
10. uno-c 235 05.10.20 15:16 Сейчас в теме
(5)
И как передать строку, которую нужно зашифровать?

Если хотите питона домучить, то видимо
src_data='yandexnavi://show_point_on_map?lat=55.75&lon=37.64&zoom=14&client=007'
(Ваш аналог этой строки примера).
Но я питона в руки ни разу не брал )
И не зашифровать, а подписать (ошибка употребления терминов в яндекс-инструкции).
6. malikov_pro 1293 05.10.20 08:42 Сейчас в теме
"Что работать с сервисом яндекс навигатора" - к какому именно API обращаетесь?
8. uno-c 235 05.10.20 14:47 Сейчас в теме
Менеджер криптографии 1С такой не понимает. Как-то могу я преобразовать этот ключ в нужный формат или нет?

Даже если заставите его понять - Менеджер Криптографии все равно не сможет сделать подпись RSASHA256, он этому не обучен.

Кроме того, в приведенной ссылке - инструкции Яндекса ошибка:
Затем зашифруйте полученную хэш-сумму с помощью ключа доступа ... openssl dgst -sha256 -sign key.pem

Тут идет не шифрование, а вычисление подписи (-sign) - а это разные процессы.

Подписи RSA с хешированием SHA256 умеют вычислять приведенные в (2) обработки. По крайней мере моя умеет - проверял на гугле )
9. uno-c 235 05.10.20 15:07 Сейчас в теме
В контексте моей обработки + пример из инструкции Яндекса: Вам нужно вычислить подпись (подпись типа двоичные данные) для строки "yandexnavi://show_point_on_map?lat=55.75&lon=37.64&zoom=14&client=007" (т.е. для Вашего аналога этой строки). Затем добавить BASE64 полученной двоичной подписи в данную строку: "yandexnavi://show_point_on_map?lat=55.75&lon=37.64&zoom=14&client=007&signature=BASE64"
11. uno-c 235 05.10.20 15:50 Сейчас в теме
Нашел мою обработку. Вот примерный код для Вашего случая, подписывал гугловским сертификатом:
&НаСервере
Процедура ТестЯндексНаСервере()
	
	ИсходнаяСтрока = "yandexnavi://show_point_on_map?lat=55.75&lon=37.64&zoom=14&client=007"; //здесь Ваша строка
	СтруктураСертификата = ПолучитьСтруктуруСертификата();
	
	Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
	Хеширование.Добавить(ИсходнаяСтрока); 
	ХешДвоичный = Хеширование.ХешСумма;
	ПодписьДвоичная = ПолучиьПодписьSHA256RSA(ХешДвоичный, СтруктураСертификата);
	Подпись64 = Base64Url(ПодписьДвоичная);
	Подпись64Урл = КодироватьСтроку(Подпись64, СпособКодированияСтроки.КодировкаURL);
	Результат = ИсходнаяСтрока + "&signature=" + Подпись64Урл;
	Сообщить(Результат);
	
	Подпись64Урл2 = КодироватьСтроку(Подпись64, СпособКодированияСтроки.URLВКодировкеURL);
	Результат2 = ИсходнаяСтрока + "&signature=" + Подпись64Урл;
	Сообщить(Результат2);
	
	Сообщить (Результат = Результат2);
	
КонецПроцедуры
Показать


Результат:
yandexnavi://show_point_on_map?lat=55.75&lon=37.64&zoom=14&client=007&signature=tt9PdUokCbCLiZSq...
yandexnavi://show_point_on_map?lat=55.75&lon=37.64&zoom=14&client=007&signature=tt9PdUokCbCLiZSq...
Да
12. uno-c 235 05.10.20 15:59 Сейчас в теме
Не уверен, что моя обработка для гугла разберет яндексовский RSA PRIVATE KEY, если разберет - отпишитесь пжл.
Это касается строки
 СтруктураСертификата = ПолучитьСтруктуруСертификата();

когда обработке скармливаешь не встроенный в нее гугл-ключ, а файл с яндексовским RSA PRIVATE KEY

Весь наверно не разберет, но для вычисления подписи ускоренным методом нужны только ключи структуры DP, P, DQ,Q, InverseQ, Exponent, Modulus
dP = ЧислоИзШестнадцатеричнойСтроки("0x"+СтруктураСертификата.DP);
p = ЧислоИзШестнадцатеричнойСтроки("0x"+СтруктураСертификата.P);
dQ = ЧислоИзШестнадцатеричнойСтроки("0x"+СтруктураСертификата.DQ);
q = ЧислоИзШестнадцатеричнойСтроки("0x"+СтруктураСертификата.Q);
qInv = ЧислоИзШестнадцатеричнойСтроки("0x"+СтруктураСертификата.InverseQ);
Exponent = ЧислоИзШестнадцатеричнойСтроки("0x"+СтруктураСертификата.Exponent); //открытый параметр ключа
Modulus = ЧислоИзШестнадцатеричнойСтроки("0x"+СтруктураСертификата.Modulus); //открытый параметр ключа

Последние два открытые параметра нужны только для проверки подписи, что не обязательно делать.
Если часть этих ключей отсутствует - то еще, возможно, есть вариант вычисления подписи медленным методом.
13. FreeArcher 159 05.10.20 17:07 Сейчас в теме
(12) Вот что я получаю в разборе обработкой:
Прикрепленные файлы:
14. FreeArcher 159 05.10.20 17:13 Сейчас в теме
(12)
RSAPrivateKey_SEQUENCE = СтрокаOCTET_STRING.Строки[0];

Вот здесь ошибка СтрокаOCTET_STRING пустое, не заходит алгоритм в условие, где заполняется строка :(
15. uno-c 235 05.10.20 19:07 Сейчас в теме
(14)Скормите -----BEGIN PRIVATE KEY----- онлайн декодеру - что декодер даст в результате разбора? Я то под гугловский ключ разбор писал.
Прикрепленные файлы:
16. uno-c 235 05.10.20 19:15 Сейчас в теме
Картинка у Вас очень похожая на гугловскую, только параметры короче по размеру, и SEQUENCE, который их содержит, в другом месте разбора лежит. А так - 9 штук INTEGER, видно короткую экспоненту (010001), видны 64-байтные (512 бит) модуль и секретный ключ , 32-байтные параметры для ускоренного вычисления подписи.
17. uno-c 235 05.10.20 19:27 Сейчас в теме
Очень похоже, что обработка нормально ключ разобрала, нужно ей только сказать, чтобы СтруктураСертификата взяла параметры из другого места разбора - и дальше пробовать подпись ими ставить )
Имею в виду вот это место нужно переделать - сказать чтобы в другом месте брал, там где девять интегеров у Вас лежит:
	//PKey_SEQUENCE_fields[0] - version не нужна
	СтруктураСертификата.Вставить("Modulus",	PKey_SEQUENCE_fields[1].Значение);
	СтруктураСертификата.Вставить("Exponent",	PKey_SEQUENCE_fields[2].Значение);
	СтруктураСертификата.Вставить("D",			PKey_SEQUENCE_fields[3].Значение);
	СтруктураСертификата.Вставить("P",			PKey_SEQUENCE_fields[4].Значение);
	СтруктураСертификата.Вставить("Q",			PKey_SEQUENCE_fields[5].Значение);
	СтруктураСертификата.Вставить("DP",			PKey_SEQUENCE_fields[6].Значение);
	СтруктураСертификата.Вставить("DQ",			PKey_SEQUENCE_fields[7].Значение);
	СтруктураСертификата.Вставить("InverseQ",	PKey_SEQUENCE_fields[8].Значение);
Показать

D - это кстати секретный ключ, им можно подпись ставить по медленному методу. Но у Вас и параметры для ускоренного выдало.
22. betflop 11 09.10.20 14:45 Сейчас в теме
(17) Добрый день! Подскажите , а как из pem конвертировать в xml сертификат? openssl стандартно в pem создаем , ни как не могу найти как в xml перевести.
23. uno-c 235 09.10.20 16:48 Сейчас в теме
(22) Я только *.p12 конвертил через powershell. Не знаю, поймет ли он openssl-овский
$cert = New-Object system.security.cryptography.x509certificates.x509certificate2
$pat="d:\UNSAFE\dell\mySert.p12"
$password="notasecret"
$flags = "UserKeySet,Exportable"
$cert.Import($pat, $password, $flags)
$myXml = $cert.PrivateKey.ToXmlString($True)
$myXml | Out-File "d:\UNSAFE\dell\FromPower.xml"


https://docs.microsoft.com/ru-ru/dotnet/api/system.security.cryptography.x509certificates.x509certificate2.import?view=netframework-4.8
Здесь пишут, что должен должен быть в стандарте X.509. Попробуйте, может в стандарте Ваш pem.
24. uno-c 235 09.10.20 17:03 Сейчас в теме
(22) Вообще XML так выглядит:
<RSAKeyValue>
<Modulus>0YU4h4rlAoVrimOmbGq0f3BYbRGFiMWMDIB9Wp...==</Modulus>
<Exponent>AQAB</Exponent>
<P>80OT8lXEPh9c4BERYNJ+dXe...=</P>
<Q>3H1iR778EdTUzMlOZcf6...=</Q>
<DP>eoN4ST3knZzR+47c/7RDOAnYt...=</DP>
<DQ>rA2bV2kMwc1WkMa1Sm8WRUOGD...=</DQ>
<InverseQ>uPI77pq+XJutJ5rKTVmAEv...=</InverseQ>
<D>JFQwqpPjRI4kyPChZTAVTvm...==</D>
</RSAKeyValue>
Показать

Если PowerShell не поможет - можно например вручную скормить Ваш pem ASN.1 декодеру (см выше), найти там 9 INTEGER подряд, перевести числа в байты, байты закодировать в BASE64, и вручную прописать в XML,
25. uno-c 235 09.10.20 17:07 Сейчас в теме
(22) Или еще вариант - конвертануть в pfx - а его уже powershell поймет
Convert PEM to PFX Format
openssl> pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt

Ну это все так, предположения, сам насколько помню, ни разу не пробовал )
26. betflop 11 09.10.20 18:39 Сейчас в теме
(25) Спасибо, я в итоге сделал с помощью этого скрипта, проверил совпадает.
https://github.com/MisterDaneel/PemToXml
27. betflop 11 14.10.20 13:35 Сейчас в теме
(25) Подскажите пожалуйста код SafeИзДвоичных , не получается сконвертировать Новый SafeComArray ?
18. FreeArcher 159 06.10.20 04:20 Сейчас в теме
(17) Спасибо, буду разбираться. А скажите, что такое этот ключ (BEGIN RSA PRIVATE KEY), что в файле лежит? Я почитал теорию RSA там математика вполне несложная если верить векипедии, на вход нужны числа, на выходе тоже числа. Но все сводится в вашем да и других алгоритмах к разбору этого ключа. Вобщем я наверное саму суть не понимаю....
19. uno-c 235 06.10.20 10:56 Сейчас в теме
(18)BEGIN RSA PRIVATE KEY - Это последовательность из девяти целых чисел в кодировке ASN.1 (DER). Второе, третье и четвертое число - это n,e,d - модуль, открытая и закрытая экспоненты. Последующие числа - это параметры для ускоренного расчета подписи. Вычисление подписи - это возведение в степень по модулю, расчет подписи с ускоренными параметрами - почти то же. Несложно.
20. FreeArcher 159 06.10.20 11:49 Сейчас в теме
(15) Скормил, как я понимаю нужных параметров нет?
Прикрепленные файлы:
21. uno-c 235 06.10.20 11:59 Сейчас в теме
(20)Все 8 нужных параметров на месте. Первый ноль не нужен )
В (17) я написал - что каждый из них значит.
29. v_vladislav 19.03.21 15:10 Сейчас в теме
Добрый День. Использую вашу обработку. Сделал все как вы выше писали. Доработку использую для ( RSA PRIVATE KEY). СтруктураСертификата сделал но вот ПолучитьПодписьSHA256RSA не удалось сделать так как подпись не верна.
Поискав обнаружил вот это код. Без него Подпись верна. Может ли быть проблема в этом?
	// PKCS #1 v2.2: RSA Cryptography Standard, 9.2 EMSA-PKCS1-v1_5
	// перед подписанием хеш дополняется данными
	// EM  = 0x00 || 0x01 ||PS  || 0x00 ||T
	// T SHA-256:  (0x)30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20 || H
	ЕМ = "0001" + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF­FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF­FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF­FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF­FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF­FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF­FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"+
	"00" + "3031300D060960864801650304020105000420" + ХешХексСтрока; 
	
	ХешХексСтрока = ЕМ;
Показать
28. v_vladislav 19.03.21 13:00 Сейчас в теме
(20)Добрый День. У вас получилось сделать подпись ключом и ее отдать яндекс навигатору? Сейчас сам этим занимаюсь. Подпись сделал, закидал в URL запускаю яндекс через ЗапуститьПриложение(), но ничего не работает.
31. FreeArcher 159 09.04.21 12:11 Сейчас в теме
(28) Нет, отложился этот вопрос. Да и приняли решения сделать через веб сервис на python.
Если у вас получится дайте знать.
33. uno-c 235 06.06.23 06:22 Сейчас в теме
(31) Полтора года назад еще сделал, только руки дошли на ИС выложить. https://infostart.ru/public/1875205/
32. Rustik666 14.09.21 17:03 Сейчас в теме
Добрый день!
Подскажите, есть пример на Python...нужно это сделать в 1с. Можно это сделать с помощью вашей обработки?...

Использование ЭЦП:
• ЭЦП сообщения формируется по телу HTTP-запроса;
• При формировании ЭЦП используется алгоритм RSA/SHA256;
• Информационные сообщения, подписанные электронной цифровой подписью, должны
иметь дополнительный параметр "x-sign" в заголовке HTTP запроса, содержащий ЭЦП
сообщения;

x-sign - это Заголовок запроса, в котором передается подпись запроса,
вычисленная по телу POST-запроса с использованием
приватного ключа мерчанта

Вот пример на Puthon
data = json.dumps(params)
secret_key='12345'
key = RSA.importKey(open('private_key.pem').read())
h = SHA256.new("{}{}".format(data,secret_key).encode('utf8')) signer =
PKCS1_v1_5.new(key)
signature = signer.sign(h)
x_sign = base64.b64encode(signature)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот