日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文介紹了如何使用OpenSAML2和Java測試/調試解密的加密斷言?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我正試圖與OpenSAML2(2.6.6)一起編寫一個Java應用程序來解密加密的斷言,但我得到了:

[main] ERROR org.opensaml.xml.encryption.Decrypter - Failed to decrypt EncryptedKey, valid decryption key could not be resolved
[main] ERROR org.opensaml.xml.encryption.Decrypter - Failed to decrypt EncryptedData using either EncryptedData KeyInfoCredentialResolver or EncryptedKeyResolver + EncryptedKey KeyInfoCredentialResolver
[main] ERROR org.opensaml.saml2.encryption.Decrypter - SAML Decrypter encountered an error decrypting element content

這是我的Java代碼(抱歉,它仍然有很多調試輸出):

/*
 * ****************************************************************************************************
 * Original source from: https://stackoverflow.com/questions/9422545/decrypting-encrypted-assertion-using-saml-2-0-in-java-using-opensaml
 * And hint about needed to add DefaultBootstrap.bootstrap() for OpenSAML 2.x: https://stackoverflow.com/questions/25066183/opensaml-error-receiving-correct-unmarshaller
 * And hing about chain resolvers: https://www.programcreek.com/java-api-examples/index.php?api=org.opensaml.saml2.encryption.Decrypter
 * ****************************************************************************************************
 * ****************************************************************************************************
 * ****************************************************************************************************
 * ****************************************************************************************************
 */
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.ArrayList;
import java.util.List;

