Подписание сообщения и утверждения с помощью Java Saml от Onelogin - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь следовать этому ответу: { ссылка }

Я могу подписать ответное сообщение SAML:

        String saml = "...";
        String pubKeyBytes = "...";
        String privKeyBytes = "...";

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

        X509Certificate cert = null;
        cert = Util.loadCert(pubKeyBytes);
        PrivateKey privateKey = Util.loadPrivateKey(privKeyBytes);

        //sign saml assertion:
        String stringSignedResponse = Util.addSign(documentResponse, privateKey, cert, null);

Я могу вытащить утверждение SAML и подпишите это:

        NodeList nodelist = documentResponse.getElementsByTagName("saml2:Assertion");
        Node nodeSamlAssertion = nodelist.item(0);

        String stringSignedSamlAssertion = Util.addSign(nodeSamlAssertion, privateKey, cert, null);

НО как мне объединить их (как это возможно с помощью онлайн-инструмента OneLogin https://www.samltool.com/sign_response.php в режиме «Подписать сообщение и утверждение»)?

1 Ответ

0 голосов
/ 15 июля 2020

Разработано, как это сделать,

  1. Превращение строки, возвращаемой из Util.addSign (nodeSamlAssertion, ..), обратно в узел

  2. Импорт этого узла обратно в объект документа ответа SAML.

  3. Использование метода Element.replaceChild для переключения неподписанного узла утверждения SAML на подписанный узел утверждения SAML

    Элемент nodeSignedSamlAssertion = DocumentBuilderFactory .newInstance () .newDocumentBuilder () .parse (новый ByteArrayInputStream (stringSignedSamlAssertion.getBytes ())) .getDocumentElement ();

         Node copiedNode = documentResponse.importNode(nodeSignedSamlAssertion, true);
         documentResponse.getDocumentElement().replaceChild(copiedNode, documentResponse.getElementsByTagName("saml2:Assertion").item(0));
    
    * 1017
...