2016-03-31 29 views
1

Dijital İmzalı XML dosyam ve İmzalanan Kamu Sertifikam var, imzayı doğrulamak istiyorum. Yanıtın özgün içeriği xml yanlış döndürülüyor, ancak xml'yi değiştirdiğimde doğru olarak döndürülüyor. Benim java kodu aşağıdaki gibidir: -java'da XML imza doğrulaması başarısız oluyor

import java.io.FileInputStream; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.security.Security; 
import java.security.cert.CertificateFactory; 
import java.security.cert.X509Certificate; 
import javax.xml.crypto.dsig.XMLSignature; 
import javax.xml.crypto.dsig.XMLSignatureFactory; 
import javax.xml.crypto.dsig.dom.DOMValidateContext; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.bouncycastle.jce.provider.BouncyCastleProvider; 
import org.w3c.dom.Document; 
import org.w3c.dom.NodeList; 
public class SignatureVerifierOneFile { 
    public static void main(String[] args){  
     Security.addProvider(new BouncyCastleProvider());  
     //Signed xml path 
     String signedXmlPath = "C:/signedXML.xml";  
     SignatureVerifierOneFile signatureVerifier = new SignatureVerifierOneFile(); 
     boolean signatureStatus = 
signatureVerifier.verify(signedXmlPath,"C:/Cert.cer"); 
     System.out.println("xml signature validateionis " + signatureStatus); 

    } 
    public boolean verify(String signedXml,String publicKeyFile) { 

     boolean verificationResult = false; 

     try { 

      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      dbf.setNamespaceAware(true); 
      DocumentBuilder builder = dbf.newDocumentBuilder(); 
      Document doc = builder.parse(signedXml); 
      NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature"); 
      if (nl.getLength() == 0) { 
       throw new IllegalArgumentException("Cannot find Signature element"); 
      } 

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

      DOMValidateContext valContext = new DOMValidateContext(getCertificateFromFile(publicKeyFile).getPublicKey(), nl.item(0)); 
      XMLSignature signature = fac.unmarshalXMLSignature(valContext); 

      verificationResult = signature.validate(valContext); 

     } catch (Exception e) { 
      System.out.println("Error while verifying digital siganature" + e.getMessage()); 
      e.printStackTrace(); 
     } 

     return verificationResult; 
    } 

    private X509Certificate getCertificateFromFile(String certificateFile) throws GeneralSecurityException, IOException { 
     FileInputStream fis = null; 
     try { 
      CertificateFactory certFactory = CertificateFactory.getInstance("X.509", "BC"); 
      fis = new FileInputStream(certificateFile); 
      return (X509Certificate) certFactory.generateCertificate(fis); 
     } finally { 
      if (fis != null) { 
       fis.close(); 
      } 
     } 

    } 
} 

Benim orijinal imzalı XML aşağıdaki gibidir: -

<OTPResp resCode="25f341e7-8c72-47a6-b49b-46732e7b8494" status="1" ts="2016-03-31T10:54:07.575" txn="20160331052355192"><AadhaarResp>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxBZ2VudE90cFJlc3AgcmV0PSJ5IiB0cz0iMjAxNi0wMy0zMVQxMDo1NzoxMi41MzYrMDU6MzAiIGNvZGU9IjZkZjZhZTY1YzMwNjQzMmVhZTkyNzljYTgxZGNkNmJjIiB0eG49IjI1ZjM0MWU3LThjNzItNDdhNi1iNDliLTQ2NzMyZTdiODQ5NCIvPg==</AadhaarResp><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>vOND//Y2bsHBIkxkUfjH3d/CYC4=</DigestValue></Reference></SignedInfo><SignatureValue>HJG1vPQ4CSycCJ4B065faSeBaHGad9XYDUCOj9a/Fa/bWUUFYOpi9/jxVRCngSJACEIEVwUfcCKs9uUEr3DPcDiTB1UqM9BwUCVL28Tghn/HUSg53IQZziDrI3Ta2VyB7oHEoE/8cloArAbu44gDL/selJDD4ZtAsLAecO3NFiugMG3okV7hGcX50lIDm1on7ziFTxFfL1215gmcCfwJhF/zKI0GVBV6FcCDZxLeY7qMGp0Mj4EzicQm1LIZDHIfVskh97NrWi3MKBAv9dPGOevB3XaVw7dt9nct1VEirZaprM/dl5frCDTuwtmNlZN01dnBGHDCRi/+534mvN4oUQ==</SignatureValue></Signature></OTPResp> 
Ben doğrulamak mümkün duyuyorum

