xmlsec1 : XML Signature のXMLドキュメントを検証してみる。

PHPのXML Securityクラスは単純なxmlsec1のラッパーでした。。。

xmlsec1を入れる

(op)hdknr@debuniid:~/.virtualenvs/op/src/cx-doc/php$ sudo aptitude install xmlsec1
パッケージリストを読み込んでいます… 完了
依存関係ツリーを作成しています
状態情報を読み取っています… 完了
拡張状態情報を読み込んでいます
パッケージの状態を初期化しています… 完了
タスクの記述を読み込んでいます… 完了
以下の新規パッケージがインストールされます:
  xmlsec1
更新: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
42.5kB のアーカイブを取得する必要があります。展開後に 135kB のディスク領域が新たに消費されます。
拡張状態情報を書き込んでいます… 完了
取得:1 http://ftp.jp.debian.org squeeze/main xmlsec1 1.2.12-1 [42.5kB]
42.5kB を 1s 秒でダウンロードしました (37.7kB/s)
未選択パッケージ xmlsec1 を選択しています。
(データベースを読み込んでいます … 現在 48832 個のファイルとディレクトリがインストールされています。)
(…/xmlsec1_1.2.12-1_i386.deb から) xmlsec1 を展開しています…
man-db のトリガを処理しています …
xmlsec1 (1.2.12-1) を設定しています …
パッケージリストを読み込んでいます… 完了
依存関係ツリーを作成しています
状態情報を読み取っています… 完了
拡張状態情報を読み込んでいます
パッケージの状態を初期化しています… 完了
拡張状態情報を書き込んでいます… 完了
タスクの記述を読み込んでいます… 完了

rp.debというCNAMEのオレオレ証明書付きの署名XML

(op)hdknr@debuniid:~/.virtualenvs/op/src/cx-doc$ cat php/py.xml
<?xml version="1.0" encoding="UTF-8"?>
<!–
testSignXMerialize()
–>
<Envelope xmlns="urn:envelope">
  <Data>
    Hello, World!
  </Data>
<Signature xmlns="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>
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>BG5RjqaoAUu661eSbtxYc3T1WqQ=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>m+5YiD4n14Ye/8/BkGafTaSmbgKT4g+yOKVR0WsYC7rOJV3z8mYsh3KPH4AGqdYM
iJM1cgEwY9lV/IFAgcJqMnS3hcw4y2fkwb6ZQALge0goGdPHFNl1hDIqZHdTwm6D
PpOegEFcDid2IrrH3UnG0HNmuWVDOOdy8Q3PEVMwoDE=</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>MIIB/zCCAWgCCQCkFfcQrSEpJjANBgkqhkiG9w0BAQUFADBEMRAwDgYDVQQDEwdy
cC5kZWIgMRQwEgYDVQQLEwtzeXMucnAuZGViIDENMAsGA1UEChMEc3lzIDELMAkG
A1UEBhMCSlAwHhcNMDkxMTMwMDQzNzU4WhcNMDkxMjMwMDQzNzU4WjBEMRAwDgYD
VQQDEwdycC5kZWIgMRQwEgYDVQQLEwtzeXMucnAuZGViIDENMAsGA1UEChMEc3lz
IDELMAkGA1UEBhMCSlAwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANn4arlF
M3C4pa8Ye2YOt4KxzVEGsrJfLdlh71ZS81OU0cHQ7tESwu9UUo9ZVftfNqZQm0pk
57fYpDgSRBUAbbjdqzagl0zX0CDgkHX+5f9J0un7Ub1ztuwTgOT9WPvQRXr0eBNi
+4VhXIvgchgk1nih/2wQ/N4xDTwriV2F3/R7AgMBAAEwDQYJKoZIhvcNAQEFBQAD
gYEAbwxsW/aj65fogMjTcOeZFxVhgJAUGSnRyUsSLyjglZ9PPqIuZiEujkXzKFR6
mhra7QHBNvfTaEiDypTH0EFPa527fNgt7FqO7OUJWmGwRPaho32TsJPQWuxFer3r
kWG0y7uGfOE1TTt9mL3O9CIjUdjL+/oNdkBZ+pekAC1qOlQ=</X509Certificate>
</X509Data>
</KeyInfo>
</Signature></Envelope>

