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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline SharkManZ  
#1 Оставлено : 7 июня 2016 г. 13:11:36(UTC)
SharkManZ

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

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

Здравствуйте.
Использую jdk1.7.0_06, КриптоПро JCP v1.0, rel.1.0.54 и xades4j для подписи части xml-документа.
Если в xades4j использовать getIssuerX500Principal().getName(X500Principal.CANONICAL), то в подписи значение тэга "xd:X509IssuerName" получается
Код:

<xd:X509IssuerName>cn=#1e380422043504410442043e0432044b04390020042304260020041e041e041e00200022041a04200418041f0422041e002d041f0420041e0022,o=#1e20041e041e041e00200022041a04200418041f0422041e002d041f0420041e0022,c=ru,1.2.840.113549.1.9.1=#1611696e666f4063727970746f70726f2e7275,l=#1e0c041c043e0441043a04320430,st=#1e180037003700200433002e0020041c043e0441043a04320430,street=#1e300443043b002e0020042104430449045104320441043a04380439002004320430043b002c00200434002e002000310038,1.2.643.3.131.1.1=#120c303037373137313037393931,1.2.643.100.1=#120d31303337373030303835343434</xd:X509IssuerName>

и последующая проверка подписи проходит без ошибок,
но если использовать getIssuerX500Principal().getName(X500Principal.RFC1779) (что рекомендуется делать, исходя из ответов найденных в похожих темах на форуме), значение тэга принимает более читаемый вид
Код:

<xd:X509IssuerName>CN="Тестовый УЦ ООО \"КРИПТО-ПРО\"", O="ООО \"КРИПТО-ПРО\"", C=RU, OID.1.2.840.113549.1.9.1=info@cryptopro.ru, L=Москва, ST=77 г. Москва, STREET="ул. Сущёвский вал, д. 18", OID.1.2.643.3.131.1.1=#120C303037373137313037393931, OID.1.2.643.100.1=#120D31303337373030303835343434</xd:X509IssuerName>

однако проверку такая подпись уже не проходит, с ошибкой
Цитата:
Verification failed for property 'SigningCertificate': Couldn't find a reference to the signing certificate


Код используемый для подписи
Код:

            KeyStore ks = SignUtil.buildKeyStore();

            //Получение ключа и сертификата
            PrivateKey privateKey = (PrivateKey) ks.getKey(SignUtil.PRIVATE_KEY_CONTAINER, SignUtil.PRIVATE_KEY_PASSWORD.toCharArray());
            X509Certificate cert = (X509Certificate) ks.getCertificate("1");
            KeyingDataProvider keyingDataProvider = new DirectKeyingDataProvider(cert, privateKey);
            XadesSigningProfile prof = new XadesBesSigningProfile(keyingDataProvider)
                    .withTimeStampTokenProvider(DefaultTimeStampTokenProvider.class)
                    .withDigestEngineProvider(new DefaultMessageDigestProvider() {
                        @Override
                        public MessageDigest getEngine(String digestAlgorithmURI) throws UnsupportedAlgorithmException {
                            try {
                                return MessageDigest.getInstance("GOST3411");
                            } catch (NoSuchAlgorithmException nsae) {
                                throw new UnsupportedAlgorithmException(nsae.getMessage(), digestAlgorithmURI, nsae);
                            }
                        }
                    })
                    .withAlgorithmsProviderEx(new DefaultAlgorithmsProviderEx() {
                        @Override
                        public Algorithm getSignatureAlgorithm(String keyAlgorithmName)
                                throws UnsupportedAlgorithmException {
                            return new GenericAlgorithm("http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411");
                        }

                        @Override
                        public String getDigestAlgorithmForReferenceProperties() {
                            return "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
                        }
                        @Override
                        public Algorithm getCanonicalizationAlgorithmForTimeStampProperties() {
                            return new ExclusiveCanonicalXMLWithoutComments();
                        }

                        @Override
                        public String getDigestAlgorithmForDataObjsReferences() {
                            return "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
                        }

                    })
                    ;

            XadesSigner signer = prof.newSigner();
            DataObjectDesc obj1 = new DataObjectReference("#" + elementToSign.getAttribute("Id"))
                    .withTransform(new EnvelopedSignatureTransform());

            SignedDataObjects dataObjs = new SignedDataObjects(obj1);

            signer.sign(dataObjs, elementToSign, SignatureAppendingStrategies.AsFirstChild);


И для проверки подписи
Код:

            KeyStore trustStore = SignUtil.buildTrustStore();
            final CertificateValidationProvider validationProvider = new PKIXCertificateValidationProvider(
                    trustStore, true, new CertStore[]{});
            final XadesVerificationProfile verProf = new XadesVerificationProfile(validationProvider)
                    .withTimeStampTokenVerifier(DefaultTimeStampVerificationProvider.class)
                    .withDigestEngineProvider(new DefaultMessageDigestProvider() {
                        @Override
                        public MessageDigest getEngine(String digestAlgorithmURI) throws UnsupportedAlgorithmException {
                            // Определение OID’а алгоритма хэширования по URN
                            try {
                                return MessageDigest.getInstance("GOST3411");
                            } catch (NoSuchAlgorithmException e) {
                                throw new UnsupportedAlgorithmException(e.getMessage(), digestAlgorithmURI, e);
                            }

                        }
                    });
            final XadesVerifier verifier = verProf.newVerifier();
            verifier.verify((Element)elementToSign.getFirstChild(), null);


В чем может быть загвоздка?
Offline Евгений Афанасьев  
#2 Оставлено : 7 июня 2016 г. 13:48:42(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Автор: SharkManZ Перейти к цитате
если использовать getIssuerX500Principal().getName(X500Principal.RFC1779)

Вы патчили исходники xades4j? Если да, возможно, где-то при поиске/получении сертификата подписи используется .getName().

В xades4j есть код типа (класс xades4j.verification.SigningCertificateVerifier):
Код:

/* Check the signing certificate */

// "If the verifier does not find any reference matching the signing certificate,
// the validation of this property should be taken as failed."
X509Certificate signingCert = certPathIter.next();
CertRef signingCertRef = CertRefUtils.findCertRef(signingCert, certRefs);
if (null == signingCertRef)
  throw new SigningCertificateReferenceNotFoundException(signingCert);

// "If the ds:KeyInfo contains the ds:X509IssuerSerial element, check that
// the issuer and the serial number indicated in both, that one and IssuerSerial
// from SigningCertificate, are the same."
X500Principal keyInfoIssuer = certChainData.getValidationCertIssuer();
if (keyInfoIssuer != null &&
  (!new X500Principal(signingCertRef.issuerDN).equals(keyInfoIssuer) ||
   !signingCertRef.serialNumber.equals(certChainData.getValidationCertSerialNumber())))
  throw new SigningCertificateIssuerSerialMismatchException(
                    signingCertRef.issuerDN,
                    signingCertRef.serialNumber,
                    keyInfoIssuer.getName(),
                    certChainData.getValidationCertSerialNumber());

Здесь есть X500Principal -> keyInfoIssuer.getName(), может, имеет отношение.

Отредактировано пользователем 7 июня 2016 г. 13:52:17(UTC)  | Причина: Не указана

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