Как подписать ответ SAML с помощью Open SAML?

Мне нужно реализовать логику, аналогичную этому в Java.

У меня есть XML, который не подписан, и сообщение перед отправкой поставщику услуг. У меня есть как закрытый, так и открытый ключ и неподписанный XML.

Может ли кто-нибудь помочь мне предоставить фрагмент кода, какой именно метод вызывать, чтобы подписать сообщение с использованием открытого и закрытого ключа.


person Ashish    schedule 23.02.2017    source источник
comment
Какую версию OpenSAML вы используете?   -  person gusto2    schedule 24.02.2017


Ответы (3)


Вы также можете использовать утилиты onelogin saml-java из Onelogin Saml Java — это кажется намного проще в использовании (у них есть метод для загрузки открытого, закрытого ключа, документа из строки и т. д. Затем вы можете использовать его, чтобы подписать либо весь ответ SAML, либо подписать утверждение, а затем ответ:

Document document = Util.loadXML(saml); //loads string to document

//load private key and certificate
X509Certificate cert = Util.loadCert(pubKeyBytes);
PrivateKey privateKey = Util.loadPrivateKey(privKeyBytes);

//sign the response
String signedResponse = Util.addSign(document, privateKey, cert, null);

чтобы использовать эту библиотеку, просто добавьте

<dependency>
    <groupId>com.onelogin</groupId>
    <artifactId>java-saml</artifactId>
    <version>2.0.0</version>
</dependency>

зависимость от вашего проекта pom.xml

person shimon001    schedule 01.09.2017

Вы создаете объект Signature и устанавливаете для него свойства подписи.

signature.setSigningCredential(credential);
signature.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1);
signature.setCanonicalizationAlgorithm(SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS);

Затем вы устанавливаете объект подписи в ответе

.setSignature(signature)

Затем вы упорядочиваете объект ответа

XMLObjectProviderRegistrySupport
   .getMarshallerFactory()
   .getMarshaller(response)
   .marshall(response);

Наконец, вы используете класс Signer для выполнения подписи

Signer.signObject(signature);

У меня есть дополнительная информация в этой записи в моем блоге

person Stefan Rasmusson    schedule 27.02.2017
comment
Вы заслуживаете большего количества голосов за этот ответ. Большое спасибо за разъяснения, а также за сообщение в блоге. Отличная статья, мне пригодилась. - person Gozus19; 10.09.2020

Для opensaml3 используйте:

import org.opensaml.xmlsec.signature.support.Signer;
person hzhsun    schedule 18.04.2019
comment
Хотя этот код может решить проблему, включая объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщение и, вероятно, приведет к большему количеству голосов. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для того, кто задает сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются. - person double-beep; 18.04.2019