Aleksandr-ru / RusCryptoJS

JS для Российской криптографии (ГОСТ)
https://aleksandr-ru.github.io/RusCryptoJS
GNU General Public License v3.0
61 stars 24 forks source link

Двойные кавычки в DN CSR #11

Closed Waiker closed 3 years ago

Waiker commented 3 years ago

Приветствую. При формирование CSR запроса( с вашей тестовой страницы) некорректно обрабатываются двойные кавычки. Например строка в DN - "O": "ОАО \"Серьезные люди\"", после расшифровки полученного CSR ( например certutil -dump) Будет содержать O=ОАО Серьезные люди, без двойных кавычек, как должно быть ООО "Серьезные люди". Пробовал различные варианты экранирования, не помогает.

Waiker commented 3 years ago

@Aleksandr-ru

Aleksandr-ru commented 3 years ago

данной проблеме подвержено только крипто-про. на текущем этапе развития нет возможности передать двойные кавычки внутрь RDN, никакие классические способы экранирования не дают эффекта.

приведенное в документации описание так же не имеет эффекта, возможно это проблема специфичная для веб-реализации через крипто-про.

в качестве фикса двойные кавычки заменяются на одинарные (вместо отбрасывания как было раньше).

ЗЫ если есть идеи лучше или комбинации флагов, решающие проблему - велкам)

Waiker commented 3 years ago

#в качестве фикса двойные кавычки заменяются на одинарные (вместо отбрасывания как было раньше).

Не понимаю как использовать хотя бы одинарные, в вашем примере с \" кавычки исчезают полностью.

Aleksandr-ru commented 3 years ago

Убедитесь, что используете версию 2.5.3. Если пользуетесь демо-страницей https://aleksandr-ru.github.io/RusCryptoJS попробуйте очистить кеш или открыть в приватном окне или в консоли разработчика отключить кеширование.

Создайте запрос на сертификат из данных в примере.

Откройте сформированный запрос в любом ASN1 декодере и убедитесь, что там есть UTF8String ОАО 'Серьезные люди'

Aleksandr-ru commented 3 years ago

еще немного документации вдогонку см. про "Printable T61"

Waiker commented 3 years ago

Спасибо. Прочел, так понимаю тип Printable T61 не подразумевает символа двойных кавычек ". Но тот-же тестовый УЦ Крипто-Про успешно генерирует запрос с двойными кавычками.

Aleksandr-ru commented 3 years ago

Дело тут не в УЦ, который действительно прекрасно выпускает сертификаты с кавычками от других скзи, а в процессе создания CSR в вебе через крипто-про. см. https://github.com/Aleksandr-ru/RusCryptoJS/blob/master/src/CryptoPro/index.js#L252 В отличие от нормальных скзи, в крипто про DN нужно подавать строкой, а не объектом. В строке, согласно XCN_CERT_X500_NAME_STR (см. доку выше) RDN должен быть заключен в кавычки если содержит пробелы или кавычки. Но не смотря на это, если в заключенном в кавычки значении есть кавычки внутри, они отбрасываются, никакие способы экранирования кавычек в кавычках не помогают, видимо это еще один подарочек от крипто-про. Поэтому пока лучшим решением остается автозамена двойных кавычек на одинарные.

Waiker commented 3 years ago

УЦ от КриптоПро используется веб версию плагина, отрабатывает корректно. Правда не на всех браузерах.

Mironenko commented 3 years ago

Добрый день. изображение В CN был указан "asdasd".

Waiker commented 3 years ago

тройные двойные тоже не помогают

Mironenko commented 3 years ago

тройные двойные тоже не помогают

Естественно, не помогают, потому что еще и флажок тут надо поменять на правильный (2097152).

Waiker commented 3 years ago

Спасибо @Mironenko , но не понимаю как корректно исправить.

Aleksandr-ru commented 3 years ago

@Mironenko спасибо за инфо, будем внедрять)

Aleksandr-ru commented 3 years ago

забавно что в разных веб интерфейсах у них разный код:

https://www.cryptopro.ru/sites/default/files/products/cades/demopage/async_code.js

var CommonName = "Test Certificate";
yield DistinguishedName.Encode("CN=\""+CommonName.replace(/"/g, "\"\"")+"\"");

https://testgost2012.cryptopro.ru/certsrv/async_code.js

var XCN_CERT_NAME_STR_ENABLE_PUNYCODE_FLAG = 2097152;  
var X500DistinguishedName = yield cadesplugin.CreateObjectAsync("X509Enrollment.CX500DistinguishedName");
yield X500DistinguishedName.Encode(args[1], XCN_CERT_NAME_STR_ENABLE_PUNYCODE_FLAG);