<X509Certificate/>は解釈してくれない模様。

(op)hdknr@debuniid:~/.virtualenvs/op/src/cx-doc$ xmlsec1 –verify php/py.xml
func=xmlSecOpenSSLX509StoreVerify:file=x509vfy.c:line=360:obj=x509-store:subj=X509_verify_cert:error=4:crypto library function failed:subj=/CN=rp.deb /OU=sys.rp.deb /O=sys /C=JP;err=18;msg=self signed certificate
func=xmlSecOpenSSLX509StoreVerify:file=x509vfy.c:line=408:obj=x509-store:subj=unknown:error=71:certificate verification failed:err=18;msg=self signed certificate
func=xmlSecKeysMngrGetKey:file=keys.c:line=1364:obj=unknown:subj=xmlSecKeysMngrFindKey:error=1:xmlsec library function failed:
func=xmlSecDSigCtxProcessKeyInfoNode:file=xmldsig.c:line=871:obj=unknown:subj=unknown:error=45:key is not found:
func=xmlSecDSigCtxProcessSignatureNode:file=xmldsig.c:line=565:obj=unknown:subj=xmlSecDSigCtxProcessKeyInfoNode:error=1:xmlsec library function failed:
func=xmlSecDSigCtxVerify:file=xmldsig.c:line=366:obj=unknown:subj=xmlSecDSigCtxSigantureProcessNode:error=1:xmlsec library function failed:
Error: signature failed
ERROR
SignedInfo References (ok/all): 1/1
Manifests References (ok/all): 0/0
Error: failed to verify file "php/py.xml"

xml2 を入れてみる

(op)hdknr@debuniid:~/.virtualenvs/op/src/cx-doc$ sudo aptitude install xml2
パッケージリストを読み込んでいます… 完了
依存関係ツリーを作成しています
状態情報を読み取っています… 完了
拡張状態情報を読み込んでいます
パッケージの状態を初期化しています… 完了
タスクの記述を読み込んでいます… 完了
以下の新規パッケージがインストールされます:
  xml2
更新: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
13.3kB のアーカイブを取得する必要があります。展開後に 45.1kB のディスク領域が新たに消費されます。
拡張状態情報を書き込んでいます… 完了
取得:1 http://ftp.jp.debian.org squeeze/main xml2 0.4-2 [13.3kB]
13.3kB を 0s 秒でダウンロードしました (14.5kB/s)
未選択パッケージ xml2 を選択しています。
(データベースを読み込んでいます … 現在 48841 個のファイルとディレクトリがインストールされています。)
(…/archives/xml2_0.4-2_i386.deb から) xml2 を展開しています…
man-db のトリガを処理しています …
xml2 (0.4-2) を設定しています …
パッケージリストを読み込んでいます… 完了
依存関係ツリーを作成しています
状態情報を読み取っています… 完了
拡張状態情報を読み込んでいます
パッケージの状態を初期化しています… 完了
拡張状態情報を書き込んでいます… 完了
タスクの記述を読み込んでいます… 完了

xml2で証明書抜き出し

