Статус: Участник
Группы: Участники
Зарегистрирован: 25.08.2016(UTC) Сообщений: 17  Откуда: Белгород Сказал(а) «Спасибо»: 7 раз
|
Добавил корневой сертификат в cacerts под алиасом "cryptopro2". Сам используемый сертификат выдан вашим тестовым центром, промежуточных вроде бы нет. На всякий случай добавил этот корневой сертификат ещё и виндовый реестр сертификатов. Тем не менее все равно получаю ошибку на той же строке: Код:--- exec-maven-plugin:1.2.1:exec (default-cli) @ TestCryptoPro2 ---
сен 13, 2016 11:19:53 AM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 2.0 38830
сен 13, 2016 11:19:53 AM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
сен 13, 2016 11:19:53 AM ru.CryptoPro.CAdES.tools.CAdESUtility initJCPAlgorithms
INFO: Replacement of the BouncyCastle GOST algorithms.
Oid or private key is null; error codes: [-2] 'Application error',
at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
at ru.com.testcryptopro2.SignerData.signed(SignerData.java:43)
at ru.com.testcryptopro2.Main.main(Main.java:7)
Caused by: Oid or private key is null; error codes: [-2] 'Application error',
at ru.CryptoPro.AdES.tools.AdESUtility.checkOidAndKeyAlgorithmCompatibility(Unknown Source)
... 5 more
Полный код тестового проекта: Код:package ru.com.testcryptopro2;
public class Main {
public static void main( String[] args ) throws Exception {
try {
String result = SignerData.signed( "string" );
System.out.print( result );
} catch ( Exception ex ) {
ex.printStackTrace();
}
}
}
Код:package ru.com.testcryptopro2;
import java.io.*;
import java.security.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.*;
import ru.CryptoPro.CAdES.CAdESSignature;
import ru.CryptoPro.CAdES.CAdESSigner;
import ru.CryptoPro.CAdES.CAdESType;
import ru.CryptoPro.CAdES.exception.*;
public class SignerData {
final static private String cer_story = "HDImageStore";
//final static private String cer_story = "RutokenStore";
final static private String cer_alias = "cpstestcont";
final static private String cer_pass_str = "12345678";
final static private char[] cer_pass = cer_pass_str.toCharArray();
static public String signed(String data) throws IOException, KeyStoreException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, CAdESException, InvalidKeyException, SignatureException {
final byte src[] = data.getBytes();
KeyStore keyStore = KeyStore.getInstance( cer_story );
keyStore.load( null, null );
PrivateKey privateKey = (PrivateKey) keyStore.getKey( cer_alias, cer_pass );
X509Certificate cert = (X509Certificate) keyStore.getCertificate( cer_alias );
//List<Certificate> chain = Arrays.asList( keyStore.getCertificateChain( cer_alias ) );
List<X509Certificate> chain = Arrays.asList( cert );
/*
String AlgSign = JCP.CRYPTOPRO_SIGN_NAME;
Signature sig = Signature.getInstance( AlgSign );
sig.initSign( privateKey );
sig.update( src );
byte[] signature = sig.sign();
return toHexString( signature );
*/
CAdESSignature cadesSignature = new CAdESSignature( true );
// Создаем подписанта CAdES-BES.
cadesSignature.addSigner( "HDImageStore", privateKey, chain, CAdESType.CAdES_BES, null, false );
// Будущая подпись в виде массива.
ByteArrayOutputStream signatureStream = new ByteArrayOutputStream();
// Подготовка контекста.
cadesSignature.open( signatureStream );
// Хеширование.
cadesSignature.update( src );
// Создание подписи с выводом в signatureStream.
cadesSignature.close();
signatureStream.close();
// Получаем подпись в виде массива.
byte[] cadesCms = signatureStream.toByteArray();
return toHexString( cadesCms );
}
public static String toHexString( byte[] array ) {
final char[] hex = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
StringBuffer ss = new StringBuffer( array.length * 3 );
for ( int i = 0; i < array.length; i++ ) {
ss.append( hex[(array[i] >>> 4) & 0xf] );
ss.append( hex[array[i] & 0xf] );
}
return ss.toString();
}
}
При этом приватный ключ и получены:  Screenshot_18.png (80kb) загружен 79 раз(а).Проблема может быть в коде (каких-то ещё параметров не хватает) или в окружении ?PSОриентируясь на примеры документации "CAdES" ( хотя там только примеры проверки или модификации уже созданной подписи...) модификация проблемной строки Код:cadesSignature.addSigner( "HDImageStore", privateKey, chain, CAdESType.CAdES_BES, null, false );
в следующею Код:cadesSignature.addSigner( "HDImageStore", JCP.GOST_DIGEST_OID, JCP.GOST_EL_KEY_OID, privateKey, chain, CAdESType.CAdES_BES, null, false );
приводит к изменению ошибки на: Код:Error building certification path for C=RU, ... : 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.g.addSigner(Unknown Source)
at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
at ru.com.testcryptopro2.SignerData.signed(SignerData.java:43)
at ru.com.testcryptopro2.Main.main(Main.java:7)
Caused by: Error building certification path for C=RU, ST=Белгородская область, ... : 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)
... 4 more
PS2Использование строки Код:List<Certificate> chain = Arrays.asList( keyStore.getCertificateChain( cer_alias ) );
вместо Код:List<X509Certificate> chain = Arrays.asList( cert );
ничего не меняет. В смысле ошибки при обоих вариантах проблемной строки те же. Возможно я неправильно установил сертификат? Цитата:C:\Program Files\Java\jdk1.7.0_21\jre\lib\security>keytool -keystore cacerts -importcert -alias cryptopro2 -file cryptoProTestCenter.cer Это самоподписанный сертификат " CRYPTO-PRO Test Center 2"... Отредактировано пользователем 13 сентября 2016 г. 11:19:08(UTC)
| Причина: дополнение поста: PS, PS2
|