Если вы решили разрабатывать приложение на 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>
После запуска приложения выводится список установленных в реестре сертификатов.
Как реализовать подписание, шифрование и пр. вы сможете найти в документации в скачанном ранее с сайта крипто про архиве.
→ Репозиторий программы
В статье рассказывается как создать приложение и подключить к нему 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>
После запуска приложения выводится список установленных в реестре сертификатов.
Как реализовать подписание, шифрование и пр. вы сможете найти в документации в скачанном ранее с сайта крипто про архиве.
→ Репозиторий программы
Java CSP быстрый старт
Если вы решили разрабатывать приложение на Java + maven, которое должно работать с отечественной криптографией, то эта статья для вас. В статье рассказывается как создать приложение и подключить к...
habr.com