(op)hdknr@debuniid:~/.virtualenvs/op/src/cx-doc$ xml2 < php/py.xml
/!=
/!=testSignXMerialize()
/!=
/Envelope/@xmlns=urn:envelope
/Envelope/Data=
/Envelope/Data=    Hello, World!
/Envelope/Data=
/Envelope/Signature/@xmlns=http://www.w3.org/2000/09/xmldsig#
/Envelope/Signature/SignedInfo/CanonicalizationMethod/@Algorithm=http://www.w3.org/2001/10/xml-exc-c14n#
/Envelope/Signature/SignedInfo/SignatureMethod/@Algorithm=http://www.w3.org/2000/09/xmldsig#rsa-sha1
/Envelope/Signature/SignedInfo/Reference/Transforms/Transform/@Algorithm=http://www.w3.org/2000/09/xmldsig#enveloped-signature
/Envelope/Signature/SignedInfo/Reference/DigestMethod/@Algorithm=http://www.w3.org/2000/09/xmldsig#sha1
/Envelope/Signature/SignedInfo/Reference/DigestValue=BG5RjqaoAUu661eSbtxYc3T1WqQ=
/Envelope/Signature/SignatureValue=m+5YiD4n14Ye/8/BkGafTaSmbgKT4g+yOKVR0WsYC7rOJV3z8mYsh3KPH4AGqdYM
/Envelope/Signature/SignatureValue=iJM1cgEwY9lV/IFAgcJqMnS3hcw4y2fkwb6ZQALge0goGdPHFNl1hDIqZHdTwm6D
/Envelope/Signature/SignatureValue=PpOegEFcDid2IrrH3UnG0HNmuWVDOOdy8Q3PEVMwoDE=
/Envelope/Signature/KeyInfo/X509Data/X509Certificate=MIIB/zCCAWgCCQCkFfcQrSEpJjANBgkqhkiG9w0BAQUFADBEMRAwDgYDVQQDEwdy
/Envelope/Signature/KeyInfo/X509Data/X509Certificate=cC5kZWIgMRQwEgYDVQQLEwtzeXMucnAuZGViIDENMAsGA1UEChMEc3lzIDELMAkG
/Envelope/Signature/KeyInfo/X509Data/X509Certificate=A1UEBhMCSlAwHhcNMDkxMTMwMDQzNzU4WhcNMDkxMjMwMDQzNzU4WjBEMRAwDgYD
/Envelope/Signature/KeyInfo/X509Data/X509Certificate=VQQDEwdycC5kZWIgMRQwEgYDVQQLEwtzeXMucnAuZGViIDENMAsGA1UEChMEc3lz
/Envelope/Signature/KeyInfo/X509Data/X509Certificate=IDELMAkGA1UEBhMCSlAwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANn4arlF
/Envelope/Signature/KeyInfo/X509Data/X509Certificate=M3C4pa8Ye2YOt4KxzVEGsrJfLdlh71ZS81OU0cHQ7tESwu9UUo9ZVftfNqZQm0pk
/Envelope/Signature/KeyInfo/X509Data/X509Certificate=57fYpDgSRBUAbbjdqzagl0zX0CDgkHX+5f9J0un7Ub1ztuwTgOT9WPvQRXr0eBNi
/Envelope/Signature/KeyInfo/X509Data/X509Certificate=+4VhXIvgchgk1nih/2wQ/N4xDTwriV2F3/R7AgMBAAEwDQYJKoZIhvcNAQEFBQAD
/Envelope/Signature/KeyInfo/X509Data/X509Certificate=gYEAbwxsW/aj65fogMjTcOeZFxVhgJAUGSnRyUsSLyjglZ9PPqIuZiEujkXzKFR6
/Envelope/Signature/KeyInfo/X509Data/X509Certificate=mhra7QHBNvfTaEiDypTH0EFPa527fNgt7FqO7OUJWmGwRPaho32TsJPQWuxFer3r
/Envelope/Signature/KeyInfo/X509Data/X509Certificate=kWG0y7uGfOE1TTt9mL3O9CIjUdjL+/oNdkBZ+pekAC1qOlQ=

