Пререквизиты:
- докер контейнер, базовый образ mcr.microsoft.com/dotnet/aspnet:6.0-bullseye-slim (debian 11),
- .net6
Версии пакетов криптопро:
cprocsp-curl-64 5.0.12000-6
cprocsp-pki-cades-64 2.0.14660-1
lsb-cprocsp-base 5.0.12000-6
lsb-cprocsp-ca-certs 5.0.12000-6
lsb-cprocsp-capilite-64 5.0.12000-6
lsb-cprocsp-devel 5.0.12000-6
lsb-cprocsp-kc1-64 5.0.12000-6
lsb-cprocsp-rdr-64 5.0.12000-6
Сертификат получен на сайте Тестового УЦ (http://testgost2012.cryptopro.ru/certsrv/certrqma.asp)
Экспорт производится командой certmgr -export -pfx -dest test.pfx -pin password (в хранилище my на момент экспорта только один сертификат со связанным приватным ключом).
Проблема:
Нужно проверять пароль к .pfx при перед импортом содержимого. Для этого использую функцию PFXVerifyPassword. На пустом пароле проверка работает исправно. Но если пароль установлен, то при проверке получаю ошибку (код 86, The specified network password is not correct). Есть подозрение, что что-то не то с маршаллингом, перепробовал различные варианты и их комбинации:
- указывал различные Charset'ы
- передавал IntPtr на строку с использованием функций Marshal.StringToHGlobalAnsi()/ Marshal.StringToHGlobalUni()/ Marshal.StringToHGlobalAuto()
- передавал IntPtr через SafePasswordHandle.DangerousGetHandle()
Сигнатура такая на текущий момент (тип поля szPassword менялся соответственно при изменении способа передачи параметра в функцию):
Код:
[DllImport("libcapi20.so", CharSet = CharSet.Auto, EntryPoint = "PFXVerifyPassword", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool PFXVerifyPassword(
[In] ref DATA_BLOB pPfx,
[In, MarshalAs(UnmanagedType.LPWStr)] string szPassword,
[In] uint dwFlags = 0);
Проверка на то, что это действительно валидный pfx, проходит (вызов функции PFXIsPFXBlob()).
Подскажите, пожалуйста, в чем может быть проблема?