Мне нужно подписать и зашифровать ответ SAML. У OneLogin здесь есть онлайн-инструмент https://www.samltool.com/encrypt.php. Я бы хотел использовать их библиотеку Java, чтобы делать то же, что и их онлайн-инструмент. Используя библиотеку Java OneLogin, я смог сделать первое (подписать). Библиотека явно не делает последнее (шифрует). Тем не менее, этот пост здесь https://github.com/onelogin/java-saml/issues/228
предоставляет решение. Я попробовал это решение, но сгенерировал дефектный зашифрованный ответ, который невозможно расшифровать. Ответ имеет правильный формат и является действительным XML-кодом. Мой код выглядит как ниже. Может кто-нибудь сказать мне, где на моих этапах шифрования я ошибся?
// шаг 1, знак
// шаг 2, шифрование
String SymCertFileName = "test-cert.pem";
String SymCertcontents = new
String(Files.readAllBytes(Paths.get(SymCertFileName)));
X509Certificate SymCert = Util.loadCert(SymCertcontents);
Document signedDocument = Util.loadXML(newsignedresp); // from step 1
Key symmetricKey = Util.generateSymmetricKey();
// cipher for encrypt the data
XMLCipher xmlCipher = XMLCipher.getInstance(Constants.AES256_CBC);
xmlCipher.init(XMLCipher.ENCRYPT_MODE, symmetricKey);
// cipher for encrypt the symmetric key
XMLCipher keyCipher =
XMLCipher.getInstance(Constants.RSA_OAEP_MGF1P);
keyCipher.init(XMLCipher.WRAP_MODE,
SymCert.getPublicKey());
// encrypt the symmetric key
EncryptedKey encryptedKey = keyCipher.encryptKey(signedDocument,
symmetricKey);
EncryptedData encryptedData = xmlCipher.getEncryptedData();
KeyInfo keyInfo = new KeyInfo(signedDocument);
keyInfo.add(encryptedKey);
encryptedData.setKeyInfo(keyInfo);
Element signedAssertion =
signedDocument.getElementById("signed_assertion");
signedAssertion.removeAttribute("Version");
signedAssertion.removeAttribute("ID");
signedAssertion.removeAttribute("IssueInstant");
Document encryptedResult =
xmlCipher.doFinal(signedAssertion.getOwnerDocument(),
signedAssertion, false);