Mofidied XML

aşağıdaki gibidir
<OTPResp resCode="25f341e7-8c72-47a6-b49b-46732e7b8494" status="1" ts="2016-03-31T10:54:07.575" txn="20160331052355192"><AadhaarResp>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxBZ2VudE90cFJlc3AgcmV0PSJ5IiB0cz0iMjAxNi0wMy0zMVQxMDo1NzoxMi41MzYrMDU6MzAiIGNvZGU9IjZkZjZhZTY1YzMwNjQzMmVhZTkyNzljYTgxZGNkNmJjIiB0eG49IjI1ZjM0MWU3LThjNzItNDdhNi1iNDliLTQ2NzMyZTdiODQ5NCIvPg==</AadhaarResp><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
<SignedInfo> 
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod> 
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod> 
<Reference URI=""> 
<Transforms> 
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform> 
</Transforms> 
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod> 
<DigestValue>vOND//Y2bsHBIkxkUfjH3d/CYC4=</DigestValue> 
</Reference> 
</SignedInfo> 
<SignatureValue> 
HJG1vPQ4CSycCJ4B065faSeBaHGad9XYDUCOj9a/Fa/bWUUFYOpi9/jxVRCngSJACEIEVwUfcCKs 
9uUEr3DPcDiTB1UqM9BwUCVL28Tghn/HUSg53IQZziDrI3Ta2VyB7oHEoE/8cloArAbu44gDL/se 
lJDD4ZtAsLAecO3NFiugMG3okV7hGcX50lIDm1on7ziFTxFfL1215gmcCfwJhF/zKI0GVBV6FcCD 
ZxLeY7qMGp0Mj4EzicQm1LIZDHIfVskh97NrWi3MKBAv9dPGOevB3XaVw7dt9nct1VEirZaprM/d 
l5frCDTuwtmNlZN01dnBGHDCRi/+534mvN4oUQ== 
</SignatureValue> 
</Signature></OTPResp> 

Ne olduğumu anlayamıyorum yanlış mı yapıyorsun? Şimdiden teşekkürler.

cevap

1

XML belgelerinize baktığımda bana önemli gelen tek fark, gerçek <SignatureValue> içeriğidir. Base64 dizisi bakımından aynı olsa da, değiştirilmiş XML'inizde satır sonları bulunduğunu unutmayın. XML DSIG spec bakarak

, bunu buluyoruz: http://www.w3.org/TR/xmldsig-core/#sec-SignatureValue

SignatureValue eleman dijital imzanın gerçek değeri içerir; her zaman base64 [MIME]

Daha sonra RFC 2045 başvuruyor İşte link kullanılarak kodlanır: Base64 kodlamayı belirten bölüm 6.8 geçiyor http://www.ietf.org/rfc/rfc2045.txt

, bu bahseder:

Kodlanmış çıktı akışı, her biri 76 karakterden daha fazla satırında gösterilmelidir.

Ayrıca, değiştirdiğiniz XML'de yaptığınız şey de budur. XML'in bir DOM'a dönüştürülmesi, elemanların metin içeriği, satır sonları dahil, giriş belgesindeki gibi tam olarak korunur. Benim tahminim, Java XML kripto paketleri tarafından kullanılan Base64 kod çözücüsünün kesinlikle özelliğe uyması ve orijinal XML belgenizdeki imzayı tamamen ayrıştırmamasıdır.

verify yönteminde XMLSignature öğenizi aldıktan sonra, getSignatureValue() numaralı telefonu aramayı deneyin. Bu size bir XMLSignature.SignatureValue vermelidir. Bayt dizisini ondan almayı deneyin. Boşsa, XMLSignature.SignatureValue hatalarını tamamen almayı çok yakında keser, yukarıdaki sorun muhtemelen budur.

+1

@ G_H "Kodlanmış çıktı akışının her biri en fazla 76 karakterden oluşan çizgilerle gösterilmesi gerekir", aslında doğrulama kaynağı, imzalananXML okuma mekanizmasındaki sorun doğruydu. karakter. – dpilwal

İlgili konular