33
1 Tél : +33 (0)1 58 56 10 00 Fax : +33 (0)1 58 56 10 01 www.octo.com © OCTO 2013 50, avenue des Champs-Elysées 75008 Paris - FRANCE Philippe Prados Aurélien Rambaux 17 Juin 2013 Installer, gérer, sécuriser et utiliser une clef privée dans Android

PKI Android : Installer, gérer, sécuriser et utiliser un secret

Embed Size (px)

DESCRIPTION

Comment installer, gérer, sécuriser et utiliser une clef privée ? Comment partager une clef privée entres applications? Comment résister au vol du téléphone? Via des API cachées, des scénarios originaux et autres subtilités.

Citation preview

Page 1: PKI Android : Installer, gérer, sécuriser et utiliser un secret

1

Tél : +33 (0)1 58 56 10 00

Fax : +33 (0)1 58 56 10 01

www.octo.com© OCTO 2013

50, avenue des Champs-Elysées

75008 Paris - FRANCE

Philippe Prados

Aurélien Rambaux17 Juin 2013

Installer, gérer, sécuriser et utiliser

une clef privée dans Android

Page 2: PKI Android : Installer, gérer, sécuriser et utiliser un secret

2

Infrastructure à clés publiques

Sauvegarder un certificat

Partager un certificat

Un scénario possible chez un client

Au menu

Page 3: PKI Android : Installer, gérer, sécuriser et utiliser un secret

3

Tél : +33 (0)1 58 56 10 00

Fax : +33 (0)1 58 56 10 01

www.octo.com© OCTO 2013

50, avenue des Champs-Elysées

75008 Paris - FRANCE

Qu’est-ce ?

Infrastructure à clés publiques (PKI)

Page 4: PKI Android : Installer, gérer, sécuriser et utiliser un secret

4

Fichier signé numériquement par une autorité

Equivalent à une carte d’identité

Authentification sur le mode « je possède »

Considéré comme plus sécurisé qu’un mot de passe

Sert de preuve juridique

Signature basé sur du chiffrement asymétrique

Qu’est-ce qu’un certificat numérique ?

Page 5: PKI Android : Installer, gérer, sécuriser et utiliser un secret

5

Ce que je chiffre avec l’un…

… je le déchiffre avec l’autre

Une clé privée liée à une clé publique

Page 6: PKI Android : Installer, gérer, sécuriser et utiliser un secret

6

Objectif d’une PKI :

Authentification mutuelle forte

Confidentialité

Non-répudiation

Pour les mobiles :

Gérer l’accès à un intranet

Gérer le vol de mobile

Infrastructure à clés publiques (PKI)

Page 7: PKI Android : Installer, gérer, sécuriser et utiliser un secret

7

Comment sauver un certificat dans un espace sécurisé du

téléphone ?

Comment résister au vol du téléphone ?

Comment contrôler l’accès au certificat aux seules applications

autorisées ?

Comment distribuer le certificat aux terminaux

Dans cette session

Page 8: PKI Android : Installer, gérer, sécuriser et utiliser un secret

8

Tél : +33 (0)1 58 56 10 00

Fax : +33 (0)1 58 56 10 01

www.octo.com© OCTO 2013

50, avenue des Champs-Elysées

75008 Paris - FRANCE

Comment sauvegarder un secret dans un

espace sécurisé du téléphone ?

Sauver un secret

Page 9: PKI Android : Installer, gérer, sécuriser et utiliser un secret

9

Approche traditionnelle

Secure Element (SE)

Chiffrement du disque

Conteneur de certificats clients Android

KeyChain

Keystore

Approche mise en œuvre en mission

Comment sauvegarder un secret ?

Page 10: PKI Android : Installer, gérer, sécuriser et utiliser un secret

10

Sauvegarder le certificat :

Non chiffré sur disque

Exploitable par analyse statique de disque

Chiffré sur disque

Mot de passe à demander encore et encore

Utiliser onSaveIntanceState() ou un extra de l’Intent

Gestion lourde

« Accessible » sur le disque

Chiffrer le disque du terminal

Pas garanti

Approche traditionnelle

Page 11: PKI Android : Installer, gérer, sécuriser et utiliser un secret

11

SE : composant électronique communiquant via des trames

binaires

Disponible dans le terminal et/ou dans la carte SIM

Avantage d’un SE :

Mémorise clefs privées, accès VPN, générateurs de mots de passe

à usage unique…

Résiste aux attaques physiques

