Статус: Новичок
Группы: Участники
Зарегистрирован: 20.02.2014(UTC) Сообщений: 1
|
Я искал на сайте пример валидации ЭЦП PDF для java, но нашел только запись в блоге про .NET. Есть пример на сайте iText для негостовских подписей http://itextpdf.com/examples/iia.php?id=222 . Сейчас пробую адаптировать к JCP. При вызове java.security.Signature.getInstance() получаю "no such algorithm: GOST3411withECGOST3410 for provider JCP" Версия JCP 1.0.54 Код:<dependency><groupId>org.bouncycastle</groupId><artifactId>bcpkix-jdk15on</artifactId><version>1.50</version><scope>test</scope></dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.0</version></dependency>
Код:
package org.foo;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.KeyStore.LoadStoreParameter;
import java.security.Provider.Service;
import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Set;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.security.PdfPKCS7;
import ru.CryptoPro.JCP.JCP;
import ru.CryptoPro.Crypto.CryptoProvider;
@SuppressWarnings("restriction")
public class PdfVerifier {
public static final String CERT_STORE_TRUSTED_TYPE = "CertStore";
public static final String CERT_STORE_TRUSTED_PATH = "c:/Users/basin/Documents/archive-docs-trusted";
public static final char[] CERT_STORE_TRUSTED_PASS = { 's','e','c','r','e','t' };
public static final String CERT_STORE_REVOKED_TYPE = "CertStore";
public static final String CERT_STORE_REVOKED_PATH = "c:/Users/basin/Documents/archive-docs-revoked";
public static final char[] CERT_STORE_REVOKED_PASS = { 's','e','c','r','e','t' };
public static final String FILENAME = "c:/VM_share/sig/pdf/Фасады.pdf";
public static final String PROVIDER_NAME = JCP.PROVIDER_NAME;
public static void main(String[] args) throws Exception {
new PdfVerifier(new KeyStoreInfo(CERT_STORE_TRUSTED_TYPE, new FileInputStream(CERT_STORE_TRUSTED_PATH), CERT_STORE_TRUSTED_PASS),
new KeyStoreInfo(CERT_STORE_REVOKED_TYPE, new FileInputStream(CERT_STORE_REVOKED_PATH), CERT_STORE_REVOKED_PASS)).verify(new FileInputStream(FILENAME));
}
private KeyStore loadKeyStore(KeyStoreInfo trusted) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {
KeyStore keystore = KeyStore.getInstance(trusted.getType());
keystore.load(trusted.getStream(), trusted.getPassword());
return keystore;
}
public void verify(InputStream pdfStream) throws IOException {
PdfReader reader = new PdfReader(pdfStream);
AcroFields af = reader.getAcroFields();
ArrayList<String> names = af.getSignatureNames();
for (String name : names) {
System.out.println("Signature name: " + name);
System.out.println("Signature covers whole document: " + af.signatureCoversWholeDocument(name));
System.out.println("Document revision: " + af.getRevision(name) + " of " + af.getTotalRevisions());
//Provider prov = sun.security.jca.Providers.getProviderList().getProvider(PROVIDER_NAME);
//Set<Service> s = prov.getServices();
//prov = null;
//CryptoProvider.PROVIDER_NAME;
PdfPKCS7 pk = af.verifySignature(name, PROVIDER_NAME);
}
}
public PdfVerifier(KeyStoreInfo trustedKSInfo, KeyStoreInfo revokedKSInfo) throws Exception {
KeyStore ksTrusted = loadKeyStore(trustedKSInfo);
KeyStore ksRevoked = loadKeyStore(revokedKSInfo);
for (Enumeration<String> aliases = ksTrusted.aliases(); aliases.hasMoreElements();) {
String alias = aliases.nextElement();
System.out.println(alias + " " + ksTrusted.isCertificateEntry(alias));
}
//keyStore.is
}
}
class KeyStoreInfo {
private String type;
private InputStream stream;
private char[] password;
private LoadStoreParameter loadStoreParam;
public KeyStoreInfo(String storeType, InputStream store,
char[] storePassword) {
this(storeType, store, storePassword, null);
}
public KeyStoreInfo(String storeType, InputStream store,
char[] storePassword, LoadStoreParameter loadStoreParam) {
this.type = storeType;
this.stream = store;
setPassword(storePassword);
this.loadStoreParam = loadStoreParam;
}
public String getType() {
return type == null ? KeyStore.getDefaultType() : type;
}
public void setType(String storeType) {
this.type = storeType;
}
public InputStream getStream() {
return stream;
}
public void setStream(InputStream store) {
this.stream = store;
}
public char[] getPassword() {
return password;
}
public void setPassword(char[] storePassword) {
this.password = storePassword == null ? null : Arrays.copyOf(
storePassword, storePassword.length);
}
public LoadStoreParameter getLoadStoreParam() {
return loadStoreParam;
}
public void setLoadStoreParam(LoadStoreParameter loadStoreParam) {
this.loadStoreParam = loadStoreParam;
}
}
Отредактировано пользователем 20 февраля 2014 г. 19:15:53(UTC)
| Причина: Не указана Вложение(я): Фасады.zip (335kb) загружен 5 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|