SAML 2.0 XMLSignatureClass init()失败

时间:2015-07-29 04:23:48

标签: java xml saml-2.0 coldfusion-10

我正在尝试实现SAML 2.0连接。我已经做了很多搜索,而且我发现使用ColdFusion最接近示例代码的是:

http://dragonsaber.blogspot.com/2009/09/coldfusion-saml-part-1.html

http://dragonsaber.blogspot.com/2010/01/coldfusion-saml-part-2.html

http://dragonsaber.blogspot.com/2010/04/coldfusion-saml-part-3.html

http://philduba.com/default/assets/File/BeyondEncryp-cfobjective-2013.pdf

下面是我执行代码的片段。我的目标ColdFusion平台是版本10.

<cfscript>
    ssouser = {
        'email': 'user@domain.com',
        'name': 'User',
        'uuid': CreateUUID()
    };
    nowDateTime = DateFormat(DateConvert('local2utc', Now()), 'YYYY-MM-DDT') & TimeFormat(DateConvert('local2utc', Now()), 'HH:mm:SS.LZ');
    nowDateTimePlus1 = DateFormat(DateConvert('local2utc', Now()), 'YYYY-MM-DDT') & TimeFormat(DateConvert('local2utc', DateAdd('n', 1, Now())), 'HH:mm:SS.LZ');
    IDPDomain = "idp.domain.com";
    SPService = "sp.domain.com";
    SPDomain = "domain.com";
</cfscript>
<cfoutput>
    <cfxml variable="samlAssertionXML">
    <?xml version="1.0" encoding="UTF-8"?>
    <samlp:Response Destination="#SPService#" ID="#ssouser.uuid#" IssueInstant="#nowDateTime#" Version="2.0" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
        <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">#IDPDomain#</saml:Issuer>
        <samlp:Status>
            <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
        </samlp:Status>
        <saml:Assertion ID="#ssouser.uuid#" IssueInstant="#nowDateTime#" Version="2.0" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
            <saml:Issuer>#IDPDomain#</saml:Issuer>
            <saml:Subject>
                <saml:NameID>#ssouser.email#</saml:NameID>
                <saml:SubjectConfirmation Method="urn:oasis:names:tc:2.0:cm:bearer">
                    <saml:SubjectConfirmationData InResponseTo="#ssouser.uuid#" NotOnOrAfter="#nowDateTimePlus1#" Recipient="#SPService#"/>
                </saml:SubjectConfirmation>
            </saml:Subject>
            <saml:Conditions NotBefore="#nowDateTime#" NotOnOrAfter="#nowDateTimePlus1#">
                <saml:AudienceRestriction>
                    <saml:Audience>#SPDomain#</saml:Audience>
                </saml:AudienceRestriction>
            </saml:Conditions>
            <saml:AuthnStatement AuthnInstant="#nowDateTime#">
                <saml:AuthnContext>
                    <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
                </saml:AuthnContext>
            </saml:AuthnStatement>
            <saml:AttributeStatement>
                <saml:Attribute Name="screenName">
                    <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">#ssouser.name#</saml:AttributeValue>
                </saml:Attribute>
            </saml:AttributeStatement>
        </saml:Assertion>
    </samlp:Response>
    </cfxml>
</cfoutput>

<cfscript>
    // 1) Injest the XML
    samlAssertionElement = samlAssertionXML.getDocumentElement();
    samlAssertionDocument = samlAssertionElement.GetOwnerDocument();
    samlAssertion = samlAssertionDocument.getFirstChild();

//writedump(samlAssertionDocument); // show variable type of samlAssertionDocument
//abort;

    // 2) Create Java Objects
    SignatureSpecNS = CreateObject("Java", "org.apache.xml.security.utils.Constants").SignatureSpecNS;
    SecInit = CreateObject("Java", "org.apache.xml.security.Init").Init().init();
    XMLSignatureClass = CreateObject("Java", "org.apache.xml.security.signature.XMLSignature"); // Access XML Signature CLASS
    CanonicalizerClass = CreateObject("Java", "org.apache.xml.security.c14n.Canonicalizer"); // Access Canonicalizer CLASS

    // 3) Signature
    sigType = XMLSignatureClass.ALGO_ID_SIGNATURE_RSA_SHA1; // Define signature algorithm
    canonType = CanonicalizerClass.ALGO_ID_C14N_EXCL_OMIT_COMMENTS; // Define canonicalizer algorithm
    // init fails on the next line.
    signature = XMLSignatureClass.init(samlAssertionDocument, javacast("string",""), sigType, canonType); // Create signature and apply algorithms
</cfscript>

一切似乎都有效,直到它到达尝试创建签名对象的最后一行代码。以下是来自ColdFusion的失败消息:

Unable to find a constructor for class org.apache.xml.security.signature.XMLSignature that accepts parameters of type ( org.apache.xerces.dom.DeferredDocumentImpl, java.lang.String, java.lang.String, java.lang.String ). 

我浏览了XMLSignature.java的源代码,最接近的匹配构造函数是:

public XMLSignature(
    Document doc, 
    String baseURI, 
    String signatureMethodURI,
    String canonicalizationMethodURI
) throws XMLSecurityException {
    this(doc, baseURI, signatureMethodURI, 0, canonicalizationMethodURI);
}

继续查看XMLSignature.java,第一个参数是Document,看起来应该是“org.w3c.dom.Document”。

我怀疑问题是第一个参数的类型(变量“samlAssertionDocument”)的类型为“org.apache.xerces.dom.DeferredDocumentImpl”,而Java无法将强制转换为“org” .w3c.dom.Document”。

我尝试过javacast(),它似乎只适用于标准类型。

有没有办法轻松地将此变量转换为构造函数所期望的类型?如果有其他问题,请告诉我。

我在两个不同的博客上看到过类似的SAML 2.0示例,但它们来自2009/2010年并使用ColdFusion MX / 8。

我正在使用Apache Santuario项目(Apache XML Security for Java 1.5.8)。 1.5.8版包含易于使用的JAR文件。我在测试站点上设置了一个文件夹,并使用Application.cfc的“this.javaSettings”功能连接到它们。

我会使用较新的2.0.5版本,但似乎只有源格式。也就是说,我必须弄清楚如何创建JAR文件。

0 个答案:

没有答案