Статус: Активный участник
Группы: Участники
Зарегистрирован: 21.12.2016(UTC) Сообщений: 46 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Сургут Сказал(а) «Спасибо»: 10 раз Поблагодарили: 3 раз в 2 постах
|
Добрый день. Окружение: jre1.8.0_45 jcp-2.0.39014 Используется адрес службы штампов: http://www.cryptopro.ru/tsp/Для службы штампов в <jre>/lib/security/cacerts импортированы следующие сертификаты: http://www.cryptopro.ru/...les/products/tsp/tsa.cerhttps://www.cryptopro.ru/ra/cdp/cacer3.crtОба сертификата во вложении: ![](/forum2/Themes/soclean/icon_file.gif) CERTS_LOAD.zip (3kb) загружен 9 раз(а).Импортировал так: Код:keytool -keystore C:/_localsoft/jre1.8.0_45/lib/security/cacerts -importcert -alias caser3 -file ./cacer3.cer
keytool -keystore C:/_localsoft/jre1.8.0_45/lib/security/cacerts -importcert -alias tsa -file ./tsa.cer
Создаю отсоединенную подпись CADES_T. Полный листинг класса: Код:
package CADES_T;
import ru.CryptoPro.JCP.JCP;
import ru.CryptoPro.CAdES.CAdESSignature;
import ru.CryptoPro.CAdES.CAdESType;
import ru.CryptoPro.CAdES.exception.*;
import java.io.*;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.security.*;
import java.security.cert.CRLException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.*;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.util.CollectionStore;
import java.nio.file.Files;
import java.nio.file.Paths;
public class CADES_T {
//run
public static void main(String[] args) throws UnrecoverableKeyException, CAdESException, KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, CRLException {
byte[] cadesCms=sign_cades_t("C:\\_localsoft\\FSSP_FILES\\answers\\res_13532125435.xml");
FileOutputStream outs = new FileOutputStream("res_13532125435.xml.sig");
outs.write(cadesCms);
outs.close();
}
//getPublicKeyOid
private static String getPublicKeyOid(PrivateKey privateKey) {
String privateKeyAlgorithm = privateKey.getAlgorithm();
if (privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_EL_2012_256_NAME) ||
privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_DH_2012_256_NAME)) {
return JCP.GOST_PARAMS_SIG_2012_256_KEY_OID;
} // if
else if (privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_EL_2012_512_NAME) ||
privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_DH_2012_512_NAME)) {
return JCP.GOST_PARAMS_SIG_2012_512_KEY_OID;
} // if
return JCP.GOST_EL_KEY_OID;
}
//getDigestOid
private static String getDigestOid(PrivateKey privateKey) {
String privateKeyAlgorithm = privateKey.getAlgorithm();
if (privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_EL_2012_256_NAME) ||
privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_DH_2012_256_NAME)) {
return JCP.GOST_DIGEST_2012_256_OID;
} // if
else if (privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_EL_2012_512_NAME) ||
privateKeyAlgorithm.equalsIgnoreCase(JCP.GOST_DH_2012_512_NAME)) {
return JCP.GOST_DIGEST_2012_512_OID;
} // if
return JCP.GOST_DIGEST_OID;
}
//sign cades_t
private static byte[] sign_cades_t (String file_to_sign) throws CAdESException, IOException, KeyStoreException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, CRLException
{
//addition class to proxy auth
class ProxyAuthenticator extends Authenticator {
private String user, password;
public ProxyAuthenticator(String user, String password) {
this.user = user;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password.toCharArray());
}
}
//авторизация на прокси
Authenticator.setDefault(new ProxyAuthenticator("Username", "Password"));
System.setProperty("http.proxyHost", "proxy.xxx.local");
System.setProperty("http.proxyPort", "xxxx");
//enable online check
System.setProperty("com.sun.security.enableCRLDP", "true"); // для sun jvm
System.setProperty("com.ibm.security.enableCRLDP", "true"); // или ibm jvm123
//path to container
String cer_story = "HDImageStore";
String cer_alias = "gis-smev-2016-2017";
String cer_pass_str = "password";
char[] cer_pass = cer_pass_str.toCharArray();
//load key store
KeyStore keyStore = KeyStore.getInstance( cer_story );
keyStore.load( null, null );
PrivateKey privateKey = (PrivateKey) keyStore.getKey( cer_alias, cer_pass );
//prepare chain
X509Certificate cert = (X509Certificate) keyStore.getCertificate( cer_alias );
List<X509Certificate> chain = Arrays.asList( cert );
//new cades sign
CAdESSignature cadesSignature = new CAdESSignature( true );
//add certs in sign
Collection<X509CertificateHolder> holderList = new ArrayList<X509CertificateHolder>();
for (X509Certificate cert1 : chain)
{
holderList.add(new X509CertificateHolder(cert1.getEncoded()));
}
cadesSignature.setCertificateStore(new CollectionStore(holderList));
//data to sign
byte[] src = Files.readAllBytes(Paths.get(file_to_sign));
// Создаем подписанта CAdES-T.
cadesSignature.addSigner( "JCP", getDigestOid(privateKey),getPublicKeyOid(privateKey),privateKey, chain, CAdESType.CAdES_T, "http://www.cryptopro.ru/tsp/", false );
// Будущая подпись в виде массива.
ByteArrayOutputStream signatureStream = new ByteArrayOutputStream();
// Подготовка контекста.
cadesSignature.open( signatureStream );
// Хеширование.
cadesSignature.update( src );
// Создание подписи с выводом в signatureStream.
cadesSignature.close();
signatureStream.close();
// Получаем подпись в виде массива.
return signatureStream.toByteArray();
}
}
При запуске возвращается ошибка: Код:
Mar 31, 2017 11:50:30 AM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 2.0 39014
Mar 31, 2017 11:50:30 AM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
Mar 31, 2017 11:50:30 AM ru.CryptoPro.CAdES.tools.CAdESUtility initJCPAlgorithms
INFO: Replacement of the BouncyCastle GOST algorithms.
Exception in thread "main" org.bouncycastle.cms.CMSAttributeTableGenerationException: Error building certification path for EMAILADDRESS=support@cryptopro.ru, C=RU, ST=77 г. Москва, L=Москва, STREET="ул. Сущёвский вал, д. 18", OID.1.2.643.100.1=#120D31303037373132333435363738, O="ООО \"КРИПТО-ПРО\"", OU=Тестовый УЦ, CN="Тестовая служба штампов времени ООО \"КРИПТО-ПРО\"", OID.1.2.643.3.131.1.1=#120C303037373132333435363738: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target
at ru.CryptoPro.CAdES.a.a.b.getAttributes(Unknown Source)
at org.bouncycastle.cms.SignerInfoGenerator.generate(Unknown Source)
at org.bouncycastle.cms.CMSSignedDataStreamGenerator$CmsSignedDataOutputStream.close(Unknown Source)
at ru.CryptoPro.CAdES.g.close(Unknown Source)
at CADES_T.CADES_T.sign_cades_t(CADES_T.java:114)
at CADES_T.CADES_T.main(CADES_T.java:22)
Caused by: Error building certification path for EMAILADDRESS=support@cryptopro.ru, C=RU, ST=77 г. Москва, L=Москва, STREET="ул. Сущёвский вал, д. 18", OID.1.2.643.100.1=#120D31303037373132333435363738, O="ООО \"КРИПТО-ПРО\"", OU=Тестовый УЦ, CN="Тестовая служба штампов времени ООО \"КРИПТО-ПРО\"", OID.1.2.643.3.131.1.1=#120C303037373132333435363738: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate',
... 6 more
Caused by: Error building certification path for EMAILADDRESS=support@cryptopro.ru, C=RU, ST=77 г. Москва, L=Москва, STREET="ул. Сущёвский вал, д. 18", OID.1.2.643.100.1=#120D31303037373132333435363738, O="ООО \"КРИПТО-ПРО\"", OU=Тестовый УЦ, CN="Тестовая служба штампов времени ООО \"КРИПТО-ПРО\"", OID.1.2.643.3.131.1.1=#120C303037373132333435363738: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate',
at ru.CryptoPro.CAdES.CAdESSignerPKCS7Impl.verify(Unknown Source)
at ru.CryptoPro.CAdES.CAdESSignerBESImpl.verify(Unknown Source)
at ru.CryptoPro.CAdES.CAdESSignerPKCS7Impl.verify(Unknown Source)
at ru.CryptoPro.CAdES.timestamp.external.InternalTimeStampValidationProcessImpl.validate(Unknown Source)
at ru.CryptoPro.AdES.timestamp.TSPTimeStampValidatorImpl.validate(Unknown Source)
at ru.CryptoPro.AdES.timestamp.TSPTimeStampValidatorImpl.validate(Unknown Source)
at ru.CryptoPro.CAdES.a.a.b.a(Unknown Source)
... 6 more
Caused by: Error building certification path for EMAILADDRESS=support@cryptopro.ru, C=RU, ST=77 г. Москва, L=Москва, STREET="ул. Сущёвский вал, д. 18", OID.1.2.643.100.1=#120D31303037373132333435363738, O="ООО \"КРИПТО-ПРО\"", OU=Тестовый УЦ, CN="Тестовая служба штампов времени ООО \"КРИПТО-ПРО\"", OID.1.2.643.3.131.1.1=#120C303037373132333435363738: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate',
at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
at ru.CryptoPro.AdES.external.signature.AdESSigner.build(Unknown Source)
... 13 more
1.Пробовал несколько раз перекачать и перерегистрировать сертификаты службы и его корневой - не помогло. 2.Пробовал переустановку JRE,JCP и далее пункт 1 - не помогло. 3.Также с соседней теме мне сообщили что: "Если сравнить содержимое сообщения с субъектом/издателем в сертификате службы, то они не совпадают". Но с чем это связано и как исправить пока не ясно. 4.Приведенный пример работал 27.03.2017 и подписи формировались корректно ( результаты) Подскажите, с чем связана ошибка "Error building certification path"? Какие логи посмотреть? Как я понимаю, не строится цепочка для сертификата TSA.cer? 31.03.2017 Внезапно алгоритм снова заработал... С чем связано неизвестно... Отредактировано пользователем 14 апреля 2017 г. 9:58:42(UTC)
| Причина: Не указана
|