Closed Fasjeit closed 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 для гостовых сертификатов. Изменения в мастер ветке.
В настоящий момент при варке сертификата через CertificateRequest в самом сертификате кириллица отображается неверно. Смотреть в сторону функции
CertStrToName
. Пробовал сделать её интероп на unicode, и с ручным переводом в массив байт unicode строки сbyte[]
интеропом. Пока не вышло. Воспроизводится на Unix.Тема на форуме: https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=125604#post125604