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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Тимур Шарипов  
#1 Оставлено : 11 июля 2024 г. 17:09:57(UTC)
Тимур Шарипов

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

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

Сказал(а) «Спасибо»: 2 раз
Добрый день.
Есть задача улучшить подписи CAdES-BES до CAdES-A, но есть нюанс, что в сертификатах этих подписей не указана ссылка на OCSP сервис. Поэтому, при улучшении мы получаем ошибку:
Цитата:
must have OCSP evidence but it doesn't contain any OCSP reference(s) or service(s) is(are) unavailable. OCSP evidence is not found

Судя по документации, в метод усовершенствовании (enhance) можно передать CRL, что мы и попробовали сделать:
Цитата:

X509CRL crl = (X509CRL) CertificateFactory.getInstance("X.509").generateCRL(new FileInputStream(Configuration.CRL_FILENAME));
List<X509CRL> crlList = Collections.singletonList(crl);
srcSigner = srcSigner.enhance(config.getProviderName(),
digestAlgOID,
chain,
crlList,
config.getTSAAddress(),
CAdESType.CAdES_A,
(AttributeTable)null);


Но ошибка не поменялась.

Вопросы:
1. Можно ли в этом случаем заменить OCSP на CRL? это работает?)
2. Какие варианта решения можете посоветовать?

Wanna join the discussion?! Login to your Форум КриптоПро forum account. Новые регистрации запрещены.

Offline Санчир Момолдаев  
#2 Оставлено : 11 июля 2024 г. 17:15:39(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 101 раз
Поблагодарили: 291 раз в 271 постах
Добрый день!

1. нельзя.
2. найти или сделать самостоятельно OCSP сервер и использовать его адрес при enhance
Техническую поддержку оказываем тут
Наша база знаний
Offline Тимур Шарипов  
#3 Оставлено : 11 июля 2024 г. 17:17:52(UTC)
Тимур Шарипов

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

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

Сказал(а) «Спасибо»: 2 раз
Автор: Санчир Момолдаев Перейти к цитате
Добрый день!

1. нельзя.
2. найти или сделать самостоятельно OCSP сервер и использовать его адрес при enhance


2. А как его туда передать? Есть пример?
Offline Санчир Момолдаев  
#4 Оставлено : 11 июля 2024 г. 17:27:20(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 101 раз
Поблагодарили: 291 раз в 271 постах
нужна актуальная версия СКЗИ
https://www.cryptopro.ru...&m=145856#post145856
> JCP 2.0.45041 / 2.0.45042-A

Цитата:
cades: добавлена возможность настроить доверие сертификату сторонней OCSP службы (JCP-2184)
cades: добавлена возможность указать программно или в java-свойствах дополнительные адреса альтернативных источников доказательств - OCSP служб (JCP-2188)


соответственно нужно сеттать Options
Код:
    public static Options setSingleOcsp(Options options) {
        return options.setRevocationURLStrategy(
                new SingleRevocationURLStrategy() {
                    @Override
                    public RevocationURL get(ValidatingData validatingData) throws AdESException {
                        return new RevocationURL() {
                            @Override
                            public ConnectionParameters getConnectionParameters() {
                                return null;
                            }

                            @Override
                            public RevocationURLActionOnError onError(Throwable throwable) {
                                return null;
                            }

                            @Override
                            public String get() {
                                return OCSP;
                            }
                        };
                    }
                }
        );
    }

    public static Options setAuthorizedOCSPs(Options options, String[] thumbs) {
        return options.setRevocationPermissions(new RevocationPermission() {
            @Override
            public boolean isAuthorizedIssuer(ValidatingPermissionData validatingPermissionData) {
                X509Certificate cert = validatingPermissionData.getValidatingRevocationData().getCertificate();
                try {
                    MessageDigest digest = MessageDigest.getInstance("SHA-1");
                    digest.update(cert.getEncoded());
                    String thumb = bytesToHex(digest.digest());
                    boolean result = false;
                    for (String walk : thumbs)
                        if (thumb.equalsIgnoreCase(walk)) {
                            result = true;
                            break;
                        }
                    return result;

                } catch (NoSuchAlgorithmException | CertificateEncodingException e) {
                    throw new RuntimeException(e);
                }
            }
        });
    }

    public static Options setOcspList(Options options) {
        return options.setRevocationURLStrategy(new CollectionRevocationURLStrategy() {
            @Override
            public RevocationURLCollection get(ValidatingData validatingData) throws AdESException {
                return new RevocationURLCollection() {
                    @Override
                    public Collection<RevocationURL> get() {
                        return Collections.singleton(
                                new RevocationURL() {
                                    @Override
                                    public ConnectionParameters getConnectionParameters() {
                                        return null;
                                    }

                                    @Override
                                    public RevocationURLActionOnError onError(Throwable throwable) {
                                        return null;
                                    }

                                    @Override
                                    public String get() {
                                        return OCSP;
                                    }
                                }
                        );
                    }
                };
            }
        });
    }


