IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Sécurité Java Discussion :

[ActiveX Capicom][javascript window.crypto.signText][CMSSignedData]


Sujet :

Sécurité Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Par défaut [résolu] Sign with capicom, verify with java
    Bonjour à tous,

    Je cherche à valider la signature de données PKCS7 :

    - sous Netscape/Mozilla : la signature PKCS7 est généré par la fonction javascript window.crypto.signText(myText,true,"ask");

    - sous IE, par l'activeX de microsoft Capicom


    mystore.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);
    store.Open(CAPICOM_CURRENT_USER_STORE, "AddressBook", CAPICOM_STORE_OPEN_READ_ONLY);

    for (iCert = 1; iCert <= (store.Certificates.Count); iCert++)
    {
    mystore.Certificates.Add(store.Certificates.Item(iCert));
    }

    try {
    var selected = mystore.Certificates.Select("Signature electronique",text);

    var signer = new ActiveXObject("CAPICOM.Signer");
    signer.Certificate = selected.Item(1);

    var SignedData = new ActiveXObject("CAPICOM.SignedData");
    SignedData.Content = text;
    // sign
    return SignedData.Sign(signer, true, CAPICOM_ENCODE_BASE64);
    }
    catch (e)
    {
    return e.message;
    }



    Et voici le code pour la vérification :

    CMSSignedData signature = new CMSSignedData(new CMSProcessableByteArray( Base64.encode( URLDecoder.decode(datas,"ISO-8859-1").getBytes() )),Base64.decode(signedDatas.getBytes()));
    SignerInformation signer = null;

    signature.getSignedContent().write(System.out);

    Collection c = signature.getSignerInfos().getSigners();
    Iterator it = c.iterator();
    CertStore certs= signature.getCertificatesAndCRLs("Collection","BC");
    while (it.hasNext())
    {
    signer = (SignerInformation)it.next();

    System.out.println("Signer : " + signer.getSID());
    Collection certCollection = certs.getCertificates(signer.getSID());

    Iterator certIt = certCollection.iterator();
    X509Certificate certif = (X509Certificate)certIt.next();


    isOk = signer.verify(certif, "BC");

    System.out.println("Signer.content : " + new String(signer.getContentDigest()));
    }

    Pour les données en provenance de la fonction javascript crypto.signText(),
    j'ai une exception :

    org.bouncycastle.cms.CMSException: invalid signature format in message: + content hash found in signed attributes different


    Et pour IE, tout se passe bien, sauf que la vérification me retourne faux.


    quelqu'un a t'il déjà rencontrer ce problème?

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Par défaut
    Bon la vérification est OK pour Firefox :

    CMSSignedData signature = new CMSSignedData(new CMSProcessableByteArray(datas.getBytes()),Base64.decode(signedDatas.getBytes()));

    Il n'y a pas grand chose à rajouter, il faut juste créer l'objet CMSSignedData avec les données à signer ( new CMSProcessableByteArray(datas.getBytes())) et les données signés Base64.decode(signedDatas.getBytes()).

    Ensuite récupérer le certificat avec lequel il a signé les données.

    et enfin appeler la fonction Signer.verify(X509, "BC") BC est le nom du provider bouncycastle.

    Je vais regarder pourquoi ca me retourne false pour Explorer.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Par défaut


    Ca y est j'ai réussi!!!

    Le problème venait du fait que CAPICOM récupère le message à signer sous le format UNICODE.

    var text = 'hello';
    SignedData.Content = text;
    --> text sera signé comme étant 'h e l l o ' et non pas 'hello'

    Donc dans votre code pour vérifier la signature :

    String originalText = "hello";

    byte[] originalTextByte;

    String signedType = request.getParameter("signedType");

    // si c'est capicom, le text a été signé en unicode, donc on transforme le textoriginal en format unicode

    if("capicom".equals(signedType))
    originalTextByte = originalText.getBytes("UnicodeLittleUnmarked");

    if("netscape".equals(signedType))
    originalTextByte = originalText.getBytes();

    CMSSignedData signature = new CMSSignedData(new CMSProcessableByteArray( originalTextBytes ),decoded);


    --> et là tout est OK

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/01/2011, 13h24
  2. DLL activex (VB6) & javascript
    Par rdpdo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/03/2008, 12h25
  3. crypto.signText() error:internalError avec FF 2.0.0.9
    Par rado009 dans le forum Firefox
    Réponses: 0
    Dernier message: 12/11/2007, 19h31
  4. [javascript] window.opener ?
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 22/08/2005, 15h24
  5. Petit pb javascript ! window.location
    Par Atomikx dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/05/2005, 11h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo