Опыт сообщества при использовании «КриптоПро ЭЦП Browser plug-in

Добрый день.
Просьба поделиться рекомендациями со стороны разработчиков платформы и тех, у кого уже есть опыт использования «КриптоПро ЭЦП Browser plug-in (https://www.cryptopro.ru/products/cades/plugin
для подписания файлов и/или экземпляров сущностей приложений, реализованных на CUBA Platform. Планируем реализовать работу с этим плагином в своем проекте, но предварительно хотелось бы, изучить опыт коллег.

2 симпатии

Может кто-то из участников сообщества реализовывал этот функционал через JCP ?

Я пробовал JCP. Боюсь только обзорно вам ответить не смогу. Спрашивайте, если есть вопросы, попробую ответить.

1 симпатия

JCP не обеспечивает требуемой нам гибкости. Он больше подходит для потокового шифрования/подписания с использованием 1 постоянного сертификата. А когда операторов много и у каждого из них свой персональный сертификат ЭЦП - приходится полагаться на окружение браузера, тогда код работы с криптографией можно унифицировать.

Странно, что для платформы, позиционируемой на рынке РФ в качестве “энтерпрайз” решения нет встроенного функционала для работы с ГОСТ криптографией …

Добрый день. В системе “ТЕЗИС” (https://www.tezis-doc.ru/), базированной на платформе CUBA мы используем для подписи этот самый плагин. В общих словах это реализовано следующим образом:
Для использования функционала плагина создан Javascript компонент (У нас на данный момент 7я версия vaadin поэтому даю ссылку на нее - https://vaadin.com/docs/v7/framework/gwt/gwt-javascript.html)

@JavaScript({
        "vaadin://resources/js/cadesplugin_api.js",
        "vaadin://resources/js/cryptopro.js" - наш скрипт с реализацией функций 
})
public class CryptoProJavaScriptComponent extends AbstractJavaScriptComponent {

    // Добавление функции которая будет вызвана из js скрипта при инициализации списка сертификатов
	// вызывается в конструкторе компонента
	addFunction("pluginLoaded", new JavaScriptFunction() {
		...
		notifyCertificatesLoaded(map); // map содержит thumbprint сертификата и его имя
	});
	
	// 
	addFunction("dataSigned", new JavaScriptFunction() {
		@Override
		public void call(JsonArray arguments) throws JSONException {
			notifyDataSigned(arguments.getString(0));
		}
	});

	//Функция для подписи
	public void sign(String dataToSign, Object certThumbprint, String hashAlgorithmValue) {  
		callFunction("sign", certThumbprint, dataToSign, hashAlgorithmValue);
	}

В скрипте cryptopro.js реализована клиентская часть подписи в частности функция sign, получающая на вход thumbprint сертификата, выбранного для подписи.
Реализацию самой подписи и работы с хранилищем сертификатов можно поискать на сайте crypto-pro, например https://cpdn.cryptopro.ru/content/cades/plugin-samples-sign.html

При запуске инициализации компонента формируется список сертификатов из хранилища сертификатов (т.е те которые установлены на клиентской машине в Крипто про csp), затем
он передается в функцию “pluginLoaded”, который формирует map-у сертификатов и передает в выпадающий список в окне, в котором происходит подписание. Затем пользователь
выбирает нужный ему сертификат и нажимает кнопку “Подписать” которая вызывает функцию sign() в нашем компоненте, передавая туда thumbprint сертификата для подписи.
После того как подпись сформирована скрипт вызывает функцию “dataSigned” и передает туда получившуюся подпись.

В итоге полученная подпись и сам сертификат сохраняются в базу данных, сама проверка подписи происходит с помощью средств JCP, пример - https://www.cryptopro.ru/forum2/default.aspx?g=posts&t=7567

3 симпатии

Спасибо большое, это то, что нужно