Процесс проверки эцп

Добрый день!
Есть задача по реализации проверок для эцп на java, являюсь новичком в этой теме, поэтому есть вопросы которые хотел бы прояснить, думаю для многих будет полезно.

Проверки:

  1. Проверка срока действия регистрационного свидетельства, проверяю с помощью метода checkValidity, и диапазона времени notBefore и notAfter, класса X509Certificate.
  2. Проверка номера политики регистрационного свидетельства и разрешенных способах его использования, подписание в системе могут производить только физические лица, получаю OID из сертификата и сравниванию с OID физического лица (1.2.398.3.3.2.3), в случае несовпадения отказываю в подписании.
  3. Проверка области использования ЭЦП регистрационного свидетельства, получаю список значений области использования, пропускаю в случае положительных значений “Цифровая подпись” и “Неотрекаемость”.
  4. Проверка полномочий лица подписавшего документ, получаю из сертификата данные подписанта, проверяю данные в соответствии с требованиями системы.
  5. Проверка построения корректной цепочки сертификатов, создаю цепочку начиная с сертификата подписанта, далее промежуточный сертификат НУЦ (nca_rsa.crt), далее корневой сертификат КУЦ (root_rsa.crt) в качестве доверительного, для проверки цепочки использую метод CertPathValidator.validate().
  6. Проверка регистрационного свидетельства на отозванность (аннулирование), проверяю с помощью примера из SDK, в качестве эмитента использую сертификат НУЦ (nca_rsa.crt).
  7. Проверка метки времени, проверяю с помощью примера из SDK, в качестве параметра для метода MessageDigest.update() передаю сигнатуру подписи (XMLSignature.getSignatureValue()), далее получаю время.

Вопросы:

  1. Корректно ли выполнены проверки?
  2. Как выполнить проверку отозванности промежуточного и корневого сертификата? если я правильно понял через сервис OCSP это сделать невозможно, использовать CRL? тогда в корне для чего нужен OCSP, если в любом случае придется использовать CRL.
  3. Не совсем понятна логика с меткой времени, по требованиям нужно прикрепить время которое возвращает TSP к подписи, как это сделать, если как я понял нельзя подписывать на стороне сервера по законодательству? в данный момент я получаю уже подписанные данные с клиентской стороны, но и в этом случае я не могу добавить время, так как это будет считаться изменением подписи. Как вариант можно добавить время на клиентской стороне и подписать, в этом случае не будет использован сервис TSP на стороне сервера, или я неправильно понял?
  4. Есть ли какие то требования по использованию сертификатов КУЦ и НУЦ, хранить на их на сервере, или при каждой проверке подтягивать актуальные с pki.gov.kz?

наверное тот человек кто отвечал уволился…

Здравствуйте.

  1. В принципе правильно. Для упрощения шагов можете посмотреть следующий сниппет https://gist.github.com/as1an/8533a5c3f9ae9787de50a44457b242b8 , с помощью которого можно построить цепочку, проверить дату и на отозванность. Если вы формируете XAdES, то там вроде нужно хешировать подпись вместе с тегами и потом передавать в сервис TSA (time-stamping authority).
  2. Проверка промежуточных и корневых сертификатов выполняется через CRL. Они обновляются намного реже, чем пользовательские сертификаты. И размер гораздо меньше. OCSP избавляет от необходимости постоянно скачивать полные и дельта CRL.
  3. Сервис TSA имеет свой ключ и свой сертификат. Он всего лишь подтверждает, что в определенный момент времени существовал хеш конкретных данных. Обычно это хеш подписи. Полученная от сервиса квитанция прикрепляется в неподписываюмую часть данных - в CMS это unsignedAttributes.
  4. Сертификаты КУЦ и НУЦ могут быть закешированы где-то на сервере, чтобы не скачивать их постоянно. И можно проверять на отозванность, обновляя CRL по мере устаревания.