Статус: Новичок
Группы: Участники
Зарегистрирован: 28.10.2019(UTC) Сообщений: 6  Откуда: Новосибирск Сказал(а) «Спасибо»: 3 раз
|
Добрый день. Глупый вопрос, но нужно в короткие сроки разобраться с подписью документа PDF используя Java, КриптоПро JCP и itextpdf. 1) Я установил КриптоПро CSP, JCP, скачал тестовый проект с пропатченной библиотекой itextpdf-5.1.3.patched 2) Скинул с флешки в локальную папку HDImageStore папку с файлами (header.key, name.key и т.д.), в панели управления JCP отобразился нужный мне контейнер  3) Код программы, которым я пытаюсь подписать PDF - под спойлером. В папку dir я пытался складывать name.cer, который получил путем установки сертификата на локальный компьютер, затем экспорта в формат .cer в кодировке Base-64. Но получаю ошибку - неверный формат хранилища.  В документации не смог найти решение проблемы. Подскажите, пожалуйста, правильный порядок действий. Что конкретно указывать в полях: ALIAS, PASSWORD, CA_ALIAS, CA_PASSWORD, CA_FILENAME и как получить эти файлы в нужном формате.
Код:
public class SignCryptoPro {
// Path to PDF files
final static String PREFIX_PDF_DIR = "dir/";
// Path to certificate, CRL, CA, key store
final static String PREFIX_KEY_DIR = "dir/"; //dailybuilds/CSPbuild/rtests/cades/
// Alias of key in client store
final static String ALIAS = "Test1";
// Password to client store
final static char[] PASSWORD = null;
// Alias of CA certificate in trusted store
final static String CA_ALIAS = "name.cer"; //cert.cer
// Password to trusted store
final static char[] CA_PASSWORD = "13564877".toCharArray();
// CA file
final static String CA_FILENAME = "name.cer"; //certstore.crs
// PDF file
final static String PDF_FILENAME = "test.pdf";
/**
* Loads key store.
* @param storeFile - key store file.
* @param password - password to store.
* @return opened key store.
* @throws KeyStoreException
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
* @throws CertificateException
* @throws IOException
*/
private static KeyStore loadKeyStore(String storeFile, char[] password) throws KeyStoreException, NoSuchProviderException,
NoSuchAlgorithmException, CertificateException, IOException {
KeyStore keyStore = KeyStore.getInstance("HDImageStore","JCP");
keyStore.load( (storeFile == null) ? null : new FileInputStream(storeFile), password);
return keyStore;
}
/**
* Signs PDF file (CryptoPro PDF / PKCS7 DETACHED) and saves it.
* @param fileToSign - source PDF file.
* @param signedFile - signed PDF file.
* @param signStore - store containing key to sign file.
* @param trustedStore - store containing trusted CA certificate.
* @throws IOException
* @throws DocumentException
* @throws KeyStoreException
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
* @throws CertificateException
* @throws UnrecoverableKeyException
*/
public static void signPDF(String fileToSign, String signedFile, KeyStore signStore, KeyStore trustedStore) throws IOException,
DocumentException, KeyStoreException, NoSuchProviderException, NoSuchAlgorithmException, CertificateException,
UnrecoverableKeyException {
// Get key and certificates
PrivateKey key = (PrivateKey)signStore.getKey(ALIAS, PASSWORD);
int chainLength = (trustedStore == null) ? 1 : 2;
Certificate[] chain = new Certificate[chainLength];
chain[0] = signStore.getCertificate(ALIAS);
if (trustedStore != null) {
chain[1] = trustedStore.getCertificate(CA_ALIAS);
}
// Load PDF
PdfReader reader = new PdfReader(fileToSign);
FileOutputStream fout = new FileOutputStream(signedFile);
PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0');
// Sign document
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setProvider("JCP");
sap.setCrypto(key, chain, null, PdfSignatureAppearance.CRYPTOPRO_SIGNED);
sap.setReason("I'm the signer");
sap.setLocation("CryptoPro");
stp.close();
}
/**
* @param args
* @throws NoSuchProviderException
* @throws KeyStoreException
* @throws IOException
* @throws CertificateException
* @throws NoSuchAlgorithmException
* @throws UnrecoverableKeyException
* @throws DocumentException
* @throws SignatureException
* @throws CRLException
*/
public static void main(String[] args) throws KeyStoreException, NoSuchProviderException, NoSuchAlgorithmException,
CertificateException, IOException, UnrecoverableKeyException, DocumentException, SignatureException, CRLException {
// Trusted store (CA) to build chain
KeyStore trustedStore = null;
// Key store containing trusted certificate to build chain
if (CA_FILENAME != null) {
trustedStore = loadKeyStore(PREFIX_KEY_DIR + CA_FILENAME, CA_PASSWORD);
}
// Key store containing client key to sign document
final KeyStore clientStore = loadKeyStore(null, PASSWORD);
// Sign PDF
signPDF(PREFIX_PDF_DIR + PDF_FILENAME,
PREFIX_PDF_DIR + "signed_" + PDF_FILENAME, clientStore, trustedStore );
}
}
|