(op)hdknr@debuniid:~/.virtualenvs/op/src/cx-doc$ xml2 < php/py.xml  | grep "/Envelope/Signature/KeyInfo/X509Data/X509Certificate" | sed -e "s/^.\+Certificate=//"
MIIB/zCCAWgCCQCkFfcQrSEpJjANBgkqhkiG9w0BAQUFADBEMRAwDgYDVQQDEwdy
cC5kZWIgMRQwEgYDVQQLEwtzeXMucnAuZGViIDENMAsGA1UEChMEc3lzIDELMAkG
A1UEBhMCSlAwHhcNMDkxMTMwMDQzNzU4WhcNMDkxMjMwMDQzNzU4WjBEMRAwDgYD
VQQDEwdycC5kZWIgMRQwEgYDVQQLEwtzeXMucnAuZGViIDENMAsGA1UEChMEc3lz
IDELMAkGA1UEBhMCSlAwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANn4arlF
M3C4pa8Ye2YOt4KxzVEGsrJfLdlh71ZS81OU0cHQ7tESwu9UUo9ZVftfNqZQm0pk
57fYpDgSRBUAbbjdqzagl0zX0CDgkHX+5f9J0un7Ub1ztuwTgOT9WPvQRXr0eBNi
+4VhXIvgchgk1nih/2wQ/N4xDTwriV2F3/R7AgMBAAEwDQYJKoZIhvcNAQEFBQAD
gYEAbwxsW/aj65fogMjTcOeZFxVhgJAUGSnRyUsSLyjglZ9PPqIuZiEujkXzKFR6
mhra7QHBNvfTaEiDypTH0EFPa527fNgt7FqO7OUJWmGwRPaho32TsJPQWuxFer3r
kWG0y7uGfOE1TTt9mL3O9CIjUdjL+/oNdkBZ+pekAC1qOlQ=

なので、

(op)hdknr@debuniid:~/.virtualenvs/op/src/cx-doc$ echo "—–BEGIN CERTIFICATE—–" > php/cert.pem

(op)hdknr@debuniid:~/.virtualenvs/op/src/cx-doc$ xml2 < php/py.xml  | grep "/Envelope/Signature/KeyInfo/X509Data/X509Certificate" | sed -e "s/^.\+Certificate=//" >> php/cert.pem

(op)hdknr@debuniid:~/.virtualenvs/op/src/cx-doc$ echo "—–END CERTIFICATE—–" >> php/cert.pem

(op)hdknr@debuniid:~/.virtualenvs/op/src/cx-doc$ more php/cert.pem
—–BEGIN CERTIFICATE—–
MIIB/zCCAWgCCQCkFfcQrSEpJjANBgkqhkiG9w0BAQUFADBEMRAwDgYDVQQDEwdy
cC5kZWIgMRQwEgYDVQQLEwtzeXMucnAuZGViIDENMAsGA1UEChMEc3lzIDELMAkG
A1UEBhMCSlAwHhcNMDkxMTMwMDQzNzU4WhcNMDkxMjMwMDQzNzU4WjBEMRAwDgYD
VQQDEwdycC5kZWIgMRQwEgYDVQQLEwtzeXMucnAuZGViIDENMAsGA1UEChMEc3lz
IDELMAkGA1UEBhMCSlAwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANn4arlF
M3C4pa8Ye2YOt4KxzVEGsrJfLdlh71ZS81OU0cHQ7tESwu9UUo9ZVftfNqZQm0pk
57fYpDgSRBUAbbjdqzagl0zX0CDgkHX+5f9J0un7Ub1ztuwTgOT9WPvQRXr0eBNi
+4VhXIvgchgk1nih/2wQ/N4xDTwriV2F3/R7AgMBAAEwDQYJKoZIhvcNAQEFBQAD
gYEAbwxsW/aj65fogMjTcOeZFxVhgJAUGSnRyUsSLyjglZ9PPqIuZiEujkXzKFR6
mhra7QHBNvfTaEiDypTH0EFPa527fNgt7FqO7OUJWmGwRPaho32TsJPQWuxFer3r
kWG0y7uGfOE1TTt9mL3O9CIjUdjL+/oNdkBZ+pekAC1qOlQ=
—–END CERTIFICATE—–

エクスポートした証明書で検証

(op)hdknr@debuniid:~/.virtualenvs/op/src/cx-doc$ xmlsec1 –verify –pubkey-cert-pem php/cert.pem  php/py.xml
func=xmlSecOpenSSLX509StoreVerify:file=x509vfy.c:line=360:obj=x509-store:subj=X509_verify_cert:error=4:crypto library function failed:subj=/CN=rp.deb /OU=sys.rp.deb /O=sys /C=JP;err=18;msg=self signed certificate
func=xmlSecOpenSSLX509StoreVerify:file=x509vfy.c:line=408:obj=x509-store:subj=unknown:error=71:certificate verification failed:err=18;msg=self signed certificate
OK
SignedInfo References (ok/all): 1/1
Manifests References (ok/all): 0/0

カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中