Статус: Участник
Группы: Участники
Зарегистрирован: 08.10.2019(UTC) Сообщений: 13  Откуда: Москва
|
Добрый день При получении подписи происходит ошибка: PKIX failure: invalid parameters of certificate Цепочку сертификатов проверил: Код:
@Test
public void test() throws Exception {
System.setProperty("com.sun.security.enableCRLDP", "true"); // для проверки по CRL DP
System.setProperty("com.sun.security.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети
System.setProperty("ru.CryptoPro.reprov.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети
final CertificateFactory cf = CertificateFactory.getInstance("X509");
final Certificate user = cf.generateCertificate(new FileInputStream("F:\\certificats\\cert.cer"));
Certificate root = cf.generateCertificate(new FileInputStream("F:\\certificats\\certC.cer"));
final Certificate[] certs = new Certificate[2];
certs[0] = user;
certs[1] = root;
final Set<TrustAnchor> trust = new HashSet<>(1);
trust.add(new TrustAnchor((X509Certificate) root, null));
final List cert = new ArrayList(0);
for (int i = 0; i < certs.length; i++)
cert.add(certs[i]);
final PKIXBuilderParameters cpp = new PKIXBuilderParameters(trust, null);
cpp.setSigProvider(null);
final CollectionCertStoreParameters par =
new CollectionCertStoreParameters(cert);
final CertStore store = CertStore.getInstance("Collection", par);
cpp.addCertStore(store);
final X509CertSelector selector = new X509CertSelector();
selector.setCertificate((X509Certificate) user);
cpp.setTargetCertConstraints(selector);
cpp.setRevocationEnabled(false);
// Построение цепочки.
final PKIXCertPathBuilderResult res =
(PKIXCertPathBuilderResult) CertPathBuilder.
getInstance("CPPKIX", "RevCheck").build(cpp);
final CertPath cp = res.getCertPath();
System.out.println("%%% SIZE: " + cp.getCertificates().size());
//System.out.println("%%% PATH:\n" + cp);
System.out.println("OK-1");
// Проверка цепочки.
final CertPathValidator cpv = CertPathValidator.getInstance("CPPKIX", "RevCheck");
cpp.setRevocationEnabled(true);
cpv.validate(cp, cpp);
System.out.println("OK-2");
}
Результат: %%% SIZE: 1 OK-1 OK-2 Вот код получения подписи: Код:
@Test
public void testCertificate()
throws CAdESException, KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException, CertificateException, IOException, InvalidAlgorithmParameterException, NoSuchProviderException, CertPathBuilderException {
final Logger LOG = LoggerFactory.getLogger(ru.CryptoPro.JCP.tools.JCPLogger.class);
System.setProperty( "com.sun.security.enableCRLDP", "true" );
System.setProperty( "com.ibm.security.enableCRLDP", "true" );
String data = ""; //получение кода для авторизации
String alias = "XXXXXXXXX";
char[] password = {'1', '2', '3', '4'};
boolean detached = false;
// false - прикреплённая(для получения токена авторизации) подпись
// true - откреплённая(для подписания документов) подпись
//Формирование подписи
Security.addProvider(new JCP());
KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME);//KeyStore.getInstance("2DA1");////loadKeyStore();//инициализация хранилища ключей
keyStore.load(null, null);
List<X509CertificateHolder> chain = new ArrayList<>();
//List<java.security.cert.Certificate> certs = Arrays.asList(keyStore.getCertificateChain(alias));
//System.setProperty("com.sun.security.enableCRLDP", "true"); // для проверки по CRL DP
//System.setProperty("com.sun.security.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети
//System.setProperty("ru.CryptoPro.reprov.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети
final CertificateFactory cf = CertificateFactory.getInstance("X509");
final Certificate user = cf.generateCertificate(new FileInputStream("F:\\ua\\certificats\\cert.cer"));
Certificate root = cf.generateCertificate(new FileInputStream("F:\\ua\\certificats\\certC.cer"));
final Certificate[] certs = new Certificate[2];
certs[0] = user;
certs[1] = root;
final Set<TrustAnchor> trust = new HashSet<>(1);
trust.add(new TrustAnchor((X509Certificate) root, null));
final List<Certificate> certs_ = new ArrayList(0);
for (int i = 0; i < certs.length; i++)
certs_.add(certs[i]);
final PKIXBuilderParameters cpp = new PKIXBuilderParameters(trust, null);
cpp.setSigProvider(null);
final CollectionCertStoreParameters par =
new CollectionCertStoreParameters(certs_);
final CertStore store = CertStore.getInstance("Collection", par);
cpp.addCertStore(store);
final X509CertSelector selector = new X509CertSelector();
selector.setCertificate((X509Certificate) user);
cpp.setTargetCertConstraints(selector);
cpp.setRevocationEnabled(false);
final PKIXCertPathBuilderResult res =
(PKIXCertPathBuilderResult) CertPathBuilder.
getInstance("CPPKIX", "RevCheck").build(cpp);
final CertPath cp = res.getCertPath();
System.out.println("%%% SIZE: " + cp.getCertificates().size());
System.out.println("%%% PATH:\n" + cp);
///////
certs_.forEach(cert -> {
try {
chain.add(new X509CertificateHolder(cert.getEncoded()));
} catch (IOException | CertificateEncodingException e) {
//log.error("Error while building certificate chain", e);
System.err.println("Error while building certificate chain " + e.getMessage());
}
});
PrivateKey privateKey = (PrivateKey) (keyStore.getKey(alias, password));
ByteArrayOutputStream out = new ByteArrayOutputStream();
CAdESSignature signature = new CAdESSignature(detached);
signature.setCertificateStore(new CollectionStore(chain));
final Hashtable table = new Hashtable();
Attribute attr = new Attribute(CMSAttributes.signingTime,
new DERSet(new Time(new Date()))); // устанавливаем время подписи
table.put(attr.getAttrType(), attr);
AttributeTable attrTable = new AttributeTable(table);
//Добавление подписанта. Алгоритмы могут отличаться в зависимости от требований
signature.addSigner(JCP.PROVIDER_NAME,
JCP.GOST_DIGEST_2012_256_OID,
JCP.GOST_PARAMS_EXC_2012_256_KEY_OID,
privateKey,
certs_,
CAdESType.CAdES_BES,
null,
false,
attrTable,
null);
signature.open(out);
signature.update(data.getBytes());
signature.close();
byte[] signedCode = out.toByteArray();
}/**/
Где ошибка ?
|