Статус: Новичок
Группы: Участники
Зарегистрирован: 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. Какие варианта решения можете посоветовать?
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,223  Сказал(а) «Спасибо»: 101 раз Поблагодарили: 290 раз в 270 постах
|
Добрый день!
1. нельзя. 2. найти или сделать самостоятельно OCSP сервер и использовать его адрес при enhance |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 11.07.2024(UTC) Сообщений: 5  Сказал(а) «Спасибо»: 2 раз
|
Автор: Санчир Момолдаев  Добрый день!
1. нельзя. 2. найти или сделать самостоятельно OCSP сервер и использовать его адрес при enhance 2. А как его туда передать? Есть пример?
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,223  Сказал(а) «Спасибо»: 101 раз Поблагодарили: 290 раз в 270 постах
|
нужна актуальная версия СКЗИ 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. т.е. через проперти будет медленнее. через код более гибкая настройка Отредактировано пользователем 10 месяцев назад
| Причина: Не указана |
|
 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 11.07.2024(UTC) Сообщений: 5  Сказал(а) «Спасибо»: 2 раз
|
Здравствуйте, подскажите, если идти по пути настройки через Options, правильно ли я понимаю, что:
- параметр OCSP == responderUR (указывается URL OCSP)
- параметр String[] thumbs== responderCertIssuerName(указывается сертификат)?
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,223  Сказал(а) «Спасибо»: 101 раз Поблагодарили: 290 раз в 270 постах
|
1. да 2. указываются отпечатки сертификатов сторонних ocsp которым вы доверяете.
например есть Федеральное Казначейство у которого нет ocsp. но вам нужен xlt1 с ними. создаете свой экземпляр службы ocsp. в коде указываете его и доверяете ему, то у вас xlt1 будут созданы. но проверяться они будут только у вас или только там где настроено доверие к отпечаткам сертификатов уполномеченных OCSP.
можно ли доверять ответу ООО Рога и Копыта о том что сертификат клиента Федерального Казначейства не отозван? |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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.srf2024-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());
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) загружен 6 раз(а).
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,223  Сказал(а) «Спасибо»: 101 раз Поблагодарили: 290 раз в 270 постах
|
в случае усовершенствования устанавливать options надо подписанту. в вашем случае srcSigner.setOptions() |
|
 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 11.07.2024(UTC) Сообщений: 5  Сказал(а) «Спасибо»: 2 раз
|
Автор: Санчир Момолдаев  в случае усовершенствования устанавливать options надо подписанту. в вашем случае srcSigner.setOptions() Спасибо! Продвинулись дальше.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 27.10.2022(UTC) Сообщений: 2
|
Добрый день! Подскажите, пожалуйста, а если совместить оба варианта: передачу CRL из начала ветки и передачу OCSP, в итоговом xlt 1 будет список CRL включён? Или enhance его проигнорирует?
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close