CryptoPro / corefx

This repo contains the .NET Core foundational libraries, called CoreFX. It includes classes for collections, file systems, console, XML, async and many others. We welcome contributions.
https://github.com/dotnet/core
MIT License
27 stars 7 forks source link

Кириллица в CN при создании сертификатов #49

Closed Fasjeit closed 3 years ago

Fasjeit commented 3 years ago

В настоящий момент при варке сертификата через CertificateRequest в самом сертификате кириллица отображается неверно. Смотреть в сторону функции CertStrToName. Пробовал сделать её интероп на unicode, и с ручным переводом в массив байт unicode строки с byte[] интеропом. Пока не вышло. Воспроизводится на Unix.

Тема на форуме: https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=125604#post125604

Danilovonline commented 3 years ago

Добрый день. Есть прогноз когда будет исправлен баг?

Fasjeit commented 3 years ago

Добрый день. На сл. неделе постараемся посмотреть.

Fasjeit commented 3 years ago

Основная проблема - использование функции CertStrToNameA. На Windows работало корректно, передавало данные в 1251. На Unix передавала данные в UTF8, от чего было кривое отображения.

Также была замечена ошибка на Windows, при отсутствии русской локали (видимо не использовалась 1251 по умолчанию).

Решили перейти на CertStrToNameW + KeySet.Unicode. На Windows всё завелось на английском, и ничего не поломалось на русском. Через стандартный маршалинг передаём строку.

На Unix чуть сложнее:

CertStrToNameW принимает имя в формате LPWSTR. Из jira:

Маршаллинг string в функции, принимающие LPWSTR. 
На windows WCHAR это 2 байта (UTF16), на линуксе - 4 (UTF32).

Поэтому делаем перевод руками перевод строки в UTF16 и передаём её как IntPrt в CertStrToNameW.

Всё заработало.

Ветвимся по таргетам как и раньше по разным файлам с partial классами (Cryptography/Pal.Windows/X509Pal.X500DistinguishedName.Unix.cs и X509Pal.X500DistinguishedName.Windows.cs), куда вынесли код функции X500DistinguishedNameEncode из X509Pal.X500DistinguishedName.cs.

Добавил пару тестов для Ascii и Unicode CN для гостовых сертификатов. Изменения в мастер ветке.

Fasjeit commented 3 years ago

@Danilovonline Можно смотреть изменения в последней сборке. win linux