Статус: Новичок
Группы: Участники
Зарегистрирован: 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());
// Усовершенствуем до 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) загружен 6 раз(а).
|