[WP8] Problématique du Certificate Pinning
De plus en plus de services proposent une application mobile, et certains doivent échanger des données critiques entre le serveur et l’application. Une technique de sécurisation utilisée dans le monde mobile est le Certificate Pinning. Quid du support sur Windows Phone 8 ?
Certificate Pinning en détail
Le Certificate Pinning (ou SSL Pinning) est une technique de sécurisation employée lors d’échanges entre un serveur et un client. Utilisée dans le monde iOS et Android, elle permet d’éviter les attaques de type MITM « Man In The middle ». Le Certificate Pinning consiste à vérifier côté applicatif l’authenticité du certificat fourni par le serveur. Après réception du certificat du serveur par l’application, celle-ci vérifie la validité du certificat avec son propre certificat ou sa clé publique contenus au sein de son package. Si la véracité du certificat est avérée alors le client peut commencer à interroger le service.
Constat sous Windows Phone 8.0
Pour être clair, sous Windows Phone 8 le Certificate Pinning n’est pas supporté nativement.
Jeff Sanders de Microsoft l’explique par exemple ici (https://social.msdn.microsoft.com/Forums/en-US/2e705132-ce25-4e4b-acbf-7a89c5d527a0/ssl-certificate-validations-in-windows-phone) et un UserVoice (https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4784983-support-server-ssl-certificate-chain-inspection-in), récoltant maintenant 255 votes, a même été ouvert afin de pousser Microsoft a ajouté cette fonctionnalité.
De plus comme le rapporte une étude de la société MWR Security (https://labs.mwrinfosecurity.com/system/assets/651/original/mwri_wp8_appsec-whitepaper-syscan_2014-03-30.pdf)
“The majority of Windows Phone 8 applications on the Marketplace were found to lack certificate pinning due to the difficulty of implementing this security measure on the platform.”
Dans le contexte mobile actuel, multiplateforme, vous pouvez être amenés à devoir développer une application Windows Phone 8.0 basé sur un Web Service déjà utilisé par une application iOS ou Android. Comment répondre à cette problématique ?
Solution 1 : SecureBlackBox
SecureBlackBox, est une librairie tierce développée par la société Eldos, qui permet d’interroger le serveur avec un appel SSL et de parser les différents certificats.
public void OpenSSL()
{
try
{
var c = new TElSimpleSSLClient();
c.OnCertificateValidate += new TSBCertificateValidateEvent(OnCertificateValidate);
c.Address = "UrlDuServeur";
c.Port = 443;
c.Open();
c.Close(false);
}
catch (Exception)
{
throw;
}
}
private void OnCertificateValidate(object sender, TElX509Certificate x509certificate, ref TSBBoolean validate)
{
byte[] certPublicKey = new byte[1024];
x509certificate.GetPublicKeyBlob(out certPublicKey);
}
Pouvant se révéler magique, cette librairie n’est pas gratuite et peut s’avérer très couteuse selon vos besoins et votre configuration d’équipe. De plus, certains clients n’acceptent pas de librairie externe au sein de leurs projets pour éviter d’utiliser des “boites noires”.
Solution 2 : Passer à Windows Phone 8.1
Avec l’annonce de la BUILD 2014, l’arrivée des applications universelles et le merge partiel des APIs entre Windows 8.1 et Windows Phone 8.0, nous avons gagné quelques fonctionnalités dont une qui nous intéresse particulièrement !
StreamSocket s = new StreamSocket();
await s.ConnectAsync(new HostName(UrlDuServeur), "443");
s.UpgradeToSslAsync(SocketProtectionLevel.Ssl, new HostName(UrlDuServeur));
var certificat = s.Information.ServerCertificate;
En effet, maintenant en Windows Phone 8.1, grâce à l’utilisation d’un StreamSocket nous pouvons lire le contenu du certificat via la propriété StreamSocket.Information.ServerCertificate.
Encore une fois, cette solution n’est pas sans défaut. Migrer l’application vers Windows Phone 8.1 implique de se séparer d’une certaine partie des utilisateurs. Actuellement seulement 40% des utilisateurs disposent de Windows Phone 8.1 et même si 100% des téléphones peuvent bénéficier de la mise à jour, cela ne sera pas effectif avant plusieurs mois.