import org.opensaml.DefaultBootstrap;
import org.opensaml.saml2.core.Assertion;
import org.opensaml.saml2.core.EncryptedAssertion;
import org.opensaml.saml2.encryption.Decrypter;
import org.opensaml.saml2.encryption.EncryptedElementTypeEncryptedKeyResolver;
import org.opensaml.xml.Configuration;
import org.opensaml.xml.encryption.ChainingEncryptedKeyResolver;
import org.opensaml.xml.encryption.EncryptedKeyResolver;
import org.opensaml.xml.encryption.InlineEncryptedKeyResolver;
import org.opensaml.xml.encryption.SimpleRetrievalMethodEncryptedKeyResolver;
import org.opensaml.xml.io.Unmarshaller;
import org.opensaml.xml.io.UnmarshallerFactory;
import org.opensaml.xml.parse.BasicParserPool;
import org.opensaml.xml.security.keyinfo.StaticKeyInfoCredentialResolver;
import org.opensaml.xml.security.x509.BasicX509Credential;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class test_opensaml {


    public static void main(String[] args) {
        String PROGVERSION = "V1.00";

        String xmlFileName = "";
        String privateKeyFileName = "";

        System.out.println("test_opensaml " + PROGVERSION);

        if(args.length < 2) {
            System.out.println("Command line is: java test_opensaml <signed_samlassertion_xml> <private_key_der>");
            System.exit(0);
        }

        xmlFileName = args[0];
        privateKeyFileName = args[1];

        Logger logger = LoggerFactory.getLogger(test_opensaml.class);
        logger.info("xmlFileName=[" + xmlFileName + "]");
        logger.info("privateKeyFileName=[" + privateKeyFileName + "]
");

        try {
            // Initialize the library
            DefaultBootstrap.bootstrap();
        } catch (Exception e) {
            System.out.println("** ERROR ** - ERROR WHILE Executing DefaultBootstrap.bootstrap() - e=[" + e + "]");
            System.exit(-1);
        }

        InputStream inputStream = null;

        // Load the XML file and parse it.
        File xmlFile = new File(xmlFileName);
        try {
            inputStream = new FileInputStream(xmlFile);
        } catch (Exception e) {
            System.out.println("** ERROR ** - ERROR WHILE LOADING ASSERTION XML FILE - e=[" + e + "]");
            System.exit(-1);
        }


        BasicParserPool parserPoolManager = new BasicParserPool();

        Document document = null;
        Element metadataRoot = null;
        try {
            document = parserPoolManager.parse(inputStream);
            metadataRoot = document.getDocumentElement();
            System.out.println("metadataRoot.getNodeName()=[" + metadataRoot.getNodeName() + "]");
        } catch (Exception e) {
            System.out.println("** ERROR ** - ERROR WHILE CREATING DOCUMENT FROM XML FILE - e=[" + e + "]");
            System.exit(-1);
        }

        UnmarshallerFactory unmarshallerFactory = null;
        Unmarshaller unmarshaller = null;
        EncryptedAssertion encryptedAssertion = null;

        try {
            // Unmarshall
            unmarshallerFactory = Configuration.getUnmarshallerFactory();
        } catch (Exception e) {
            System.out.println("** ERROR ** - ERROR WHILE CREATING UNMARSHALLFACTORY - e=[" + e + "]");
            System.exit(-1);
        }

        if (unmarshallerFactory == null) {
            System.out.println("unmarshallerFactory is null");
        } else {
            System.out.println("unmarshallerFactory is OK/NOT-null");
        }

        try {
            // Unmarshall
            unmarshaller = unmarshallerFactory.getUnmarshaller(metadataRoot);
            if (unmarshaller == null) {
                System.out.println("unmarshaller is null");
            } else {
                System.out.println("unmarshaller is OK/NOT-null");
            }

            System.out.println("unmarshaller.getClass().getname=[" + unmarshaller.getClass().getName() + "]");
        } catch (Exception e) {
            System.out.println("** ERROR ** - ERROR WHILE CREATING UNMARSHALLER - e=[" + e + "]");
            System.exit(-1);
        }


        try {
            // Unmarshall
            encryptedAssertion = (EncryptedAssertion)unmarshaller.unmarshall(metadataRoot);
        } catch (Exception e) {
            System.out.println("** ERROR ** - ERROR CREATING ENCRYPTEDASSERTION BY UNMARSHALLING - e=[" + e + "]");
            e.printStackTrace();
            System.exit(-1);
        }
        System.out.println("SUCCESS - CREATED ENCRYPTEDASSERTION BY UNMARSHALLING!!");
        System.out.println("Will now try to load the PRIVATE KEY FILE...");

        // Load the private key file.
        File privateKeyFile = new File(privateKeyFileName);
        FileInputStream inputStreamPrivateKey = null;
        byte[] encodedPrivateKey = null;
        try {
            inputStreamPrivateKey = new FileInputStream(privateKeyFile);
            encodedPrivateKey = new byte[(int)privateKeyFile.length()];
            inputStreamPrivateKey.read(encodedPrivateKey);
            inputStreamPrivateKey.close();
        } catch (Exception e) {
            System.out.println("** ERROR ** - ERROR WHILE READING PRIVATE KEY FROM FILE - e=[" + e + "]");
            System.exit(-1);
        }
        System.out.println("SUCCESS - READ/INPUT THE PRIVATE KEY FILE!!");

        PKCS8EncodedKeySpec privateKeySpec = null;
        RSAPrivateKey privateKey = null;
        try {
            // Create the private key.
            privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey);
            privateKey = (RSAPrivateKey)KeyFactory.getInstance("RSA").generatePrivate(privateKeySpec);
        } catch (Exception e) {
            System.out.println("** ERROR ** - ERROR WHILE CREATING PRIVATE KEY - e=[" + e + "]");
            System.exit(-1);
        }
        System.out.println("SUCCESS - CREATING THE PRIVATE KEY INSTANCE!!");



        ChainingEncryptedKeyResolver keyResolver = new ChainingEncryptedKeyResolver();
        keyResolver.getResolverChain().add(new InlineEncryptedKeyResolver());
        keyResolver.getResolverChain().add(new EncryptedElementTypeEncryptedKeyResolver());
        keyResolver.getResolverChain().add(new SimpleRetrievalMethodEncryptedKeyResolver());
        System.out.println("Built a list of encrypted key resolvers...");

        boolean successfulDecryption = false;

        // Create the credentials.
        BasicX509Credential decryptionCredential = new BasicX509Credential();
        decryptionCredential.setPrivateKey(privateKey);

        StaticKeyInfoCredentialResolver resolver = new StaticKeyInfoCredentialResolver(decryptionCredential);

        // Create a decrypter.
        Decrypter decrypter = new Decrypter(null, resolver, keyResolver);
        decrypter.setRootInNewDocument(true);
        // Decrypt the assertion.
        Assertion decryptedAssertion = null;
        System.out.println("WILL NOW TRY TO DECRYPT THE ENCRYPTED ASSERTION...");
        try
        {
            decryptedAssertion = decrypter.decrypt(encryptedAssertion);
        } catch (Exception e) {
            System.out.println("** ERROR ** - ERROR WHILE DECRYPTING THE ASSERTION - e=[" + e + "]");
            System.exit(-1);
        }

        System.out.println("SUCCESS - DECRYPTED THE ENCRYPTED ASSERTION - will now dump out the decrypted assertion...!!");
        System.out.println("decryptedAssertion.toString=[" + decryptedAssertion.toString() + "]");
        System.out.println("Finished...");
        System.exit(0);
    } // end main()

}

