7

私は、現在取り組んでいる iOS プロジェクトで XML デジタル署名の世界に放り込まれました。SAML アサーションのデジタル署名を検証する必要があります。

私は XML 署名の検証について多くのことを読んできましたが、秘密鍵を使用してダイジェストに署名する方法についての基本を理解し、公開鍵 (含まれている x509 証明書に含まれている必要があります) を使用して検証できると思います。 SAML トークンのソースを特定できます。

署名を検証するために必要なコードがたくさんあるように見えるCライブラリ xmlsec を見つけ、それを実装しようと取り組んでいます。しかし、私はそれを理解することができませんでした。私が理解していることから、ライブラリを自分のコードでコンパイルする必要があると確信しています。ソースをプロジェクトにコピーしましたが、コンパイル中に定義されていないというエラーが発生します。

その道をたどるのに数え切れないほどの時間を費やす前に、コミュニティに連絡して、xml デジタル署名を検証した経験があるかどうか、iOS プロジェクトでそれを実装するための洞察を提供できるかどうかを確認することにしました。

参考までに、シングル サインオン サービスから取得した SAML アサーションの一部を次に示します。

<?xml version="1.0" encoding="UTF-16"?>
<saml:Assertion ID="oQ2YZuHBspA_f91HM8o3.o6ZZla" IssueInstant="2011-05-06T00:51:40.733Z" Version="2.0" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<saml:Issuer>[...]</saml:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
        <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
        <ds:Reference URI="#oQ2YZuHBspA_f91HM8o3.o6ZZla">
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <ds:DigestValue>zj4pCHBNMln+28Jq/v1YIScfiuw=</ds:DigestValue>
        </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>[...]</ds:SignatureValue>
    <ds:KeyInfo>
        <ds:X509Data>
            <ds:X509Certificate>MIIDVjCCAj6gAwIBAgIGAS67wkWCMA0GCSqGSIb3[...]7bgf</ds:X509Certificate>
        </ds:X509Data>
        <ds:KeyValue>
            <ds:RSAKeyValue>
                <ds:Modulus>[...]</ds:Modulus>
                <ds:Exponent>AQAB</ds:Exponent>
            </ds:RSAKeyValue>
        </ds:KeyValue>
    </ds:KeyInfo>
</ds:Signature>
4

1 に答える 1

9

iPhone 用のコンパイルxmlsecは少しトリッキーですが、実行できます。

まず、いくつかの一般的な考慮事項:

  1. xmlsecGNU ビルド システムを使用する GNU プロジェクトです。そのようなプロジェクトを 1 つビルドすることは、スクリプトを実行 (構成) してから を実行することになりmakeます。xmlsecconfigure は、正確なシステム構成に合わせて調整された Makefile を作成し、ビルドに含めるかどうかのオプションを選択できるようにします。

  2. xmlseclibssllibcrypto(openssl の一部)、、、、、などlibxsltの他libxml2のライブラリからの依存関係がいくつかlibzありlibiconvます。iPhone SDK で利用できるのは とのみlibxml2libzあり、他のすべてをシステムで利用でき、コンパイル済みである必要があります。これらのライブラリはすべて、後で説明する と同じアプローチを適用してコンパイルできる GNU プロジェクトですxmlsec。1 つのメモ: libxslt. Apple はlibxsltiPhone SDK にインクルードしますが、.h を利用可能にしないため、iPhone SDK に付属する libxslt.dylib へのリンクは許可されず、自分でコンパイルする必要があります。

  3. ソースファイルをxmlseciPhoneプロジェクトにインポートすることは、どのファイルが適切でxmlsec、どれが単純な依存関係であるかを知らない限り困難です(xmlsecソースツリーには、そこにある必要がないopenssl、gnutlsなどが含まれています)が、何よりも制御できないためですconfigure のように、ビルドに含めたい (または除外したい) xmlsec のオプション機能。

  4. したがって、私が好むアプローチは、configure を適切に使用して iPhone 固有の Makefile を生成し、静的ライブラリを構築することです (iPhone では外部の dylib を使用することは許可されていないため)。

具体的には、xmlseciPhone 用にコンパイルする手順は次のとおりです。

0 - すべての依存関係をインストールしてコンパイルします。すでに iPhone に移植されているものが見つからない場合は、これと同じアプローチを (再帰的に) 適用できます。

1 - cd で libxmlsec ルートに移動し、次のコマンドを実行します。

CFLAGS=" -arch armv6 -std=c99 -isysroot /Volumes/ext/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk" CC="/Volumes/ext/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2" ./configure --host=arm-apple-darwin10 --disable-shared --disable-crypto-dl --with-libxml=<path_to_where_libxml_is> --with-libxslt=<path_to_where_libxslt_is> --with-openssl=<path_to_where_openssl_is>

上記のコマンドでは、libxml ヘッダーと実行可能ファイルは SDK の一部であるため、コンパイラによって検出されると想定しています。それ以外の場合は、それらも含めます。

2 - configure は多くの出力を生成し、すべてがうまくいけば、コマンドを実行できるようになります:

make

3 - これは正常に実行されて完了し、出力ファイルが生成されます。src/.libs/libxmlsec1.aこれを iPhone プロジェクトにリンクできます (依存するライブラリの残りすべてと一緒に)。

最後に、openSSL for iPhone のコンパイルに関するチュートリアルです。

于 2011-05-28T14:07:31.090 に答える