Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Efim163  
#1 Оставлено : 9 февраля 2017 г. 17:14:54(UTC)
Efim163

Статус: Новичок

Группы: Участники
Зарегистрирован: 06.02.2017(UTC)
Сообщений: 5
Российская Федерация
Откуда: Москва

1.png (64kb) загружен 11 раз(а). 3.png (33kb) загружен 11 раз(а). 2.png (34kb) загружен 10 раз(а). Certificates_of_tax_services.7z (3kb) загружен 4 раз(а).Добрый день!
Разрабатываю сервер для подписи/шифрования документов на основе java8,JCP и glassfish.

Есть 4 сертификата, которые я хочу положить в хранилище доверенных сертификатов и на которые потом шифровать документы.
Сертификаты отправляются из другой системы по http.
При попытке их загрузить, 2 сертификата проходят, а при обработке IFNS_6320_20150903_20160903.cer получаю ошибку при преобразовании массива байтов в сертификат:
Код:
  
java.security.cert.CertificateParsingException: java.io.IOException: subject key, null
java.security.InvalidKeyException
  
        public static X509Certificate GetCertificateFromBytes(byte[] bytes) throws CertificateException {
        CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
        return (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(bytes));
    }




Прогрузились сертификаты IFNS_6320_20160406_20170406.cer и IFNS_6320_20141112_20151112.cer. При сравнении сертификата из файла и того что попал в контейнер видно что сертификат прогрузился некорректно. Сделал экспорт этого серта из хранилища, чтоб лучше было сравнивать, поменялось куча полей, в том числе и отпечаток.


Загружаю сертификаты в хранилище вот так:
Код:
    
public static String LoadCertToCertStore(Certificate cert, String alias, String store_path)
            throws CryptoServiceException {
        try {
            File file_cs = new File(store_path);
            KeyStore keystore = KeyStore.getInstance("CertStore");
            keystore.load(new FileInputStream(file_cs), Config.getPasswordFNSCertStore());
            keystore.setCertificateEntry(alias, cert);
            keystore.store( new FileOutputStream(file_cs), Config.getPasswordFNSCertStore() );
            return "success";
        } catch (Exception e) {
            e.printStackTrace();
            throw new CryptoServiceException("LoadCertToCertStores error." + e.getMessage());
        }
    }



Сертификаты и скриншоты приложил к сообщению.

Вопросы:

1.Почему сертификат IFNS_6320_20150903_20160903.cer не преобразовался должным образом?
2.Почему сертификаты прогружаются некорректно?
3.Как запустить ContrlolPane на русском?
Offline Евгений Афанасьев  
#2 Оставлено : 10 февраля 2017 г. 9:25:03(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Сертификат получен по http в неправильном виде и не устанавливается или он из хранилища доверенных сертификатов извлекается в неправильном виде?
Offline Евгений Афанасьев  
#3 Оставлено : 10 февраля 2017 г. 10:08:46(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Попробуйте так, у меня 4 сертификата из архива успешно записались (проверок нет):
Код:

public static void main(String[] args) throws Exception {

        if (args.length == 0) {
            System.out.println("Usage: <cert_store_path> <cert_store_password> <cert_file> <alias>");
            return;
        }

        String certStorePath = args[0];
        char[] certStorePassword = (args[1] != null && args[1].length() > 0) ? args[1].toCharArray() : null;

        String certPath  = args[2];
        String certAlias = args[3];

        File certStoreFile = new File(certStorePath);
        KeyStore keyStore = KeyStore.getInstance(JCP.CERT_STORE_NAME, JCP.PROVIDER_NAME);

        if (certStoreFile.exists()) {

            System.out.println("Loading certificate store...");
            FileInputStream storeInputStream = new FileInputStream(certStoreFile);

            keyStore.load(storeInputStream, certStorePassword);
            storeInputStream.close();

        } // if
        else {

            System.out.println("Creating certificate store...");
            keyStore.load(null, null);

        } // else

        X509Certificate cert = (X509Certificate) CertificateFactory
            .getInstance("X.509").generateCertificate(new FileInputStream(certPath));

        System.out.println("Saving certificate...");

        keyStore.setCertificateEntry(certAlias, cert);
        FileOutputStream storeOutputStream = new FileOutputStream(certStoreFile);

        keyStore.store(storeOutputStream, certStorePassword);
        storeOutputStream.close();

        System.out.println("Completed!");
        Enumeration<String> aliases = keyStore.aliases();

        while (aliases.hasMoreElements()) {

            String alias = aliases.nextElement();
            X509Certificate certificate = (X509Certificate) keyStore.getCertificate(alias);

            System.out.println("$ " + alias + ": ");
            System.out.println("subject: " + certificate.getSubjectDN());

            System.out.println("issuer:  " + certificate.getIssuerDN());
            System.out.println("--------------------------------------");

        } // while

    }

Код выполнялся поочередно для каждого сертификата, при первой записи хранилище создалось.
Offline Евгений Афанасьев  
#4 Оставлено : 10 февраля 2017 г. 10:25:21(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Автор: Efim163 Перейти к цитате
3.Как запустить ContrlolPane на русском?

Попробуйте так:
<JRE>/bin/java -Dfile.encoding=cp866 ru.CryptoPro.JCP.ControlPane.MainControlPane

Offline Efim163  
#5 Оставлено : 10 февраля 2017 г. 16:17:08(UTC)
Efim163

Статус: Новичок

Группы: Участники
Зарегистрирован: 06.02.2017(UTC)
Сообщений: 5
Российская Федерация
Откуда: Москва

Спасибо за ответы. В общем, всё дело было в преобразовании тела запроса в массив байтов, а потом в преобразовании этого массива в
во входной поток и сертификат. Переделал функционал на преобразовании тела запроса в поток и преобразование сразу потока в сертификат и все заработало.
Код:
    
public static X509Certificate GetCertificateFromInputStream(InputStream inputStream) throws CertificateException, CryptoServiceException {
        try {
        CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
        return (X509Certificate) certFactory.generateCertificate(inputStream);
        }catch (Exception e) {
            e.printStackTrace();
            throw new CryptoServiceException("GetCertificateFromInputStream.Cert not found" + e.getMessage());
        }
    }
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.