хотя судя по документации https://docs.microsoft.com/en-us/windows/win32/api/certenroll/nf-certenroll-ix500distinguishedname-encode его ставить нет смсла

XCN_CERT_NAME_STR_ENABLE_PUNYCODE_FLAG is automatically set regardless of any other flag you specify.
Aleksandr-ru commented 3 years ago

В первом приближении проблема решена способом от "производителя" см. выше (кавычки экранируются кавычками). CSR формируется корректный. Сертификат так же корректный

-----BEGIN CERTIFICATE-----
MIIEvDCCBGugAwIBAgITEgBbrfYfHw6V2C/+wAABAFut9jAIBgYqhQMCAgMwfzEj
MCEGCSqGSIb3DQEJARYUc3VwcG9ydEBjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJV
MQ8wDQYDVQQHEwZNb3Njb3cxFzAVBgNVBAoTDkNSWVBUTy1QUk8gTExDMSEwHwYD
VQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDIwHhcNMjExMjAzMTQ0NjM1WhcN
MjIwMzAzMTQ1NjM1WjCCAbUxFjAUBgUqhQNkAxILMDAwMDAwMDAwNTIxGDAWBgUq
hQNkARINMDAwMDAwMDAwMDAyNDEaMBgGCCqFAwOBAwEBEgwwMDAwMDAwMDAwNzYx
IDAeBgkqhkiG9w0BCQEWEWV4YW1wbGVAZG9tYWluLnJ1MQswCQYDVQQGEwJSVTEc
MBoGA1UECAwTNzcg0LMuINCc0L7RgdC60LLQsDEZMBcGA1UEBwwQ0LMuINCc0L7R
gdC60LLQsDEtMCsGA1UECgwk0J7QkNCeICLQodC10YDRjNC10LfQvdGL0LUg0LvR
jtC00LgiMSgwJgYDVQQLDB/QntGC0LTQtdC7INC80LDRgNC60LXRgtC40L3Qs9Cw
MSYwJAYDVQQJDB3Rg9C7LiDQmNCy0LDQvdC+0LLRgdC60LDRjyA5OTEyMDAGA1UE
DAwp0JTQuNGA0LXQutGC0L7RgCDQtNC10L/QsNGA0YLQsNC80LXQvdGC0LAxETAP
BgNVBCoMCNCY0LLQsNC9MRUwEwYDVQQEDAzQmNCy0LDQvdC+0LIxHjAcBgNVBAMM
FdCX0JDQniAi0JjQstCw0L3Ri9GHIjBmMB8GCCqFAwcBAQEBMBMGByqFAwICIwEG
CCqFAwcBAQICA0MABECINwEPV1Cw+aFSslGvIrbDNA47TGJp3Oy6/4d5kHWxzuBJ
ZpkjS2nqwx0CStc+M55HdYbYcpIjNJVEH54kGNJIo4IBgTCCAX0wDwYDVR0PAQH/
BAUDAwfwADAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwHQYDVR0OBBYE
FEO8WOz1oAzL1NPx8oSPl364X9f/MB8GA1UdIwQYMBaAFE6DPhRp7+xdepUrXxH+
NzIWSVUrMFwGA1UdHwRVMFMwUaBPoE2GS2h0dHA6Ly90ZXN0Y2EuY3J5cHRvcHJv
LnJ1L0NlcnRFbnJvbGwvQ1JZUFRPLVBSTyUyMFRlc3QlMjBDZW50ZXIlMjAyKDEp
LmNybDCBrAYIKwYBBQUHAQEEgZ8wgZwwZAYIKwYBBQUHMAKGWGh0dHA6Ly90ZXN0
Y2EuY3J5cHRvcHJvLnJ1L0NlcnRFbnJvbGwvdGVzdC1jYS0yMDE0X0NSWVBUTy1Q
Uk8lMjBUZXN0JTIwQ2VudGVyJTIwMigxKS5jcnQwNAYIKwYBBQUHMAGGKGh0dHA6
Ly90ZXN0Y2EuY3J5cHRvcHJvLnJ1L29jc3Avb2NzcC5zcmYwCAYGKoUDAgIDA0EA
dvj8tvYue30HNRNBWYFnEhQOJIDs0tlpWdj21qcUt5kI7G5pKzlWaIlP4VsVoSOL
EWyetqwpug7JFlvJIrjNTQ==
-----END CERTIFICATE-----

Но вот отображение у крипто-про страдает, все лишние кавычки приезжают в Subject. Проблема так же воспроизводится на официальной тестовой странице. В качестве решения лишние кавычки вычищаются при сборки DN из строки, но в строке остаются, чтоб не закапывать проблему глубоко.