2012-05-21 15 views
7

排他的C14Nを追加することで無効化されこれは、XML署名を生成するために私のコードです:XML署名を変換

DOMSignContext dsc = new DOMSignContext 
    (prk, xmldoc.getDocumentElement()); 

XMLSignatureFactory fac = 
    XMLSignatureFactory.getInstance("DOM"); 

    DigestMethod digestMethod = 
     fac.newDigestMethod("http://www.w3.org/2000/09/xmldsig#sha1", null); 
    C14NMethodParameterSpec spec = null; 
    CanonicalizationMethod cm = fac.newCanonicalizationMethod(
     "http://www.w3.org/2001/10/xml-exc-c14n#",spec); 
    SignatureMethod sm = fac.newSignatureMethod( 
     "http://www.w3.org/2000/09/xmldsig#rsa-sha1",null); 
    ArrayList transformList = new ArrayList(); 
    TransformParameterSpec transformSpec = null; 
    Transform envTransform = fac.newTransform("http://www.w3.org/2000/09/xmldsig#enveloped-signature",transformSpec); 
    Transform exc14nTransform = fac.newTransform(
     "http://www.w3.org/2001/10/xml-exc-c14n#",transformSpec); 
transformList.add(exc14nTransform); 
transformList.add(envTransform); 

Reference ref = fac.newReference("",digestMethod,transformList,null,null); 
ArrayList refList = new ArrayList(); 
refList.add(ref); 
SignedInfo si =fac.newSignedInfo(cm,sm,refList); 

これは偽のように偽ともコア妥当性の基準の検証を提供します。しかし、私はenvTrasnform変数すなわちfac.new Transform("http://www.w3.org/2001/10/xml-exc-c14n#",transformSpec)を削除し、次のコードを実行すると:

DOMSignContext dsc = new DOMSignContext 
    (prk, xmldoc.getDocumentElement()); 

XMLSignatureFactory fac = 
    XMLSignatureFactory.getInstance("DOM"); 

    DigestMethod digestMethod = 
     fac.newDigestMethod("http://www.w3.org/2000/09/xmldsig#sha1", null); 
    C14NMethodParameterSpec spec = null; 
    CanonicalizationMethod cm = fac.newCanonicalizationMethod(
     "http://www.w3.org/2001/10/xml-exc-c14n#",spec); 
    SignatureMethod sm = fac.newSignatureMethod( 
     "http://www.w3.org/2000/09/xmldsig#rsa-sha1",null); 
    ArrayList transformList = new ArrayList(); 
    TransformParameterSpec transformSpec = null; 
    Transform envTransform = fac.newTransform(
     "http://www.w3.org/2000/09/xmldsig#enveloped-signature",transformSpec); 
transformList.add(envTransform); 
Reference ref = fac.newReference("",digestMethod,transformList,null,null); 
ArrayList refList = new ArrayList(); 
refList.add(ref); 
SignedInfo si =fac.newSignedInfo(cm,sm,refList); 

これは真核妥当性及び基準妥当性を提供します。なぜこうなった。私はこのコードフォームthisのリンクを持っています(エンベロープ署名セクションの作成でコードフラグメント2)。

答えて

6

実際、c14n変換は、エンベロープ署名変換の後に実行する必要があります。これは、署名する文書を抽出した後で正規化する必要があります(文書には現在署名要素も含まれていますので、署名する実際の部分を正規化する前に分離する必要があります)。注文は次のようにしてください:

transformList.add(envTransform); 
transformList.add(exc14nTransform); 
関連する問題