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
- Тип подписи.XAdESException
public 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
IXAdESSignature
getXAdESSignerInfo
in interface IXAdESSignature
index
- Номер элемента.java.lang.ArrayIndexOutOfBoundsException
public XAdESSigner[] getXAdESSignerInfos()
IXAdESSignature
getXAdESSignerInfos
in interface IXAdESSignature
public 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
IXAdESSignature
addSigner
in interface IXAdESSignature
provider
- Криптопровайдер для хеширования и подписи.digestUri
- URI/URN алгоритма хэширования. Не используется,
может быть null.signatureUri
- URI/URN алгоритма шифрования. Не используется,
может быть null.canonicalizationMethod
- Метод каноникализации. Может быть
null. По умолчанию используется
CanonicalizationMethod.EXCLUSIVE.privateKey
- Закрытый ключ для подписи.chain
- Цепочка сертификатов подписанта. Должна содержать
как минимум один сертификат (сертификат подписи).signatureType
- Тип создаваемой подписи.tsaUrl
- Адрес TSA службы (для XAdES-T). Может быть null.XAdESException
public 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
IXAdESSignature
addSigner
in interface IXAdESSignature
provider
- Криптопровайдер для хеширования и подписи.canonicalizationMethod
- Метод каноникализации. Может быть
null. По умолчанию используется
CanonicalizationMethod.EXCLUSIVE.privateKey
- Закрытый ключ для подписи.chain
- Цепочка сертификатов подписанта. Должна содержать
как минимум один сертификат (сертификат подписи).signatureType
- Тип создаваемой подписи.tsaUrl
- Адрес TSA службы (для XAdES-T). Может быть null.XAdESException
public 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
IXAdESSignature
addSigner
in interface IXAdESSignature
provider
- Криптопровайдер для хеширования и подписи.canonicalizationMethod
- Метод каноникализации. Может быть
null. По умолчанию используется
CanonicalizationMethod.EXCLUSIVE.privateKey
- Закрытый ключ для подписи.chain
- Цепочка сертификатов подписанта. Должна содержать
как минимум один сертификат (сертификат подписи).addCertificateChain
- True, если следует добавить всю
цепочку сертификатов в KeyInfo.signatureType
- Тип создаваемой подписи.tsaUrl
- Адрес TSA службы (для XAdES-T). Может быть null.XAdESException
public 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
IXAdESSignature
addSigner
in interface IXAdESSignature
provider
- Криптопровайдер для хеширования и подписи.digestUri
- URI/URN алгоритма хэширования. Не используется,
может быть null.signatureUri
- URI/URN алгоритма шифрования. Не используется,
может быть null.canonicalizationMethod
- Метод каноникализации. Может быть
null. По умолчанию используется
CanonicalizationMethod.EXCLUSIVE.privateKey
- Закрытый ключ для подписи.certificates
- Цепочка сертификатов подписанта. Должна содержать
как минимум один сертификат (сертификат подписи).addCertificateChain
- True, если следует добавить всю
цепочку сертификатов в KeyInfo.signatureType
- Тип создаваемой подписи.tsaUrl
- Адрес TSA службы (для XAdES-T). Может быть null.XAdESException
public 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
IXAdESSignature
addSigner
in interface IXAdESSignature
provider
- Криптопровайдер для хеширования и подписи.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.XAdESException
public void setOptions(Options options)
SignatureOptions
setOptions
in interface SignatureOptions
options
- Параметры.public void open(java.io.OutputStream sgnOutStream) throws XAdESException
IAdESSignature
IAdESSignature.close()
.open
in interface IAdESSignature
sgnOutStream
- Поток подписанных данных. Может
быть байтовым или файловым потоком.XAdESException
public void update(org.w3c.dom.Element element, DataObjects dataObjects) throws XAdESException
IXAdESSignature
IAdESSignature.open(java.io.OutputStream)
.update
in interface IXAdESSignature
element
- Узел для добавления подписи.dataObjects
- Список ссылок на подписываемые
XML объекты.XAdESException
public void close() throws XAdESException
IAdESSignature
IAdESSignature.open(java.io.OutputStream)
.close
in interface IAdESSignature
XAdESException
public void verify(java.util.Set<java.security.cert.X509Certificate> certificates) throws XAdESException
IAdESSignature
verify
in interface IAdESSignature
certificates
- Дополнительные сертификаты для построения
цепочек. Может быть null.XAdESException
public void verify(java.util.Set<java.security.cert.X509Certificate> certificates, java.util.Set<java.security.cert.X509CRL> cRLs) throws XAdESException
IAdESSignature
verify
in interface IAdESSignature
certificates
- Дополнительные сертификаты для построения
цепочек. Может быть null.cRLs
- Списки CRL, которые могут использоваться для проверки
подписи PKCS7, XML DSig, *AdES-BES или *AdES-T. Может быть null.XAdESException