Java CSP быстрый старт

от автора

Если вы решили разрабатывать приложение на Java + maven, которое должно работать с отечественной криптографией, то эта статья для вас.

В статье рассказывается как создать приложение и подключить к нему JavaCSP для работы с ГОСТ-овой криптографией. В качестве примера мы создадим программу, показывающую все сертификаты в регистре.

Целевая аудитория junior/middle разработчики, которым требуется реализовать подписание/шифрование на базе отечественной криптографии. И которые до этого не имели опыта работы с Крипто Про.

Java CSP — это по сути API, чтобы обратиться к уже установленному в системе Crypto Pro CSP. Сам модуль ничего не подписывает и не шифрует, а лишь обращается к уже установленному в системе Крипто Про.

Если вы уже разрабатывали maven приложения на java, то при необходимости добавить новый модуль в проект добавляли еще одну dependency в pom файл. У крипто про нет публичных maven репозиториев и поэтому потребуются дополнительные действия.

Вначале необходимо скачать Java CSP с официального сайта.

Распаковываете архив в удобном месте и стандартными командами устанавливаете библиотеки в локальный maven репозиторий

mvn install:install-file -Dfile=./libs/JCSP.jar \ -DgroupId=ru.cryptopro.jcp \ -DartifactId=jcp-jscp \ -Dversion=5.0.40363-A \ -Dpackaging=jar \

Необходимый минимум библиотек для установки есть в cprypto-install.sh в репозитории в конце статьи.

После установки в локальный maven репозиторий можно добавлять библиотеки JavaCSP как зависимости в pom файл

<dependency>    <groupId>ru.cryptopro.jcp</groupId>    <artifactId>jcp-jscp</artifactId>    <version>5.0.40363-A</version> </dependency>

К счастью начиная с java 10 более нет необходимости устанавливать Java CSP непосредственно в jre. Достаточно инициализировать его непосредственно в программе.

System.setProperty("file.encoding", "UTF-8"); Security.addProvider(new JCSP()); // провайдер JCSP Security.addProvider(new RevCheck());// провайдер проверки сертификатов JCPRevCheck //(revocation-провайдер) Security.addProvider(new CryptoProvider());// провайдер шифрования JCryptoP

Теперь нам нужно получить хранилище ключей, из него имена сертификатов и сами сертификаты

KeyStore ks = KeyStore.getInstance("REGISTRY", "JCSP"); ks.load(null, null); Enumeration<String> aliases = ks.aliases(); while (aliases.hasMoreElements()) {    Certificate cert = ks.getCertificate(aliases.nextElement());    if (cert == null) {        continue;    }    if (!(cert instanceof X509Certificate)) {       continue;    }    X509Certificate curCert = (X509Certificate) cert;    System.out.println(CertUtil.subjectCN(curCert)); }

Остался последний шаг — собрать наше приложение. Обратите внимание — при работе  Java CSP проверяет свои библиотеки на версию и md5 (RevCheck). При сборке “толстого” jar файла RevCheck проверяет версию и md5 всего “толстого” jar файла. Идет сравнение с заложенными в RevCheck значениями. Ну и конечно такая проверка не проходит. Поэтому необходимо собирать “тонкий” jar с внешними библиотеками.

Для этого мы используем maven-dependency-plugin для сборки зависимостей, maven-jar-plugin для сборки самого приложения и maven-assembly-plugin для сборки всего приложения с библиотеками в zip архив.

<build>    <finalName>${project.name}</finalName>    <plugins>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-dependency-plugin</artifactId>            <executions>                <execution>                    <id>copy-dependencies</id>                    <phase>prepare-package</phase>                    <goals>                        <goal>copy-dependencies</goal>                    </goals>                    <configuration>                        <outputDirectory>                            ${project.build.directory}/libs                        </outputDirectory>                    </configuration>                </execution>            </executions>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-jar-plugin</artifactId>            <configuration>                <archive>                    <manifest>                        <addClasspath>true</addClasspath>                        <classpathPrefix>libs/</classpathPrefix>                        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>                        <mainClass>                            site.barsukov.java_csp.Application                        </mainClass>                    </manifest>                </archive>            </configuration>        </plugin>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-assembly-plugin</artifactId>            <executions>                <execution>                    <phase>package</phase>                    <goals>                        <goal>single</goal>                    </goals>                    <configuration>                        <appendAssemblyId>false</appendAssemblyId>                        <descriptors>                            <descriptor>src/main/resources/assembly.xml</descriptor>                        </descriptors>                        <finalName>${project.artifactId}-${project.version}</finalName>                        <outputDirectory>${project.build.directory}/distr</outputDirectory>                    </configuration>                </execution>            </executions>        </plugin>    </plugins> </build>

После запуска приложения выводится список установленных в реестре сертификатов. 

Как реализовать подписание, шифрование и пр. вы сможете найти в документации в скачанном ранее с сайта крипто про архиве.

Репозиторий программы


ссылка на оригинал статьи https://habr.com/ru/articles/573622/