public class XAdESSignature extends java.lang.Object implements IXAdESSignature, XAdESParameters
Необходимо, чтобы: 1) был установлен JCP в JRE; 2) были установлены библиотеки AdES-core.jar, CAdES.jar и XAdES.jar; 3) были импортированы корневые сертификаты цепочек сертификатов подписи клиента, OCSP службы и службы штампов в DER-кодировке в хранилище доверенных сертификатов cacerts. Например, так: keytool -importcert -file "" -alias -keystore " /lib/security/cacerts" где keytool - утилита в папке /bin, PATH_TO_CA_CERT - путь к корневому сертификату, CERT_ALIAS - алиас сертификата для установки в хранилище (например, cryptopro_ca), PATH_TO_JRE - место установки JRE; 4) были скопированы библиотеки криптопровайдера BouncyCastle: bcpkix-jdk15on-1.60.jar и bcprov-jdk15on-1.60.jar. Ссылки на данные корневые доверенные сертификаты могут быть найдены в "Составе" клиентского сертификата, а также на сайте УЦ. Например, у тестового центра сертификации КриптоПро корневой сертификат один, его можно скачать с https://www.cryptopro.ru/certsrv/ (п. "Получить сертификат Удостоверяющего Центра или действующий список отозванных сертификатов"). Если ваш клиентский сертификат выпущен другим УЦ, то вы должны импортировать его корневой сертификат. Для включения проверки цепочки сертификатов онлайн по СОС следует задать параметр: System.setProperty("com.sun.security.enableCRLDP", "true"); или System.setProperty("com.ibm.security.enableCRLDP", "true"); В случае использования при проверке подписи валидных локальных СОС данные свойства можно не задавать. До версии 2.0.39442 включительно полная проверка цепочки сертификатов оператора службы внутреннего штампа не выполнялась. В текущей версии данная проверка выполняется (для T-подписи), но может быть отключена с помощью параметра AdESUtility.PROPERTY_VALIDATE_TSP(например, -Dru.CryptoPro.AdES.validate_tsp=false). Текущая версия также отличается более жесткой политикой в отношении наличия доказательства (CRL, OCSP) для сертификата службы штампа в усовершенствованном внутреннем штампе времени, однако в целях совместимости с предыдущими версиями проверка отключена. Она может быть включена с помощью параметраAdESUtility.PROPERTY_REQUIRE_TSP_EVIDENCE(например, -Dru.CryptoPro.AdES.require_tsp_evidence=true). Настройка провайдера по умолчанию, используемого в XAdES, выполняется с помощьюAdESConfig. Для включения логирования при невыясненных ошибках нужно внести в файл logging.properties JRE следующее: ... handlers=java.util.logging.ConsoleHandler ... .level= INFO ... java.util.logging.ConsoleHandler.level = FINER java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter ... ru.CryptoPro.JCP.tools.JCPLogger.level = FINE ru.CryptoPro.JCP.tools.JCPLogger.handlers = java.util.logging.FileHandler В пакете tools имеется несколько классов с вспомогательными функциями. Проверку подписей типов XAdES-BES, XAdES-T и XAdES-X Long Type 1 можно выполнить с помощью библиотек cades/cadescom (http://www.cryptopro.ru/downloads#cades). Большинство файлов BouncyCastle можно найти по ссылке http://www.bouncycastle.org/latest_releases.html.
CAdESSignature| Modifier and Type | Field and Description |
|---|---|
static java.lang.String |
ELEMENT_SIGNATURE
Название узла подписи.
|
URI_SIGNED_PROPERTIES, XAdES_BES, XAdES_C, XADES_SIGNATURE_NAMESPACE, XADES_SIGNATURE_PREFIX, XAdES_T, XAdES_Unknown, XAdES_X_Long_Type_1, XML_DSIG, XML_SIGNATURE_PREFIX_AdES_A, _AdES_BES, _AdES_C, _AdES_T, _AdES_Unknown, _AdES_X_Long_Type_1, _SIMPLE, TSA_ARCHIVE_TIME_STAMP, TSA_ARCHIVE_TIME_STAMP_SIMPLE, TSA_CAdESC_TIME_STAMP, TSA_CAdESC_TIME_STAMP_SIMPLE, TSA_SIGNATURE_TIME_STAMP, TSA_SIGNATURE_TIME_STAMP_SIMPLE| Constructor and Description |
|---|
XAdESSignature()
Конструктор.
|
XAdESSignature(org.w3c.dom.Element element,
java.lang.Integer signatureType)
Конструктор.
|
| Modifier and Type | Method and Description |
|---|---|
void |
addSigner(java.lang.String provider,
java.lang.String canonicalizationMethod,
java.security.PrivateKey privateKey,
java.util.List<java.security.cert.X509Certificate> chain,
boolean addCertificateChain,
java.lang.Integer signatureType,
java.lang.String tsaUrl)
Добавление подписи в формируемое сообщение (ЭЦП).
|
void |
addSigner(java.lang.String provider,
java.lang.String canonicalizationMethod,
java.security.PrivateKey privateKey,
java.util.List<java.security.cert.X509Certificate> chain,
java.lang.Integer signatureType,
java.lang.String tsaUrl)
Добавление подписи в формируемое сообщение (ЭЦП).
|
void |
addSigner(java.lang.String provider,
java.lang.String digestUri,
java.lang.String signatureUri,
java.lang.String canonicalizationMethod,
java.security.PrivateKey privateKey,
java.util.List<java.security.cert.X509Certificate> certificates,
boolean addCertificateChain,
java.lang.Integer signatureType,
java.lang.String tsaUrl)
Добавление подписи в формируемое сообщение (ЭЦП).
|
void |
addSigner(java.lang.String provider,
java.lang.String digestUri,
java.lang.String signatureUri,
java.lang.String canonicalizationMethod,
java.security.PrivateKey privateKey,
java.util.List<java.security.cert.X509Certificate> certificates,
boolean addCertificateChain,
java.lang.Integer signatureType,
java.lang.String tsaUrl,
java.util.Set<java.security.cert.X509CRL> cRLs)
Добавление подписи в формируемое сообщение (ЭЦП).
|
void |
addSigner(java.lang.String provider,
java.lang.String digestUri,
java.lang.String signatureUri,
java.lang.String canonicalizationMethod,
java.security.PrivateKey privateKey,
java.util.List<java.security.cert.X509Certificate> chain,
java.lang.Integer signatureType,
java.lang.String tsaUrl)
Добавление подписи в формируемое сообщение (ЭЦП).
|
void |
close()
Завершение процедуры подписания.
|
XAdESSigner |
getXAdESSignerInfo(int index)
Получение i-го подписанта из списка подписантов.
|
XAdESSigner[] |
getXAdESSignerInfos()
Получение списка имеющихся подписантов.
|
void |
open(java.io.OutputStream sgnOutStream)
Открытие выходного потока для записи подписанного сообщения.
|
void |
setOptions(Options options)
Задание параметров для управления некоторыми
проверками в процессе создания подписи формата
BES или T.
|
void |
update(org.w3c.dom.Element element,
DataObjects dataObjects)
Подпись данных.
|
void |
verify(java.util.Set<java.security.cert.X509Certificate> certificates)
Проверка всех подписей в сообщении.
|
void |
verify(java.util.Set<java.security.cert.X509Certificate> certificates,
java.util.Set<java.security.cert.X509CRL> cRLs)
Проверка всех подписей в сообщении.
|
public static final java.lang.String ELEMENT_SIGNATURE
public XAdESSignature(org.w3c.dom.Element element,
java.lang.Integer signatureType)
throws XAdESException
1. Пример проверки подписи в документе (полный текст примера
находится в samples.jar/xades.XAdESSignVerify).
// декодирование документа с подписью
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
if (!Platform.isAndroid) {
dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
dbFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
}
dbFactory.setNamespaceAware(true);
Document document = dbFactory.newDocumentBuilder().parse(new FileInputStream("signed.xml"));
Set<X509Certificate> certs = ... // дополнительные сертификаты для построения цепочки
Set<X509CRL> cRLs = ... // CRL для проверки цепочки сертификатов
XAdESSignature xAdESSignature = new XAdESSignature(document.getDocumentElement(), XAdESType.XAdES_BES);
xAdESSignature.verify(certs, cRLs);
2. Пример проверки отдельной подписи в документе (полный текст примера
находится в samples.jar/xades.XAdESSignVerify).
// декодирование документа с подписью
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
if (!Platform.isAndroid) {
dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
dbFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
}
dbFactory.setNamespaceAware(true);
Document document = dbFactory.newDocumentBuilder().parse(new FileInputStream("signed.xml"));
Set<X509Certificate> certs = ... // дополнительные сертификаты для построения цепочки
Set<X509CRL> cRLs = ... // CRL для проверки цепочки сертификатов
XAdESSignature xAdESSignature = new XAdESSignature(document.getDocumentElement(), XAdESType.XAdES_BES);
XAdESSigner xAdESSigner = xAdESSignature.getXAdESSignerInfo(0);
// Проверка отдельной подписи с порядковым номером 0
xAdESSigner.verify(certs, cRLs);
3. Пример усовершенствования подписанта в документе (полный текст примера
находится в samples.jar/xades.XAdESSignVerify).
// декодирование документа с подписью XAdES-BES
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
if (!Platform.isAndroid) {
dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
dbFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
}
dbFactory.setNamespaceAware(true);
Document document = dbFactory.newDocumentBuilder().parse(new FileInputStream("signed_bes.xml"));
// Декодирование с типом XAdES-BES
XAdESSignature xAdESSignature = new XAdESSignature(document.getDocumentElement(), XAdESType.XAdES_BES);
// Извлечение подписанта, которого следует усовершенствовать
XAdESSigner srcXAdESSigner = xAdESSignature.getXAdESSignerInfo(0);
List<X509Certificate> chain = ... // цепочка сертификатов подписи
// Усовершенствование подписанта типа XAdES-BES до XAdES-T.
Узел подписанта (Signature) в исходном документе document
также изменится.
XAdESSigner dstXAdESSigner = srcXAdESSigner.enhance(
JCP.PROVIDER_NAME,
Consts.URI_GOST_DIGEST, // алгоритм хеширования
chain,
"http://www.cryptopro.ru:80/tsp/",
XAdESType.XAdES_T
);
// Можно сохранить как документ document, так и нового
// подписанта dstXAdESSigner. В обоих случаях подписант
// усовершенствован. В dstXAdESSigner содержится только
// блок Signature с усовершенствованным подписантом.
XMLUtils.writeXML(new File("xades_enhanced.xml"), document);
XMLUtils.writeXML(new File(workDir, "xades_signer_enhanced_t.xml"), dstXAdESSigner.getSignerInfo()); // узел подписи
element - Элемент с подписью.signatureType - Тип подписи.XAdESExceptionpublic XAdESSignature()
Пример создания подписи (полный текст примера находится
в samples.jar/xades.XAdESSignVerify).
System.setProperty("com.sun.security.enableCRLDP", "true");
System.setProperty("com.ibm.security.enableCRLDP", "true");
String documentContext =
"<?xml version=\"1.0\"?>\n" +
"<ClientRecord> \n" +
" <Name>John Doe</Name> \n" +
" <Account Id=\"acct\">123456</Account> \n" +
" <BankInfo Id=\"bank\">HomeBank</BankInfo> \n" +
" <Visit date=\"10pm March 10, 2002\"> \n" +
" <Comment>Valid data</Comment> \n" +
" </Visit>\n" +
"</ClientRecord>";
String ref_acct = "acct"; // ссылка на подписываемый узел
// декодирование документа
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
if (!Platform.isAndroid) {
dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
dbFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
}
dbFactory.setNamespaceAware(true);
Document document = dbFactory.newDocumentBuilder().parse(
new ByteArrayInputStream(documentContext.getBytes()));
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile(String.format("//*[@Id='%s']", ref_acct));
NodeList nodes = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
Node node = nodes.item(0);
String referenceURI = "#" + ref_acct;
DataObjects dataObjects = new DataObjects(Arrays.asList(referenceURI));
dataObjects.addTransform(new EnvelopedTransform());
PrivateKey privateKey = ... // ключ подписи
List<X509Certificate> chain = ... // цепочка сертификатов подписи
XAdESSignature xAdESSignature = new XAdESSignature();
// добавляем подписанта формата XAdES-BES
xAdESSignature.addSigner(JCP.PROVIDER_NAME, null, privateKey, chain, XAdESType.XAdES_BES, null);
FileOutputStream fileOutputStream = new FileOutputStream("signed.xml");
xAdESSignature.open(fileOutputStream);
xAdESSignature.update((Element) node, dataObjects);
xAdESSignature.close();
// Подписанный документ сохранен в файл signed.xml.
public XAdESSigner getXAdESSignerInfo(int index) throws java.lang.ArrayIndexOutOfBoundsException
IXAdESSignaturegetXAdESSignerInfo in interface IXAdESSignatureindex - Номер элемента.java.lang.ArrayIndexOutOfBoundsExceptionpublic XAdESSigner[] getXAdESSignerInfos()
IXAdESSignaturegetXAdESSignerInfos in interface IXAdESSignaturepublic void addSigner(java.lang.String provider,
java.lang.String digestUri,
java.lang.String signatureUri,
java.lang.String canonicalizationMethod,
java.security.PrivateKey privateKey,
java.util.List<java.security.cert.X509Certificate> chain,
java.lang.Integer signatureType,
java.lang.String tsaUrl)
throws XAdESException
IXAdESSignatureaddSigner in interface IXAdESSignatureprovider - Криптопровайдер для хеширования и подписи.digestUri - URI/URN алгоритма хэширования. Не используется,
может быть null.signatureUri - URI/URN алгоритма шифрования. Не используется,
может быть null.canonicalizationMethod - Метод каноникализации. Может быть
null. По умолчанию используется
CanonicalizationMethod.EXCLUSIVE.privateKey - Закрытый ключ для подписи.chain - Цепочка сертификатов подписанта. Должна содержать
как минимум один сертификат (сертификат подписи).signatureType - Тип создаваемой подписи.tsaUrl - Адрес TSA службы (для XAdES-T). Может быть null.XAdESExceptionpublic void addSigner(java.lang.String provider,
java.lang.String canonicalizationMethod,
java.security.PrivateKey privateKey,
java.util.List<java.security.cert.X509Certificate> chain,
java.lang.Integer signatureType,
java.lang.String tsaUrl)
throws XAdESException
IXAdESSignatureaddSigner in interface IXAdESSignatureprovider - Криптопровайдер для хеширования и подписи.canonicalizationMethod - Метод каноникализации. Может быть
null. По умолчанию используется
CanonicalizationMethod.EXCLUSIVE.privateKey - Закрытый ключ для подписи.chain - Цепочка сертификатов подписанта. Должна содержать
как минимум один сертификат (сертификат подписи).signatureType - Тип создаваемой подписи.tsaUrl - Адрес TSA службы (для XAdES-T). Может быть null.XAdESExceptionpublic void addSigner(java.lang.String provider,
java.lang.String canonicalizationMethod,
java.security.PrivateKey privateKey,
java.util.List<java.security.cert.X509Certificate> chain,
boolean addCertificateChain,
java.lang.Integer signatureType,
java.lang.String tsaUrl)
throws XAdESException
IXAdESSignatureaddSigner in interface IXAdESSignatureprovider - Криптопровайдер для хеширования и подписи.canonicalizationMethod - Метод каноникализации. Может быть
null. По умолчанию используется
CanonicalizationMethod.EXCLUSIVE.privateKey - Закрытый ключ для подписи.chain - Цепочка сертификатов подписанта. Должна содержать
как минимум один сертификат (сертификат подписи).addCertificateChain - True, если следует добавить всю
цепочку сертификатов в KeyInfo.signatureType - Тип создаваемой подписи.tsaUrl - Адрес TSA службы (для XAdES-T). Может быть null.XAdESExceptionpublic void addSigner(java.lang.String provider,
java.lang.String digestUri,
java.lang.String signatureUri,
java.lang.String canonicalizationMethod,
java.security.PrivateKey privateKey,
java.util.List<java.security.cert.X509Certificate> certificates,
boolean addCertificateChain,
java.lang.Integer signatureType,
java.lang.String tsaUrl)
throws XAdESException
IXAdESSignatureaddSigner in interface IXAdESSignatureprovider - Криптопровайдер для хеширования и подписи.digestUri - URI/URN алгоритма хэширования. Не используется,
может быть null.signatureUri - URI/URN алгоритма шифрования. Не используется,
может быть null.canonicalizationMethod - Метод каноникализации. Может быть
null. По умолчанию используется
CanonicalizationMethod.EXCLUSIVE.privateKey - Закрытый ключ для подписи.certificates - Цепочка сертификатов подписанта. Должна содержать
как минимум один сертификат (сертификат подписи).addCertificateChain - True, если следует добавить всю
цепочку сертификатов в KeyInfo.signatureType - Тип создаваемой подписи.tsaUrl - Адрес TSA службы (для XAdES-T). Может быть null.XAdESExceptionpublic void addSigner(java.lang.String provider,
java.lang.String digestUri,
java.lang.String signatureUri,
java.lang.String canonicalizationMethod,
java.security.PrivateKey privateKey,
java.util.List<java.security.cert.X509Certificate> certificates,
boolean addCertificateChain,
java.lang.Integer signatureType,
java.lang.String tsaUrl,
java.util.Set<java.security.cert.X509CRL> cRLs)
throws XAdESException
IXAdESSignatureaddSigner in interface IXAdESSignatureprovider - Криптопровайдер для хеширования и подписи.digestUri - URI/URN алгоритма хэширования. Не используется,
может быть null.signatureUri - URI/URN алгоритма шифрования. Не используется,
может быть null.canonicalizationMethod - Метод каноникализации. Может быть
null. По умолчанию используется
CanonicalizationMethod.EXCLUSIVE.privateKey - Закрытый ключ для подписи.certificates - Цепочка сертификатов подписанта. Должна содержать
как минимум один сертификат (сертификат подписи).addCertificateChain - True, если следует добавить всю
цепочку сертификатов в KeyInfo.signatureType - Тип создаваемой подписи.tsaUrl - Адрес TSA службы (для XAdES-T). Может быть null.cRLs - Список CRL для проверки цепочки сертификатов
подписанта или цепочки сертификатов штампа времени при
создании подписи формата XAdES-BES или XAdES-T. Может
быть null.XAdESExceptionpublic void setOptions(Options options)
SignatureOptionssetOptions in interface SignatureOptionsoptions - Параметры.public void open(java.io.OutputStream sgnOutStream)
throws XAdESException
IAdESSignatureIAdESSignature.close().open in interface IAdESSignaturesgnOutStream - Поток подписанных данных. Может
быть байтовым или файловым потоком.XAdESExceptionpublic void update(org.w3c.dom.Element element,
DataObjects dataObjects)
throws XAdESException
IXAdESSignatureIAdESSignature.open(java.io.OutputStream).update in interface IXAdESSignatureelement - Узел для добавления подписи.dataObjects - Список ссылок на подписываемые
XML объекты.XAdESExceptionpublic void close()
throws XAdESException
IAdESSignatureIAdESSignature.open(java.io.OutputStream).close in interface IAdESSignatureXAdESExceptionpublic void verify(java.util.Set<java.security.cert.X509Certificate> certificates)
throws XAdESException
IAdESSignatureverify in interface IAdESSignaturecertificates - Дополнительные сертификаты для построения
цепочек. Может быть null.XAdESExceptionpublic void verify(java.util.Set<java.security.cert.X509Certificate> certificates,
java.util.Set<java.security.cert.X509CRL> cRLs)
throws XAdESException
IAdESSignatureverify in interface IAdESSignaturecertificates - Дополнительные сертификаты для построения
цепочек. Может быть null.cRLs - Списки CRL, которые могут использоваться для проверки
подписи PKCS7, XML DSig, *AdES-BES или *AdES-T. Может быть null.XAdESException