Добрый день!
Используется Крипто Про CSP 3.0 KC1.
Существует центр управления и контроля (ЦУК) и нцать клиентов. Для всех Уд. центром сформированы контейнеры закрытых ключей+сертификаты личные+сертификаты УЦ.
Успешно, с Вашей помощью, выполнили следующую задачу:
Реализована схема обмена информацией Подпись на клиенте (CryptSignMessage) -> Шифрование (CryptEncrypt) ==(передача)==> Расшифровка (CryptDecrypt) -> Проверка подписи (CryptVerifyMessageSignature).
При проверке подписи ручками дополнительно вытащили:
pSignerBack.pCertInfo.NotBefore(NotAfter)
и
CertGetNameStringA (pSignerBack,
2,
0,
nil,
@pszNameString,
128 );
Углубились...
Подскажите, пожалуйста:
1. Данная схема работает и при "просроченном" личном сертификате, и при отсутствии информации о поставщике сертификата (т.е. личный установлен, а сертификаты УЦ не установлены). Получается, функция CryptSignMessage такую проверку не осуществляет.
Можно ли, используя функции КриптоПро, программно вытаскивать эту информацию, чтобы, к примеру, запретить на пользователе шифрование-подпись, если сертификат ненадежен, или срок действия окончился.
Или это возможно только ручками, при проверке в ЦУКе: pSignerBack.pCertInfo.NotBefore(NotAfter) + сравнение с системной датой. Тогда как вытащить информацию по надежности сертификата (наличию у клиента не только личного сертификата, но и сертификатов УЦ)?
2. CertGetNameStringA выдает string-ом весь Subject с разделителем ',' или #13#10. Вид: "post@mail.ru, RU, Пермская, Пермь, Имя Организации, cert name...
В оснастке КриптоПро можно обнаружить, что поле Subject имеет атрибуты: E, C, S, L, O, CN, OID.
Вид такой: E=post@mail.ru, C=RU, S=Пермская, L=Пермь, O=Имя организации, CN=certname, OID.1.2.840.113549.1.9.2=INN
Насколько я понимаю, эти атрибуты стандартизованы.
Можно ли, и как вытаскивать не весь Subject стрингом, а только конкретный атрибут для проверки, например, только O или CN?
Спасибо.