Implémente matériellement les algorithmes standards de

cryptographie (DES, AES, RSA)

Secure Element (SE) 1/2

Page 12: PKI Android : Installer, gérer, sécuriser et utiliser un secret

12

Accessible via la couche NFC mais …

… impossible d’installer des application dans le SE

… impossible de communiquer avec par une application classique

Utilisé par Google Wallet

Secure Element (SE) 2/2

Page 13: PKI Android : Installer, gérer, sécuriser et utiliser un secret

13

Limité à l’identification VPN et Wifi (< sdk 14)

Installation depuis la carte SD

L’effacement du certificat n’est pas physique !

Utilise le KeyStore Android

Conteneur de certificats clients

Page 14: PKI Android : Installer, gérer, sécuriser et utiliser un secret

14

Pour les version d’Android supérieur à 14

Permet d’exploiter les certificats clients du terminal

Approche officielle : KeyChain

KeyChain.choosePrivateKeyAlias(this,

new KeyChainCallBack() {

@Override

public void alias(String alias) {

mAlias=alias;

}

},

new String[] {"RSA"}, // List of acceptable key types. null for any

null, // issuer, null for any

"internal.example.com", // host name of server requesting the cert

443, // port of server requesting the cert, -1 if

// unavailable

null); // alias to preselect, null if unavailable

Page 15: PKI Android : Installer, gérer, sécuriser et utiliser un secret

15

La callback retourne le nom du certificat et

autorise l’application à l’utiliser

KeyChain…

KeyChain.getCertificateChain(this, mAlias);

KeyChain.getPrivateKey(this, mAlias);

Page 16: PKI Android : Installer, gérer, sécuriser et utiliser un secret

16

Installation via API

KeyChain

Intent intent = KeyChain.createInstallIntent();

// Controle le nom du certificat

intent.putExtra(KeyChain.EXTRA_NAME, CERT_NAME);

intent.putExtra(KeyChain.EXTRA_PKCS12, out.toByteArray());

startActivityForResult(intent, RESULT_CODE);

Page 17: PKI Android : Installer, gérer, sécuriser et utiliser un secret

17

KeyStore

Protégé par un mot de passe utilisateur

(version antérieure à 3.x)

Lié au verrouillage du téléphone (à partir

de la version 3.x)

Mais pas d’API officielle !

Ça n’empêche pas de jouer avec…

Page 18: PKI Android : Installer, gérer, sécuriser et utiliser un secret

18

Récupérer la classe android.security.KeyStore

Changer le nom du package

Pour le débloquer :

Comment utiliser le KeyStore

put(), get(), byte[]

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {

context.startActivity(

new Intent("android.credentials.UNLOCK"));

} else {

context.startActivity(

new Intent("com.android.credentials.UNLOCK"));

}

Page 20: PKI Android : Installer, gérer, sécuriser et utiliser un secret

20

Tél : +33 (0)1 58 56 10 00

Fax : +33 (0)1 58 56 10 01

www.octo.com© OCTO 2013

50, avenue des Champs-Elysées

75008 Paris - FRANCE

Via AccountAuthenticator

Partager un certificat

Page 21: PKI Android : Installer, gérer, sécuriser et utiliser un secret

21

Proposer un Account pour l’intranet

Il porte et distribue la clé privée aux

applications de confiance

Le besoin

Page 22: PKI Android : Installer, gérer, sécuriser et utiliser un secret

22

<service

android:name=".CertificateAuthenticationService"

android:exported="true" >

<intent-filter>

<action android:name="android.accounts.AccountAuthenticator" />

</intent-filter>

<meta-data

android:name="android.accounts.AccountAuthenticator"

android:resource="@xml/certificate_authenticator" />

</service>

Le service…

Page 23: PKI Android : Installer, gérer, sécuriser et utiliser un secret

23

<account-authenticator

xmlns:android="http://schemas.android.com/apk/res/android"

android:accountType="fr.prados.android.account.certificate"

android:icon="@drawable/ic_launcher"

android:smallIcon="@drawable/ic_launcher"

android:label="@string/authenticator_certificate_label“

/>

La description du compte…

Page 24: PKI Android : Installer, gérer, sécuriser et utiliser un secret

24

Normalement utilisé pour du OAuth…

… détourné pour communiquer le certificat par la

mAccountManagerCallback

Utilisation…

mAccountManager.invalidateAuthToken(mAccountType, mAuthToken);

