В сервис требуется доработка, необходимо, чтобы можно было подписать текст стандартом CAdES-X Long Type 1. Сейчас подписывается стандартом CAdES-BES (так написано в ТЗ). Однако он реализован не так как в руководстве программиста, а через некий CMS.CMSSign(byte[] data, PrivateKey key, Certificate cert, boolean detached) внутри которого вызывается CMSSignEx(byte[] data, PrivateKey key, Certificate cert, boolean detached, String digestOid, String signOid, String signAlg, String providerName) где и происходит подписание.
CAdES-X Long Type 1 реализовал по примеру в руководстве программиста:
Certificate[] certificates = keyStore.getCertificateChain(kid);
List<Certificate> chain = Arrays.asList(certificates);
CAdESSignature cadesSignature = new CAdESSignature(false);
cadesSignature.addSigner(JCP.PROVIDER_NAME, JCP.GOST_DIGEST_2012_256_OID, JCP.GOST_PARAMS_EXC_2012_256_KEY_OID, privateKey, chain, CAdESType.CAdES_X_Long_Type_1, Configuration.TSA_DEFAULT_ADDRESS, false);
ByteArrayOutputStream signatureStream = new ByteArrayOutputStream();
cadesSignature.open(signatureStream);
cadesSignature.update(signedInputText.getText().getBytes());
cadesSignature.close();
signatureStream.close();
bytes = signatureStream.toByteArray();
В итоге возникает ошибка:
Root certificate ... is untrusted
[ru.CryptoPro.CAdES.cl_1.addSigner(Unknown Source), ru.CryptoPro.CAdES.cl_1.addSigner(Unknown Source), ru.CryptoPro.CAdES.cl_1.addSigner(Unknown Source), ru.megafon.mfactory.gostsign.service.SignService.sign(SignService.java:91), ru.megafon.mfactory.gostsign.controller.Controller.sign(Controller.java:28), sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method), sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62), sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43), java.lang.reflect.Method.invoke(Method.java:498)
Здесь же на форме нашел инфу, что это можно починить, добавив корневой сертификат в cacerts. Но сервис развертывается на отдельном тестовом сервере, в котором у меня нет доступа к файлу cacerts и добавить туда сертификат я не могу. Можно ли как-то по-другом подписать текст этим стандартом?
Также попытался изменить CMS.CMSSign(byte[] data, PrivateKey key, Certificate cert, boolean detached), подставив следующее: CMSSignEx(data, key, cert, detached, JCP.GOST_DIGEST_2012_256_OID, JCP.GOST_PARAMS_EXC_2012_256_KEY_OID, JCP.GOST_SIGN_DH_2012_256_NAME, JCP.PROVIDER_NAME) текст подписался успешно, но если использовать проверку подписи CAdES-X Long Type 1 описанную в руководстве программиста, то выдает ошибку verify is invalid.