當我使用測試簽名的斷言(XML)和私鑰運行它時,我得到以下輸出。這是在Eclipse下運行,并使用Java 1.8內部版本201:

test_opensaml V1.00
[main] INFO test_opensaml - xmlFileName=[E:ECLIPSE-WORKSPACESopensamlopensamldataencrypted_assertion.xml]
[main] INFO test_opensaml - privateKeyFileName=[E:ECLIPSE-WORKSPACESopensamlopensamldatageoaxis-gxaccess.com.private-key.der]

metadataRoot.getNodeName()=[saml:EncryptedAssertion]
unmarshallerFactory is OK/NOT-null
unmarshaller is OK/NOT-null
unmarshaller.getClass().getname=[org.opensaml.saml2.core.impl.EncryptedAssertionUnmarshaller]
SUCCESS - CREATED ENCRYPTEDASSERTION BY UNMARSHALLING!!
Will now try to load the PRIVATE KEY FILE...
SUCCESS - READ/INPUT THE PRIVATE KEY FILE!!
SUCCESS - CREATING THE PRIVATE KEY INSTANCE!!
Built a list of encrypted key resolvers...
WILL NOW TRY TO DECRYPT THE ENCRYPTED ASSERTION...
[main] ERROR org.opensaml.xml.encryption.Decrypter - Error decrypting encrypted key
org.apache.xml.security.encryption.XMLEncryptionException: Unwrapping failed
Original Exception was java.security.InvalidKeyException: Unwrapping failed
    at org.apache.xml.security.encryption.XMLCipher.decryptKey(XMLCipher.java:1539)
    at org.opensaml.xml.encryption.Decrypter.decryptKey(Decrypter.java:708)
    at org.opensaml.xml.encryption.Decrypter.decryptKey(Decrypter.java:639)
    at org.opensaml.xml.encryption.Decrypter.decryptUsingResolvedEncryptedKey(Decrypter.java:794)
    at org.opensaml.xml.encryption.Decrypter.decryptDataToDOM(Decrypter.java:535)
    at org.opensaml.xml.encryption.Decrypter.decryptDataToList(Decrypter.java:453)
    at org.opensaml.xml.encryption.Decrypter.decryptData(Decrypter.java:414)
    at org.opensaml.saml2.encryption.Decrypter.decryptData(Decrypter.java:141)
    at org.opensaml.saml2.encryption.Decrypter.decrypt(Decrypter.java:69)
    at test_opensaml.main(test_opensaml.java:193)
