4

XML に署名しましたが、KeyValue 要素を署名に含める方法がわかりません。いくつかのドキュメントがあると、多くの時間を節約できます。

以下のコード (興味がある場合) は、これまでに xmlseclibs で何とかできたことです。

<?php
require('xmlseclibs.php'); 

XML 文字列

$getToken = '<getToken>
<item>
<Semilla>Random string</Semilla>
</item>
</getToken>';

XML オブジェクトの作成 (署名用)

$getToken_DOMDocument = new DOMDocument(); 
$getToken_DOMDocument -> loadXml($getToken); 

xmlseclibs を使用した署名オブジェクトの作成

$getToken_XMLSecurityDSig = new XMLSecurityDSig(); 
$getToken_XMLSecurityDSig -> setCanonicalMethod(XMLSecurityDSig::C14N); 

機能しなかった ds: プレフィックスをオフにしようとしています

$options['prefix'] = '';
$options['prefix_ns'] = '';
$options['force_uri'] = TRUE;
$options['id_name'] = 'ID';

$getToken_XMLSecurityDSig -> addReference($getToken_DOMDocument, XMLSecurityDSig::SHA1, array('http://www.w3.org/2000/09/xmldsig#enveloped-signature', 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'), $options); 

必要な鍵データへのアクセス

$XMLSecurityKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type'=>'private')); 
$XMLSecurityKey -> loadKey('../../DTE/certificado/firma/certificado.pem', TRUE); 
/* if key has Passphrase, set it using $objKey -> passphrase = <passphrase> */ 

XML オブジェクトへの署名

$getToken_XMLSecurityDSig -> sign($XMLSecurityKey); 

公開鍵の追加

$getToken_XMLSecurityDSig -> add509Cert(file_get_contents('../../DTE/certificado/firma/certificado.pem')); 

エンベロープ署名を XML オブジェクトに追加する

$getToken_XMLSecurityDSig -> appendSignature($getToken_DOMDocument -> documentElement); 

署名付き XML コードをファイルに保存する

$getToken_DOMDocument -> save('sign-basic-test.xml'); 
?>

さらに、このライブラリからも希望します:

  1. ライブラリが破損していないことを確認するために、公式で信頼できるリポジトリを知っておいてください。
  2. 「ds:」接頭辞をオフにします (私が作成している XML の例にもドキュメントにもそのような接頭辞が含まれていないため)。
  3. Base64 型の値の X 文字ごとに改行します。
  4. 完全なインデント (それ以外の場合はまったくありません)。

ここにリンクの説明を入力してライブラリを取得しました

前もって感謝します。

4

2 に答える 2

2

下線付きの XMLSecLibs の使用を簡素化するために、xmldsigという名前のファサード ライブラリを作成しました。

このライブラリを使用すると、コードは次のようになります。

public function testSign()
{
    $getToken = '<getToken>
    <item>
    <Semilla>Random string</Semilla>
    </item>
    </getToken>';

    $data = new DOMDocument();
    $data->loadXml($getToken);

    $adapter = new XmlseclibsAdapter();
    $adapter
        ->setPrivateKey(file_get_contents('privateKey.pem'))
        ->setPublicKey(file_get_contents('publicKey.pem'))
        ->setCanonicalMethod('http://www.w3.org/2001/10/xml-exc-c14n#')
        ->sign($data);

        echo $data->saveXML();
    );
}
于 2015-02-21T10:02:40.627 に答える
2

これらの問題に役立つ可能性のあるリンクのリストを次に示します。

XML署名メッセージで、phpseclibで署名を検証する方法は?

http://code.google.com/p/xmlseclibs/issues/attachmentText?id=6&aid=-1080340148797098435&name=example.php&token=81f737657f6cf89b3e7fcdb6cc15033b

http://code.google.com/p/xmlseclibs/issues/detail?id=13

適切な XML 排他的正規化はどれですか?

すべてが解決するかどうかはわかりませんが、少しは役立つはずです。

于 2014-07-23T23:15:05.753 に答える