mAccountManager.getAuthToken(

mAccount, // Account retrieved using getAccountsByType()

mAuthTokenType, // Auth scope

mOptions, // Authenticator-specific options

this, // Your activity

mAccountManagerCallback, // Callback

mHandler); // Callback called if an error occurs

HttpsURLConnection.setDefaultSSLSocketFactory(mSocketFactory);

Page 25: PKI Android : Installer, gérer, sécuriser et utiliser un secret

25

Dans getAuth

Privilège de l’appelant

public static final String KEY_CALLER_UID =

(VERSION.SDK_INT>=VERSION_CODES.HONEYCOMB) ?

AccountManager.KEY_CALLER_UID : "callerUid";

public static final String KEY_CALLER_PID =

(VERSION.SDK_INT>=VERSION_CODES.HONEYCOMB) ?

AccountManager.KEY_CALLER_PID : "callerPid";

if (options == null)

return errorDenied();

int pid = options.getInt(KEY_CALLER_PID);

int uid = options.getInt(KEY_CALLER_UID);

if (mContext.checkPermission(PERMISSION, pid, uid) ==

PackageManager.PERMISSION_DENIED)

return errorDenied();

}

Page 26: PKI Android : Installer, gérer, sécuriser et utiliser un secret

26

Tél : +33 (0)1 58 56 10 00

Fax : +33 (0)1 58 56 10 01

www.octo.com© OCTO 2013

50, avenue des Champs-Elysées

75008 Paris - FRANCE

Un scénario possible

Page 27: PKI Android : Installer, gérer, sécuriser et utiliser un secret

27

Enrôlement de quelques centaines de terminaux

Gestion des CDD

Gestion d’oubli des terminaux

Grande facilité et souplesse de déploiement sans sacrifier la

sécurité

L’expérience utilisateur doit être la plus simple possible !

Contraintes de sécurité : un certificat pour un triplet

Employé

Téléphone (IMEI)

SIM

Objectif de la mission

Page 28: PKI Android : Installer, gérer, sécuriser et utiliser un secret

28

Enregistrement des triplets dans le SI

L’utilisateur saisi son identifiant sur le

terminal

C’est tout !

Il récupère son certificat (clés privée et

publique)

Il est protégé et partagé dans le terminal

Notre approche

Page 29: PKI Android : Installer, gérer, sécuriser et utiliser un secret

29

Requête vers le serveur avec l’identité de l’utilisateur

Le serveur génère le certificat et le chiffre avec <IMEI> +

<random>

<random> est envoyé par SMS

Le téléphone capable de déchiffrer prouve son identité (le triplet

est résolu)

Processus d’enrôlement

Page 30: PKI Android : Installer, gérer, sécuriser et utiliser un secret

30

Expérience utilisateur simple

Seulement 2 écrans

Page 31: PKI Android : Installer, gérer, sécuriser et utiliser un secret

31

La durée de vie du certificat peut être courte (CDD)

Facilité de déploiement

En cas de vol, ajout du certificat client dans la CRL

Un utilisateur peut avoir plusieurs devices

En cas d’oubli, génération d’un certificat temporaire

Pas chère !

Adaptable à la dernière version de Chrome

Avantages de la solution

Page 32: PKI Android : Installer, gérer, sécuriser et utiliser un secret

32

Tél : +33 (0)1 58 56 10 00

Fax : +33 (0)1 58 56 10 01

www.octo.com© OCTO 2013

50, avenue des Champs-Elysées

75008 Paris - FRANCE

Merci ! Des question ?

Philippe Prados

Aurélien RambauxG+ http://goo.gl/xljZS

[email protected]

Page 33: PKI Android : Installer, gérer, sécuriser et utiliser un secret

33

Technologies de sauvegarde

des Secrets

Remarques

Sauvegarde dans le contexte de

l'application.

Les données ne sont pas chiffrées. Elles sont

vulnérables au vol du téléphone.

SE dans la carte à puce Inaccessible aux applications

SE dans le terminal Inaccessible aux applications

Chiffrement du disque Non obligatoire. Ne protège pas de vulnérabilités

des applications ou du téléphone allumé.

KeyStore Conteneur sécurisé mais non officiel. Il peut être

modifié dans les prochaines versions d'Android.

À ce jour, le meilleur endroit où sauver les secrets.

KeyChain Gestion officielle de gestion des certificats clients.

Non disponible avant l'API 14. Nous proposons

une librairie de compatibilité pour les versions

comprise entre 7 et 14.