Caused by: java.security.InvalidKeyException: Unwrapping failed
    at com.sun.crypto.provider.RSACipher.engineUnwrap(RSACipher.java:445)
    at javax.crypto.Cipher.unwrap(Cipher.java:2549)
    at org.apache.xml.security.encryption.XMLCipher.decryptKey(XMLCipher.java:1537)
    ... 9 more
Caused by: javax.crypto.BadPaddingException: Decryption error
    at sun.security.rsa.RSAPadding.unpadOAEP(Unknown Source)
    at sun.security.rsa.RSAPadding.unpad(Unknown Source)
    at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363)
    at com.sun.crypto.provider.RSACipher.engineUnwrap(RSACipher.java:440)
    ... 11 more
[main] ERROR org.opensaml.xml.encryption.Decrypter - Failed to decrypt EncryptedKey, valid decryption key could not be resolved
[main] ERROR org.opensaml.xml.encryption.Decrypter - Failed to decrypt EncryptedData using either EncryptedData KeyInfoCredentialResolver or EncryptedKeyResolver + EncryptedKey KeyInfoCredentialResolver
[main] ERROR org.opensaml.saml2.encryption.Decrypter - SAML Decrypter encountered an error decrypting element content
org.opensaml.xml.encryption.DecryptionException: Failed to decrypt EncryptedData
    at org.opensaml.xml.encryption.Decrypter.decryptDataToDOM(Decrypter.java:546)
    at org.opensaml.xml.encryption.Decrypter.decryptDataToList(Decrypter.java:453)
    at org.opensaml.xml.encryption.Decrypter.decryptData(Decrypter.java:414)
    at org.opensaml.saml2.encryption.Decrypter.decryptData(Decrypter.java:141)
    at org.opensaml.saml2.encryption.Decrypter.decrypt(Decrypter.java:69)
    at test_opensaml.main(test_opensaml.java:193)
** ERROR ** - ERROR WHILE DECRYPTING THE ASSERTION - e=[org.opensaml.xml.encryption.DecryptionException: Failed to decrypt EncryptedData]

由于這是(至少對我而言)新的未經測試的代碼,我想知道如何才能進一步診斷此問題?

是否有其他日志記錄或其他內容可以幫助找出問題所在或找出問題所在?

我知道這聽起來有點不尋常,但僅供參考,第三方給了我現在用來測試的簽名斷言和私鑰,所以我實際上不能100%確定它們是否正確,所以我想知道是否有什么地方可以獲得/下載已知良好的加密斷言示例和相應的私鑰,以便我可以嘗試使用已知良好的數據來測試上面的代碼?

謝謝,
吉姆

編輯:對不起,我忘了包括我用來測試的加密斷言的片段:

<?xml version="1.0"?>
<saml:EncryptedAssertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
<xenc:EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" Id="_332ec9de74ee4a8b97b84694edb58ba9" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<xenc:EncryptedKey Type="http://www.w3.org/2001/04/xmlenc#Element" Id="_d32f036453ed438b84783a21a2e2cca7">
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p"/>
<xenc:CipherData>
<xenc:CipherValue>Rfn5PDApVSF3wTBgsiQsFn5rybj...EZoHpGvxDPv5kAhVw==</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedKey>
</ds:KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>FTk8D8nGOTuZsunGifMEHtj...xiAvwSQ=</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</saml:EncryptedAssertion>

編輯2:對于熟悉OpenSAML和SAML的人:上面簽名的斷言有問題嗎?我已經做了一些額外的測試,似乎沒有一個解析器能夠找到加密密鑰,我注意到ds:KeyInfo嵌入到Xenc:EncryptedData中,與Xenc:CipherData處于同一級別。這是正常的結構嗎?哪個鏈式解析器應該找到ds:KeyInfo?

推薦答案

僅供參考,一旦我找到了與示例加密斷言匹配的正確私鑰,我終于讓它按原樣工作。

這篇關于如何使用OpenSAML2和Java測試/調試解密的加密斷言?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,

分享到:
標簽:Java 加密 如何使用 斷言 測試 解密 調試
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定