Добрый день!
Есть задача по реализации проверок для эцп на java, являюсь новичком в этой теме, поэтому есть вопросы которые хотел бы прояснить, думаю для многих будет полезно.
Проверки:
- Проверка срока действия регистрационного свидетельства, проверяю с помощью метода checkValidity, и диапазона времени notBefore и notAfter, класса X509Certificate.
- Проверка номера политики регистрационного свидетельства и разрешенных способах его использования, подписание в системе могут производить только физические лица, получаю OID из сертификата и сравниванию с OID физического лица (1.2.398.3.3.2.3), в случае несовпадения отказываю в подписании.
- Проверка области использования ЭЦП регистрационного свидетельства, получаю список значений области использования, пропускаю в случае положительных значений “Цифровая подпись” и “Неотрекаемость”.
- Проверка полномочий лица подписавшего документ, получаю из сертификата данные подписанта, проверяю данные в соответствии с требованиями системы.
- Проверка построения корректной цепочки сертификатов, создаю цепочку начиная с сертификата подписанта, далее промежуточный сертификат НУЦ (nca_rsa.crt), далее корневой сертификат КУЦ (root_rsa.crt) в качестве доверительного, для проверки цепочки использую метод CertPathValidator.validate().
- Проверка регистрационного свидетельства на отозванность (аннулирование), проверяю с помощью примера из SDK, в качестве эмитента использую сертификат НУЦ (nca_rsa.crt).
- Проверка метки времени, проверяю с помощью примера из SDK, в качестве параметра для метода MessageDigest.update() передаю сигнатуру подписи (XMLSignature.getSignatureValue()), далее получаю время.
Вопросы:
- Корректно ли выполнены проверки?
- Как выполнить проверку отозванности промежуточного и корневого сертификата? если я правильно понял через сервис OCSP это сделать невозможно, использовать CRL? тогда в корне для чего нужен OCSP, если в любом случае придется использовать CRL.
- Не совсем понятна логика с меткой времени, по требованиям нужно прикрепить время которое возвращает TSP к подписи, как это сделать, если как я понял нельзя подписывать на стороне сервера по законодательству? в данный момент я получаю уже подписанные данные с клиентской стороны, но и в этом случае я не могу добавить время, так как это будет считаться изменением подписи. Как вариант можно добавить время на клиентской стороне и подписать, в этом случае не будет использован сервис TSP на стороне сервера, или я неправильно понял?
- Есть ли какие то требования по использованию сертификатов КУЦ и НУЦ, хранить на их на сервере, или при каждой проверке подтягивать актуальные с pki.gov.kz?