Инструкция по использованию примера проверки подписи сообщения на языке Java

Компиляция и запуск примера:

  1. Загрузите по адресу https://dealer.e-port.ru/cp/ca?cert=1 и сохраните в файл eport.cer сертификат публичного ключа ЭЦП e-port
  2. Импортируйте сертификат в хранилище командой
    keytool -import -keystore kkm.kst -storepass qwerty 
    -file eport.cer -alias eport -noprompt
    
  3. Создайте каталог ru\eport\demo в котором разместите файлы
    1. CheckSign.java с текстом из примера
    2. Base64.java, с текстом доступным по ссылке
  4. Скомпилируйте приложение командой
    javac ru\eport\demo\*.java
    
  5. Запустите программу командой
    java -cp . ru.eport.demo.CheckSign
    

package ru.eport.demo;

import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.security.KeyStore;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.Certificate;

public class CheckSign {
	private static final String TRANSFER_ENCODING = "windows-1251";
	
	public static void main(String args[]) {
		try {
	        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
	        //Файл-хранилище ключей (keystore)
	        String keyStoreFile = "kkm.kst";
	        FileInputStream fis = new FileInputStream(keyStoreFile);
	        //Пароль хранилища ключей
	        String keyStorePassword = "qwerty";
	        //Загрузка ключа
	        keyStore.load(fis, keyStorePassword.toCharArray());
	        fis.close();
	        //Название сертификата e-port
	        String eportAlias = "eport";
	        //Загрузка сертификата e-port
	        Certificate cert = keyStore.getCertificate(eportAlias);
	        if(cert == null) throw new Exception("Server certificate not found");
	        //Получение публичного ключа
	        PublicKey publicKey = cert.getPublicKey();
	        
	        String text = "test"; //подписанные данные
	    	//Данные в формате для подписи
	    	byte [] data;
	    	try {
	    		//Получение байтов в нужной кодировке
	    		data = text.getBytes(TRANSFER_ENCODING);
	    	} catch (UnsupportedEncodingException e) {
	    		data = text.getBytes();
	    	}
	    	//Подпись в формате base64
	    	String subscriptText = "brmgSFt7jcL4qOoVdg49S9DkgZt9VwP2mnaBgBX/IPiezQfbGBPVesMYH099+jJrq3BNCb4mUciLK8Vx/UDUfl06u6"+ 
	    	"gc5eBdtorns3EApG9JtbiEaxZvhtXfI7OzjpjctcAKo8J9jIriQZEbAachy2wy2BBNCYlWalHPkWhdFKM=";
	    	//Разбор формата Base64
	    	byte [] subscript = Base64.decode(subscriptText);
	    	
	    	try {
	    		//инициализация подписи
		    	Signature signature = Signature.getInstance("MD5withRSA");
		        signature.initVerify(publicKey);
		        //создание подписис с данными
		        signature.update(data);
		        //проверка подписи
		        System.out.println(signature.verify(subscript) ? "Подписано верно": "Подписано не верно");
	    	} catch (Exception e) {
	    		System.out.println("Подписано неверно");
	    	}

		} catch (Exception e) {
			System.err.println("Ошибка при проверке подписи");
			e.printStackTrace();
		}
	}
}