Статус: Активный участник
Группы: Участники
Зарегистрирован: 21.12.2016(UTC) Сообщений: 50  Откуда: Сургут Сказал(а) «Спасибо»: 10 раз Поблагодарили: 3 раз в 2 постах
|
Добрый день. Пытаемся взаимодействовать с ГИС ЖКХ. Там примерно как в СМЭВ 3 - SOAP и подписанная XML. Требования ЖКХ к подписи такие:  trebovanija_k_podpisi.zip (20kb) загружен 2 раз(а).Подписываем примерно как СМЭВ: Код:package TESTXMLSIGN;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.xml.security.signature.XMLSignature;
import org.apache.xml.security.transforms.Transform;
import org.apache.xml.security.transforms.Transforms;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class Main {
private static final String CANONICALIZATION_METHOD = "http://www.w3.org/2001/10/xml-exc-c14n#";
private static final String SIG_ID = "sigID";
private static final String COULD_NOT_FIND_XML_ELEMENT_NAME = "ERROR! Could not find xmlElementName = ";
private static final String GRID = "#";
private static final String signMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256";
private static final String digestMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256";
private static final String canonicalizationMethod = CANONICALIZATION_METHOD;
public static ByteArrayOutputStream MakeXMLSign(byte[] data,String xmlElementName,String xmlElementID,X509Certificate x509Cert,PrivateKey privateKey) throws Exception
{
ByteArrayOutputStream bais;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setIgnoringElementContentWhitespace(true);
dbf.setCoalescing(true);
dbf.setNamespaceAware(true);
DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
Document doc = documentBuilder.parse(new ByteArrayInputStream(data));
String sigId = SIG_ID;
XMLSignature sig = new XMLSignature(doc, "", signMethod, canonicalizationMethod);
sig.setId(sigId);
Element anElement = null;
NodeList nodeList = doc.getElementsByTagName(xmlElementName);
anElement = (Element) nodeList.item(0);
if (anElement != null) {
anElement.appendChild(sig.getElement());
} else {
throw new Exception(COULD_NOT_FIND_XML_ELEMENT_NAME + xmlElementName);
}
Transforms transforms = new Transforms(doc);
transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
transforms.addTransform(Transforms.TRANSFORM_C14N_WITH_COMMENTS);
sig.addDocument(xmlElementID == null ? "" : GRID + xmlElementID, transforms, digestMethod);
sig.addKeyInfo(x509Cert);
sig.sign(privateKey);
bais = new ByteArrayOutputStream();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
trans.transform(new DOMSource(doc), new StreamResult(bais));
bais.close();
return bais;
}
public static void main(String[] args) throws Exception {
byte[] data = Files.readAllBytes(Paths.get("test.xml"));
System.setProperty("org.apache.xml.security.ignoreLineBreaks", "true");
ru.CryptoPro.JCPxml.xmldsig.JCPXMLDSigInit.init();
Transform.register(SmevTransformSpi.ALGORITHM_URN, SmevTransformSpi.class.getName());
String cer_story = "HDImageStore";
String cer_alias = "gis-smev-cert";
String cer_pass_str = "xxxx";
char[] cer_pass = cer_pass_str.toCharArray();
KeyStore keyStore = KeyStore.getInstance( cer_story );
keyStore.load( null, null );
PrivateKey privateKey = (PrivateKey) keyStore.getKey( cer_alias, cer_pass );
X509Certificate x509Cert = (X509Certificate) keyStore.getCertificate( cer_alias );
String xmlElementName = "exportNsiListRequest";
String xmlElementID = "foo";
ByteArrayOutputStream bais=MakeXMLSign(data,xmlElementName,xmlElementID,x509Cert,privateKey);
FileOutputStream outs = new FileOutputStream("signed_file.xml");
outs.write(bais.toByteArray());
outs.close();
}
}
Получается вот такая подпись:  my_sig.zip (4kb) загружен 1 раз(а).Она отличается от той что в примере ГИС ЖКХ. В ней меньше блоков Reference в ней нет блока Object/QualifyingProperties Подскажите в чем причина? Как правильно сделать подпись для ГИС ЖКХ на JAVA с использованием ru.CryptoPro.JCPxml.xmldsig.JCPXMLDSigInit ?
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close