Как использовать библиотеку Java OneLogin для получения результатов шифрования SAML, например, их онлайн-инструмента? - PullRequest
0 голосов
/ 15 мая 2019

Мне нужно подписать и зашифровать ответ 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);
...