4

サーバーへのSAMLレスポンスを介してログインを試みているPHPアプリ(SAML IdPとして機能)を作成しています(SAML SPとして機能しています。現在、サーバーがリクエストを拒否することに固執しています(500を取得しただけです)要求の形式が正しくありません)。

テストアプリを(Java/openSAMLで-サーバーが使用していると確信しています)作成しましたが、問題はSAML SignatureValidator検証が生成することであることがわかります

org.apache.xml.security.signature.XMLSignatureException: DSA 署名の XMLDSIG 形式が無効です

SAML SignatureValidator コードを見ると、XMLDISG 署名の長さが正確に 40 バイト (P1363 形式?) であることが確認されますが、生成された署名の長さは 46 ~ 48 バイト (DER ASN.1 形式?) であることがわかります。

署名は、以下のように PHP openssl_sign によって生成されています。

openssl_sign($canonicalized_signedinfo,
                  $signature,
                  $private_key,
                  OPENSSL_ALGO_DSS1))

署名の例 (わかりやすくするために 2 進数から 16 進数で表示) は次のとおりです。これは 46 バイトですが、(ランダム キーによって?) 46 から 48 バイトまで変化することに気付きました。

302c02146e74afeddb0fafa646757d73b43bca688a12ffc5021473dc0ca572352c922b80abd0662965e7b866416d

以下のように PHP openssl_verify を使用して、この署名を正常に検証できます。

openssl_verify ($canonicalized_signedinfo, 
                 $signature , 
                 $public_key,
                 OPENSSL_ALGO_DSS1))

しかし、私のテスト アプリでは、SignatureValidator の検証を行うと (以下のように)、XMLSignatureException: Invalid XMLDSIG format of DSA signature例外が発生します。

  BasicCredential credential = new BasicCredential();
  credential.setPublicKey(publicKey);
  credential.setUsageType(UsageType.SIGNING);
  SignatureValidator sigValidator = new SignatureValidator(credential);
  sigValidator.validate(signature);

PHP openssl_sign によって生成された 46-48 DER ASN.1 形式から、openSAML によって期待される 40 バイトの P1363 形式への PHP 署名変換を行う方法を知っている人はいますか?

4

1 に答える 1

3

コード プロジェクトのリソースには、ASN.1 形式を P1363 に変換する方法がコード例とともに説明されています。Java 検証メソッドを作成すると便利な場合があります。

そして、この C++ コードを使用して、PHP から DSIG 準拠の署名を生成することを提案します: http://xmlsig.sourceforge.net/

ところで、単に署名を生成して検証するよりも複雑に思えます。XMLBlackboxに興味があるかもしれません

于 2012-06-28T13:44:23.517 に答える