Как конвертировать сертификат RSA в формат с которым работает менеджер криптографии
Приветствую.
Что работать с сервисом яндекс навигатора, мне требуется шифровать запросы RSA ключом.
Ключ у меня в виде:
Менеджер криптографии 1С такой не понимает. Как-то могу я преобразовать этот ключ в нужный формат или нет?
Вобщем любая помощь приветствуется, у меня пока нет понимания всего этого зоопарка сертификатов и того, с чем из этого может работать 1С...
Что работать с сервисом яндекс навигатора, мне требуется шифровать запросы RSA ключом.
Ключ у меня в виде:
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJ
****
IIBOgIBAAJKF
-----END RSA PRIVATE KEY-----
Менеджер криптографии 1С такой не понимает. Как-то могу я преобразовать этот ключ в нужный формат или нет?
Вобщем любая помощь приветствуется, у меня пока нет понимания всего этого зоопарка сертификатов и того, с чем из этого может работать 1С...
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(30) Если кому-то до сих пор актуально - вот здесь решение выложил https://infostart.ru/public/1875205/
(4) Спасибо, за ссылку. Разбираюсь, но тяжело идет.
Выполнил парсинг ключа. Получил в обработке структуру. Но мне не понятно, что является итогом?
Мне нужно получить то, что в примере в переменой "signature":
И как передать строку, которую нужно зашифровать?
Выполнил парсинг ключа. Получил в обработке структуру. Но мне не понятно, что является итогом?
Мне нужно получить то, что в примере в переменой "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)
ПоказатьИ как передать строку, которую нужно зашифровать?
(5)
Если хотите питона домучить, то видимо (Ваш аналог этой строки примера).
Но я питона в руки ни разу не брал )
И не зашифровать, а подписать (ошибка употребления терминов в яндекс-инструкции).
И как передать строку, которую нужно зашифровать?
Если хотите питона домучить, то видимо
src_data='yandexnavi://show_point_on_map?lat=55.75&lon=37.64&zoom=14&client=007'
Но я питона в руки ни разу не брал )
И не зашифровать, а подписать (ошибка употребления терминов в яндекс-инструкции).
Менеджер криптографии 1С такой не понимает. Как-то могу я преобразовать этот ключ в нужный формат или нет?
Даже если заставите его понять - Менеджер Криптографии все равно не сможет сделать подпись RSASHA256, он этому не обучен.
Кроме того, в приведенной ссылке - инструкции Яндекса ошибка:
Затем зашифруйте полученную хэш-сумму с помощью ключа доступа ... openssl dgst -sha256 -sign key.pem
Тут идет не шифрование, а вычисление подписи (-sign) - а это разные процессы.
Подписи RSA с хешированием SHA256 умеют вычислять приведенные в (2) обработки. По крайней мере моя умеет - проверял на гугле )
В контексте моей обработки + пример из инструкции Яндекса: Вам нужно вычислить подпись (подпись типа двоичные данные) для строки "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"
Нашел мою обработку. Вот примерный код для Вашего случая, подписывал гугловским сертификатом:
Результат:
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...
Да
&НаСервере
Процедура ТестЯндексНаСервере()
ИсходнаяСтрока = "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...
Да
Не уверен, что моя обработка для гугла разберет яндексовский RSA PRIVATE KEY, если разберет - отпишитесь пжл.
Это касается строки
когда обработке скармливаешь не встроенный в нее гугл-ключ, а файл с яндексовским RSA PRIVATE KEY
Весь наверно не разберет, но для вычисления подписи ускоренным методом нужны только ключи структуры DP, P, DQ,Q, InverseQ, Exponent, Modulus
Последние два открытые параметра нужны только для проверки подписи, что не обязательно делать.
Если часть этих ключей отсутствует - то еще, возможно, есть вариант вычисления подписи медленным методом.
Это касается строки
СтруктураСертификата = ПолучитьСтруктуруСертификата();
когда обработке скармливаешь не встроенный в нее гугл-ключ, а файл с яндексовским 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); //открытый параметр ключа
Последние два открытые параметра нужны только для проверки подписи, что не обязательно делать.
Если часть этих ключей отсутствует - то еще, возможно, есть вариант вычисления подписи медленным методом.
Картинка у Вас очень похожая на гугловскую, только параметры короче по размеру, и SEQUENCE, который их содержит, в другом месте разбора лежит. А так - 9 штук INTEGER, видно короткую экспоненту (010001), видны 64-байтные (512 бит) модуль и секретный ключ , 32-байтные параметры для ускоренного вычисления подписи.
Очень похоже, что обработка нормально ключ разобрала, нужно ей только сказать, чтобы СтруктураСертификата взяла параметры из другого места разбора - и дальше пробовать подпись ими ставить )
Имею в виду вот это место нужно переделать - сказать чтобы в другом месте брал, там где девять интегеров у Вас лежит:
D - это кстати секретный ключ, им можно подпись ставить по медленному методу. Но у Вас и параметры для ускоренного выдало.
Имею в виду вот это место нужно переделать - сказать чтобы в другом месте брал, там где девять интегеров у Вас лежит:
//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) Я только *.p12 конвертил через powershell. Не знаю, поймет ли он openssl-овский
https://docs.microsoft.com/ru-ru/dotnet/api/system.security.cryptography.x509certificates.x509certificate2.import?view=netframework-4.8
Здесь пишут, что должен должен быть в стандарте X.509. Попробуйте, может в стандарте Ваш pem.
$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"
Здесь пишут, что должен должен быть в стандарте X.509. Попробуйте, может в стандарте Ваш pem.
(22) Вообще XML так выглядит:
Если PowerShell не поможет - можно например вручную скормить Ваш pem ASN.1 декодеру (см выше), найти там 9 INTEGER подряд, перевести числа в байты, байты закодировать в BASE64, и вручную прописать в 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,
(22) Или еще вариант - конвертануть в pfx - а его уже powershell поймет
Ну это все так, предположения, сам насколько помню, ни разу не пробовал )
Convert PEM to PFX Format
openssl> pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
Ну это все так, предположения, сам насколько помню, ни разу не пробовал )
(25) Спасибо, я в итоге сделал с помощью этого скрипта, проверил совпадает.
https://github.com/MisterDaneel/PemToXml
(17) Спасибо, буду разбираться. А скажите, что такое этот ключ (BEGIN RSA PRIVATE KEY), что в файле лежит? Я почитал теорию RSA там математика вполне несложная если верить векипедии, на вход нужны числа, на выходе тоже числа. Но все сводится в вашем да и других алгоритмах к разбору этого ключа. Вобщем я наверное саму суть не понимаю....
(18)BEGIN RSA PRIVATE KEY - Это последовательность из девяти целых чисел в кодировке ASN.1 (DER). Второе, третье и четвертое число - это n,e,d - модуль, открытая и закрытая экспоненты. Последующие числа - это параметры для ускоренного расчета подписи. Вычисление подписи - это возведение в степень по модулю, расчет подписи с ускоренными параметрами - почти то же. Несложно.
Добрый День. Использую вашу обработку. Сделал все как вы выше писали. Доработку использую для ( 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" + ХешХексСтрока;
ХешХексСтрока = ЕМ;
Показать
(31) Полтора года назад еще сделал, только руки дошли на ИС выложить. https://infostart.ru/public/1875205/
Добрый день!
Подскажите, есть пример на 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)
Подскажите, есть пример на 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)
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот