5

サービス プロバイダー サイトで OpenSAML を使用して、クライアントに SSO を提供しています。私たちのクライアント (ID プロバイダー) は、最後に OpenSSO を使用しています。OpenSSO によってポストされる SAML 応答は、名前空間によって修飾されていない署名要素に関しては少し異なります。これは OpenSAML ではうまくいかないようで samlResponse.getSignature()、署名を検証できないため、メソッドから null が返されます。

問題を引き起こしている SamlReponse の署名スニペット

<Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
        <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
        <Reference URI="#s2d10cccbd58d1f78c2c76c74c82a236548c929ffd">
            <Transforms>
                <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <DigestValue>j+KBoDOtEcyCquPTxRCXoBulStQ=</DigestValue>
        </Reference>
    </SignedInfo>
    <SignatureValue>Dv+owuZfGFymGGrw2gHA3/7GVC6mXt8JMW+tOvmtnjTRJZaDE+Nb2NCngio1Tnqu4LWnvVrry4Wk... 6QcIJi/kGc4YFMSQj/Q=</SignatureValue>
    <KeyInfo>
        <X509Data>
            <X509Certificate>MIIEhDCCA+2gAwIBAgIQXxhipi2wpPxWi7MTVfFVHDANBgkqhkiG9w0BAQUFADCBujEfMB0GA1UE... 78Q/lRQuBhHMy02lKctnwjBeEYA=</X509Certificate>
        </X509Data>
    </KeyInfo>
</Signature>

機能する別の SAML レスポンスからの署名スニペット

<dsig:Signature xmlns="http://www.w3.org/2000/09/xmldsig#" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    <dsig:SignedInfo>
        <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
        <dsig:Reference URI="#id-TtLltjcBSOAJ6OipumUEj8o0Qag-">
            <dsig:Transforms>
                <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </dsig:Transforms>
            <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <dsig:DigestValue>5c95zhA139qzMvZA2A445F3LWaU=</dsig:DigestValue>
        </dsig:Reference>
    </dsig:SignedInfo>
    <dsig:SignatureValue>JsmRFJn1CjClHs4rf0hrwKzOq6ZtmnOEm/PNiaJvYurko/ZP+PApWhk55x0unIVwZ6XDv3k8Dj81WqUl07J0Dkvzp71bccIgiGTRzoNPT71nBAXxJmZiXz51JWctg13zjxP0oQMSpWytKCrFkCkJ0So3RQl3WixYV3miK0YjJnM=</dsig:SignatureValue>
    <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    </ds:KeyInfo>
</dsig:Signature>

上記からわかるように、OpenSSO サーバーからの署名スニペットには、SAML バインディング仕様で指定されている名前空間修飾子が含まれていません。

私にとっての最後のオプションは、OpenSAML ライブラリを機能させるために署名要素の前に名前空間を追加するために投稿された SAMLResponse のいくつかのマッサージを行うことです。

OpenSAML ライブラリを使用してこれを解決する方法についてのアイデアは高く評価されています。

よろしくお願いします CJ

4

2 に答える 2

0

ComponentSpace SAML 2.0 ライブラリを使用していますが、ID プロバイダーとして ADFS を使用していたお客様と同様の問題に遭遇しました。ADFSサーバーによって生成されたXML要素は、最初の例のように個別に修飾されておらず、最初はそれが問題だと思っていました.

それは有効な XML であり、問​​題ではなかったことが判明しました。私たちの場合、ComponentSpace ライブラリには、署名されたアサーションと署名されていないアサーションを処理するためのさまざまなメソッドがありました。署名されたアサーションのチェックに切り替えると、機能しました。

OpenSAML ライブラリは、修飾されていない XML 要素を処理できる必要があります。ライブラリ管理者に問題として報告することをお勧めします。

于 2012-06-21T15:36:14.323 に答える
0

XML を修復するために何らかの DOM 操作を実行できる場合があります。たとえば、クライアントからの SAML 応答 XML の一部の名前空間属性を修正するために作成しなければならなかったコードを次に示します (実際には、名前空間は応答要素で定義されていましたが、アサーションを抽出する必要があり、名前空間を保持する必要がありました)。

Element assertionElem = assertion.getDOM();

if (!assertionElem.hasAttribute("xmlns:saml")) {
   assertionElem.setAttribute("xmlns:saml", "urn:oasis:names:tc:SAML:2.0:assertion");
}

if (!assertionElem.hasAttribute("xmlns:ds")) {
   assertionElem.setAttribute("xmlns:ds", "http://www.w3.org/2000/09/xmldsig#");
}

String assertionXml = Serializer.serializeXml(assertionElem, true, true);

setDOM()xmlns="http://www.w3.org/2000/09/xmldsig#" 属性を Signature に追加してから更新することができます。問題は、samlResponse.getSignature().getDOM()XML を取得するかどうか、または応答全体の DOM を取得してそこから Signature 要素を抽出する必要があるかどうかです。

もちろん、実際には、クライアントが不適切に名前空間が付けられた XML を送信するべきではありませんが、それがどのように行われるかはわかっています。

于 2010-11-05T20:26:55.673 に答える