2013-04-30 8 views
5

私は、エンベロープ署名とjavax.xml.crypto.dsig。*クラスを使用してxmlファイルに署名しようとしています。その結果、私は正しい署名コンテンツを持つファイルを取得しますが、名前空間は定義されていません。 xmlns:ds = "http://www.w3.org/2000/09/xmldsig#"名前空間と対応するds接頭辞をどのように追加できますか? 私はそれを定義できる場所がありません。javax.xml.crypto.dsig。*を使用してXMLファイルに署名する際に名前空間を追加する方法?

例コード:

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

    (...) 

    XMLSignature signature = xmlSignatureFactory.newXMLSignature(signedInfo, keyInfo); 

    // Marshal, generate, and sign the enveloped signature. 
    signature.sign(domSignContext); 

は、例えば、XMLを与える:

<?xml version="1.0" encoding="UTF-8"?> 
<test xmlns="http://different.namespace.com"> 
    <someBody/> 
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     <SignedInfo> 
      <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>  
      <Reference URI=""> 
       <Transforms> 
        <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
       </Transforms> 
       <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
       <DigestValue>base64_digest</DigestValue> 
      </Reference> 
     </SignedInfo> 
     <SignatureValue>some_base64</SignatureValue> 
     <KeyInfo> 
      <X509Data> 
       <X509SubjectName>subject_data</X509SubjectName> 
       <X509Certificate>some_more_base64</X509Certificate> 
      </X509Data> 
      <KeyValue> 
       <RSAKeyValue> 
        <Modulus>another_base64</Modulus> 
        <Exponent>base64_as_well</Exponent> 
       </RSAKeyValue> 
      </KeyValue> 
     </KeyInfo> 
    </Signature> 
</test> 

が、私はしたい:

以下
<?xml version="1.0" encoding="UTF-8"?> 
<test xmlns="http://different.namespace.com" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
    <someBody/> 
    <ds:Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     <ds:SignedInfo> 
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
      <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>  
      <ds:Reference URI=""> 
       <ds:Transforms> 
        <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
       </ds:Transforms> 
       <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
       <ds:DigestValue>base64_digest</ds:DigestValue> 
      </ds:Reference> 
     </ds:SignedInfo> 
     <ds:SignatureValue>some_base64</ds:SignatureValue> 
     <ds:KeyInfo> 
      <ds:X509Data> 
       <ds:X509SubjectName>subject_data</ds:X509SubjectName> 
       <ds:X509Certificate>some_more_base64</ds:X509Certificate> 
      </ds:X509Data> 
      <ds:KeyValue> 
       <ds:RSAKeyValue> 
        <ds:Modulus>another_base64</ds:Modulus> 
        <ds:Exponent>base64_as_well</ds:Exponent> 
       </ds:RSAKeyValue> 
      </ds:KeyValue> 
     </ds:KeyInfo> 
    </ds:Signature> 
</test> 
+0

結果のXMLは正しいです。 なぜ接頭語を​​にしたいですか?はい、「よく知られている」接頭辞と見なされますが、結果として得られるXMLの正確性には影響しません。 – user568826

答えて

3

はエンベロープ署名を生成するためのOracleからのサンプルコードです。そして、あなたが探しているのは、dsc.setDefaultNamespacePrefix( "dsig")です。次の例に示すように、

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

    Reference ref = fac.newReference 
    ("", fac.newDigestMethod(DigestMethod.SHA1, null), 
      Collections.singletonList 
      (fac.newTransform 
        (Transform.ENVELOPED, (TransformParameterSpec) null)), 
        null, null); 

    // Create the SignedInfo 
    SignedInfo si = fac.newSignedInfo 
    (fac.newCanonicalizationMethod 
      (CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS, 
        (C14NMethodParameterSpec) null), 
        fac.newSignatureMethod(SignatureMethod.DSA_SHA1, null), 
        Collections.singletonList(ref)); 

    // Create a DSA KeyPair 
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA"); 
    kpg.initialize(512); 
    KeyPair kp = kpg.generateKeyPair(); 

    // Create a KeyValue containing the DSA PublicKey that was generated 
    KeyInfoFactory kif = fac.getKeyInfoFactory(); 
    KeyValue kv = kif.newKeyValue(kp.getPublic()); 

    // Create a KeyInfo and add the KeyValue to it 
    KeyInfo ki = kif.newKeyInfo(Collections.singletonList(kv)); 

    // Instantiate the document to be signed 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setNamespaceAware(true); 
    Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(sourceFile)); 

    // Create a DOMSignContext and specify the DSA PrivateKey and 
    // location of the resulting XMLSignature's parent element 
    DOMSignContext dsc = new DOMSignContext(kp.getPrivate(), doc.getDocumentElement()); 
    dsc.setDefaultNamespacePrefix("dsig"); 

    // Create the XMLSignature (but don't sign it yet) 
    XMLSignature signature = fac.newXMLSignature(si, ki); 

    // Marshal, generate (and sign) the enveloped signature 
    signature.sign(dsc); 

    // output the resulting document 
    OutputStream os; 
    os = new FileOutputStream(DestinationFile); 

    TransformerFactory tf = TransformerFactory.newInstance(); 
    Transformer trans = tf.newTransformer(); 
    trans.transform(new DOMSource(doc), new StreamResult(os)); 
-1

ストリングalgoritmo = XMLSignature.ALGO_ID_SIGNATURE_RSA。 XMLSignature sig = new XMLSignature(doc, algoritmo);

-1

あなたは

形式以下
<ds:Signature ...> ... </ds:Signature> 

にあなたの署名XMLを持つようにしたい場合は、親切にJava 6のバージョン31を使用すると、必要な署名XMLはなります。

関連する問題