2012-06-27 4 views
1

Je dois construire un webservice avec certificat numérique mais je n'ai pas d'expérience dans ce domaine, j'ai eu quelques exemples mais ce n'était pas encore suffisant pour moi. Dans le code ci-dessous, je peux obtenir une clé publique et privée à partir d'un fichier JKS, crypter une chaîne et vérifier si cette chaîne est assignée. Mais j'ai quelques doutes sur qui je devrais utiliser cela:Comment créer un webservice avec certificat numérique

  1. J'ai 1 privé et 1 clé publique. Si j'ai plus d'un cliente appelant mon webservice, les deux doivent avoir la clé publique? et la clé privée?

  2. comment je devrais envoyer la clé publique au client? est un fichier ou une chaîne? le retour de ma clé de test public est:

CLE PUBLIQUE: clé publique RSA Sun, 2048 bits module: 17250324892612486858507429685448839704055777462217619737452934774822672851497966978790916432466790842915878683120882004958695145419939098968836614824888409393052061936762455389263916348884908835001481590512979961376093665985176086582620326688971144157926968064917610077028818131909416605240046026228844714588221891425654992455455846135152245033503553286312978619541722235228388013887009488301495951905133704760137236960349458111717499961995019021977295294912070129505927611114331851407796798585518424426757876237265884912360355209124912153937505471115177310252984915833469781596755813935167181407292034238159965045653 exposant public: 65537

  1. Dans le code, je peux seulement vérifier si la signature est correcte, je ne peux pas décrypter cela pour obtenir la valeur réelle.

    import java.io.Fichier; import java.io.FileInputStream; import java.io.InputStream; import java.security.Key; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.cert.Certificate;

    public class Certificado {

    /** 
    * @param args 
    * @throws Exception 
    */ 
    public static void main(String[] args) throws Exception { 
    
        String txt = "TEST_STRING"; 
    
        File certificado = new File("C:\\temp\\teste.jks"); 
        PrivateKey privateKey = getPrivateKeyFromFile(certificado, "TESTE", "123"); 
    
        System.out.println("PRIVATE KEY: " + privateKey.toString()); 
    
        PublicKey publicKey = getPublicKeyFromFile(certificado, "TESTE", "123"); 
    
        System.out.println("PUBLIC KEY: " + publicKey.toString()); 
    
        //a chave privada serve pra encriptar os dados. 
        byte[] txtAssinado = createSignature(privateKey, txt.getBytes()); 
    
        System.out.println("txtAssinado: " + txt2Hexa(txtAssinado)); 
    
        if(verifySignature(publicKey, txt.getBytes(), txtAssinado)) { 
         System.out.println("Assinatura OK!"); 
        } else { 
         System.out.println("Assinatura NOT OK!"); 
        } 
    
    } 
    
    public static PrivateKey getPrivateKeyFromFile(File cert, String alias, String password) throws Exception { 
        KeyStore ks = KeyStore.getInstance ("JKS"); 
        char[] pwd = password.toCharArray(); 
        InputStream is = new FileInputStream(cert); 
        ks.load(is, pwd); 
        is.close(); 
        Key key = ks.getKey(alias, pwd); 
        if(key instanceof PrivateKey) { 
         return (PrivateKey) key; 
        } 
        return null; 
    } 
    
    /** 
    * Retorna a assinatura para o buffer de bytes, usando a chave privada. 
    * @param key PrivateKey 
    * @param buffer Array de bytes a ser assinado. 
    */ 
    public static byte[] createSignature(PrivateKey key, byte[] buffer) throws Exception { 
        Signature sig = Signature.getInstance("MD2withRSA"); 
        sig.initSign(key); 
        sig.update(buffer, 0, buffer.length); 
        return sig.sign(); 
    } 
    
    /** 
    * Verifica a assinatura para o buffer de bytes, usando a chave pública. 
    * @param key PublicKey 
    * @param buffer Array de bytes a ser verficado. 
    * @param sgined Array de bytes assinado (encriptado) a ser verficado. 
    */ 
    public static boolean verifySignature(PublicKey key, byte[] buffer, byte[] signed) throws Exception { 
        Signature sig = Signature.getInstance("MD2withRSA"); 
        sig.initVerify(key); 
        sig.update(buffer, 0, buffer.length); 
        return sig.verify(signed); 
    } 
    
    /** 
    * Extrai a chave pública do arquivo. 
    */ 
    public static PublicKey getPublicKeyFromFile(File cert, String alias, String password) throws Exception { 
        KeyStore ks = KeyStore.getInstance ("JKS"); 
        char[] pwd = password.toCharArray(); 
        InputStream is = new FileInputStream(cert); 
        ks.load(is, pwd); 
        Key key = ks.getKey(alias, pwd); 
        Certificate c = ks.getCertificate(alias); 
        PublicKey p = c.getPublicKey(); 
        return p; 
    } 
    
    public static String txt2Hexa(byte[] bytes) { 
        if(bytes == null) return null; 
        String hexDigits = "abcdef"; 
        StringBuffer sbuffer = new StringBuffer(); 
        for (int i = 0; i < bytes.length; i++) { 
         int j = ((int) bytes[i]) & 0xFF; 
         sbuffer.append(hexDigits.charAt(j/16)); 
         sbuffer.append(hexDigits.charAt(j % 16)); 
        } 
        return sbuffer.toString(); 
    } 
    

    }

+0

Vous pouvez envoyer la clé publique au client en la pointant vers cette URL: http://stackoverflow.com/questions/11234776/how-to-create-webservice-with-digital-certificate –

+0

VEUILLEZ NE PAS UTILISER TOUTES EN MAJUSCULES. –

+0

@nicholas.hauschild: malheur :) –

Répondre

1

Pourquoi avez-vous besoin? Si c'est seulement pour une communication cryptée, vous pouvez le faire au niveau du transport avec SSL/TLS. Si c'est pour l'authentification, je suggérerais une pile webservice robuste (Apache CXF et Metro par exemple) avec WS-Policy framework. Il prendra soin des trucs crypto de bas niveau pour vous.

(Vous pouvez utiliser l'authentification au niveau de transport bien sûr et le cryptage au niveau des messages, mais les premiers couples votre code avec le serveur d'application et celle-ci est juste douloureusement lent.)

Questions connexes