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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
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. Какие варианта решения можете посоветовать?
Offline Санчир Момолдаев  
#2 Оставлено : 11 июля 2024 г. 17:15:39(UTC)
Санчир Момолдаев

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

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

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

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,062
Российская Федерация

Сказал(а) «Спасибо»: 88 раз
Поблагодарили: 231 раз в 218 постах
нужна актуальная версия СКЗИ
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,062
Российская Федерация

Сказал(а) «Спасибо»: 88 раз
Поблагодарили: 231 раз в 218 постах
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) загружен 5 раз(а).
Offline Санчир Момолдаев  
#8 Оставлено : 25 июля 2024 г. 20:50:29(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 88 раз
Поблагодарили: 231 раз в 218 постах
в случае усовершенствования устанавливать 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()

Спасибо! Продвинулись дальше.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.