javadoc https://docs.cryptopro.r...javadoc/CAdES/index.html

либо через проперти.
Код:
System.setProperty("ru.CryptoPro.AdES.ocsp.responderURL", "http://.../ocsp.srf");
System.setProperty("ru.CryptoPro.AdES.ocsp.responderCertIssuerName", "CN = CadesTest PKI 2012 Root,OU = Cades Testing,O = OOO Crypto-Pro,C = RU");

их же можно задать через -D
но приоритет тут у AIA. т.е. через проперти будет медленнее.
через код более гибкая настройка

Отредактировано пользователем 11 июля 2024 г. 17:36:15(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
Тимур Шарипов оставлено 12.07.2024(UTC)
Offline Тимур Шарипов  
#5 Оставлено : 18 июля 2024 г. 15:43:44(UTC)
Тимур Шарипов

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

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

Сказал(а) «Спасибо»: 2 раз
Здравствуйте,
подскажите, если идти по пути настройки через Options, правильно ли я понимаю, что:

  • параметр OCSP == responderUR (указывается URL OCSP)
  • параметр String[] thumbs== responderCertIssuerName(указывается сертификат)?

Offline Санчир Момолдаев  
#6 Оставлено : 22 июля 2024 г. 10:45:42(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 101 раз
Поблагодарили: 291 раз в 271 постах
1. да
2. указываются отпечатки сертификатов сторонних ocsp которым вы доверяете.

например есть Федеральное Казначейство у которого нет ocsp. но вам нужен xlt1 с ними. создаете свой экземпляр службы ocsp. в коде указываете его и доверяете ему, то у вас xlt1 будут созданы.
но проверяться они будут только у вас или только там где настроено доверие к отпечаткам сертификатов уполномеченных OCSP.

можно ли доверять ответу ООО Рога и Копыта о том что сертификат клиента Федерального Казначейства не отозван?
Техническую поддержку оказываем тут
Наша база знаний
Offline Тимур Шарипов  
#7 Оставлено : 25 июля 2024 г. 16:28:58(UTC)
Тимур Шарипов

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

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

Сказал(а) «Спасибо»: 2 раз
Автор: Санчир Момолдаев Перейти к цитате
1. да
2. указываются отпечатки сертификатов сторонних ocsp которым вы доверяете.

например есть Федеральное Казначейство у которого нет ocsp. но вам нужен xlt1 с ними. создаете свой экземпляр службы ocsp. в коде указываете его и доверяете ему, то у вас xlt1 будут созданы.
но проверяться они будут только у вас или только там где настроено доверие к отпечаткам сертификатов уполномеченных OCSP.

можно ли доверять ответу ООО Рога и Копыта о том что сертификат клиента Федерального Казначейства не отозван?


Добрый день.
УЦ нам выдал адрес OCSP сервиса.

Сейчас у нас такой код, но ошибка сохраняется, можете подсказать, что сделано не так?

Комментарий по String[] cRLs, это массив из строк, где первый элемент это адрес OCSP, а все остальные это отпечатки сертификатов.
Цитата:

2024-07-25 16:01:53.983 ERROR 1 --- [http-nio-8094-exec-7] c.d.c.impl.methods.SignatureService : http://pki-n.skbkontur.ru/ocspn1000000/ocsp.srf
2024-07-25 16:01:53.984 ERROR 1 --- [http-nio-8094-exec-7] c.d.c.impl.methods.SignatureService : 0deef415a8250b5e8091b9c41584104950f03007
2024-07-25 16:01:53.984 ERROR 1 --- [http-nio-8094-exec-7] c.d.c.impl.methods.SignatureService : 4226f2a6576f7c9b4ed41e17f07ef2f85b86bb95


Код:

private static byte[] enhanceSignatureInternal(IConfig config, SignatureActionRequest request, String[] cRLs) throws CAdESException {
        var signature = new CAdESSignature(request.getSignatureData(), request.getSignedData(), null);
        CryptoMethods.setOCSP(signature, cRLs);

        // Список всех подписантов в исходной подписи.
        var srcSignerInfos = new ArrayList<SignerInformation>();

        for (CAdESSigner signer : signature.getCAdESSignerInfos())
            srcSignerInfos.add(signer.getSignerInfo());
            
        // Получаем только первую подпись, усовершенствуем ее. Остальных не трогаем.
        CAdESSigner srcSigner = CryptoMethods.GetSigner(signature);

        // Исключаем ее из исходного списка, т.к. ее место займет усовершенствованная подпись.
        srcSignerInfos.remove(srcSigner.getSignerInfo());

        // Усовершенствуем до CAdES-A.
        String digestAlgOID = srcSigner.getSignerInfo().getDigestAlgOID();
        AttributeTable unsignedAttributes = srcSigner.getSignerUnsignedAttributes();

        var chain = new LinkedList<X509Certificate>();

        srcSigner = srcSigner.enhance(config.getProviderName(),
                    digestAlgOID, 
                    chain,
                    config.getTSAAddress(),
                    CAdESType.CAdES_A);


Код:

public static void setOCSP(CAdESSignature signature, String[] cRLs) {
        if(cRLs != null && cRLs.length >= 2) {
            String[] targetArray = new String[cRLs.length - 1];
            System.arraycopy(cRLs, 1, targetArray, 0, cRLs.length - 1);
            setOCSP(signature, cRLs[0], targetArray);
        }
    }

    private static void setOCSP(CAdESSignature signature, String responderURL, String[] thumbs) {
       Options options = new Options();
       setSingleOcsp(options, responderURL);
       setAuthorizedOCSPs(options, thumbs);
       setOcspList(options, responderURL);
       signature.setOptions(options);
    }

    public static Options setSingleOcsp(Options options, String OCSP) {
        return options.setRevocationURLStrategy(
                new SingleRevocationURLStrategy() {
                    @Override
                    public RevocationURL get(ValidatingData validatingData) throws AdESException {
                        return new RevocationURL() {
                            @Override
                            public ConnectionParameters getConnectionParameters() {
                                return null;
                            }

                            @Override
                            public RevocationURLActionOnError onError(Throwable throwable) {
                                return null;
                            }

                            @Override
                            public String get() {
                                return OCSP;
                            }
                        };
                    }
                }
        );
    }

    public static Options setAuthorizedOCSPs(Options options, String[] thumbs) {
        return options.setRevocationPermissions(new RevocationPermission() {
            @Override
            public boolean isAuthorizedIssuer(ValidatingPermissionData validatingPermissionData) {
                X509Certificate cert = validatingPermissionData.getValidatingRevocationData().getCertificate();
                try {
                    MessageDigest digest = MessageDigest.getInstance("SHA-1");
                    digest.update(cert.getEncoded());
                    String thumb = CryptoMethods.bytesToHex(digest.digest());
                    boolean result = false;
                    for (String walk : thumbs)
                        if (thumb.equalsIgnoreCase(walk)) {
                            result = true;
                            break;
                        }
                    return result;

                } catch (NoSuchAlgorithmException | CertificateEncodingException e) {
                    throw new RuntimeException(e);
                }
            }
        });
    }

    private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
    public static String bytesToHex(byte[] bytes) {
        char[] hexChars = new char[bytes.length * 2];
        for (int j = 0; j < bytes.length; j++) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = HEX_ARRAY[v >>> 4];
            hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
        }
        return new String(hexChars);
    }

    public static Options setOcspList(Options options, String OCSP) {
        return options.setRevocationURLStrategy(new CollectionRevocationURLStrategy() {
            @Override
            public RevocationURLCollection get(ValidatingData validatingData) throws AdESException {
                return new RevocationURLCollection() {
                    @Override
                    public Collection<RevocationURL> get() {
                        return Collections.singleton(
                                new RevocationURL() {
                                    @Override
                                    public ConnectionParameters getConnectionParameters() {
                                        return null;
                                    }

                                    @Override
                                    public RevocationURLActionOnError onError(Throwable throwable) {
                                        return null;
                                    }

                                    @Override
                                    public String get() {
                                        return OCSP;
                                    }
                                }
                        );
                    }
                };
            }
        });
    }


cryptoservice.log (41kb) загружен 7 раз(а).
Offline Санчир Момолдаев  
#8 Оставлено : 25 июля 2024 г. 20:50:29(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 101 раз
Поблагодарили: 291 раз в 271 постах
в случае усовершенствования устанавливать options надо подписанту.
в вашем случае srcSigner.setOptions()
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
Тимур Шарипов оставлено 26.07.2024(UTC)
Offline Тимур Шарипов  
#9 Оставлено : 26 июля 2024 г. 14:12:16(UTC)
Тимур Шарипов

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

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

Сказал(а) «Спасибо»: 2 раз
Автор: Санчир Момолдаев Перейти к цитате
в случае усовершенствования устанавливать options надо подписанту.
в вашем случае srcSigner.setOptions()

Спасибо! Продвинулись дальше.
Offline Катков Игорь  
#10 Оставлено : 5 августа 2024 г. 11:42:20(UTC)
Катков Игорь

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

Группы: Участники
Зарегистрирован: 27.10.2022(UTC)
Сообщений: 2

Добрый день!
Подскажите, пожалуйста, а если совместить оба варианта: передачу CRL из начала ветки и передачу OCSP, в итоговом xlt 1 будет список CRL включён? Или enhance его проигнорирует?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.