# X.509 / TLS

# <i class="fa fa-user-secret" aria-hidden="true"></i>


### OpenSSL

* Implémenté en C
* Boîte à outils de chiffrement
  * bibliothèques cryptographie générale
  * bibliothèques implémentant le protocole SSL
  * commande en ligne
* Supporte SSL 2.0, SSL 3.0 et TLS 1.0
* Actuellement TLS 1.2
* Distribué sous une licence de type Apache


### GnuTLS

* Conforme aux spécifications de l'IETF
* Permet l'authentification via les certificats
  * X509
  * PGP
* A la différence d'OpenSSL, GnuTLS est compatible avec les licences GPL


### [X.509](https://fr.wikipedia.org/wiki/X.509)

* Norme Pour
  * certificats à clé publique
  * listes de révocation de certificats
  * attributs de certificat
  * algorithme de validation du chemin de certification

* UIT (agence de l'ONU le développement spécialisé dans les TIC )
  * v1: 1988, v2: 1993, v3: 1996


## [X.509](https://fr.wikipedia.org/wiki/X.509)

* Système hiérarchique d'autorités de certification
  * *certification authority - **CA***
    * une CA attribue un certificat liant
      * une clé publique
      * un nom distinctif
        * *Distinguished Name - **DN***


## [X.509](https://fr.wikipedia.org/wiki/X.509) DN

* C: Country
* L: Locality
* ST: State
* O: Organisation
* SO: Organizational Unit
* CN: Common Name
* Street: Adress
* E: Mail


#### Anatomie

* **Version de la norme**
* **Serial**
* Algorithme de signature du certificat
* **Issuer** le signataire (DN de la CA)
* **Validty** début fin de validité
* **Subject name** DN identifié par le certificat
* **Subject Public Key**
* Extensions (ajouté en v3)
  * paires clé / valeur

Le tout signé par la CA


#### Extensions

Informations ou contraintes d'utilisation
* **Key Usage**
* **Subject Key Identifier**
* **keyEncipherment** Algorithme de signature du certificat
* **rfc822Name** email address
* **dNSName** DNS name for a machine
* **uniformResourceIdentifier** URL
*  **iPAddress**


## Générer une clé RSA

```bash
$ openssl genrsa -out ca.key 4096
```

* 4096 représente la taille de la clé
* ```ca.key``` contient la clé privée ET la clé publique

```bash
$ openssl rsa -in ca.key -pubout
```

* Permet d'extraire la partie publique uniquement


## Générer un certificat

```bash
$ openssl req -new -x509 -days 1826 \
            -key ca.key -out ca.crt \
            -subj '/CN=m4z3.me'
```

```bash
$ cat ca.crt
-----BEGIN CERTIFICATE-----
MIIC/zCCAeegAwIBAgIJAM4FANszQweWMA0GCSqGSIb3DQEBCwUAMBYxFDASBgNV
BAMMC2V4YW1wbGUuY29tMB4XDTE3MTAzMTExMzEzNFoXDTE3MTEzMDExMzEzNFow
```

[différences entre certificats](https://www.sslmarket.fr/ssl/help-la-difference-entre-certificats)


## Certificat auto-signé

* Issuer et Subject identiques
* Tout le monde peut en fabriquer
* Rejeté par défaut par les navigateurs


#### Faire parler un certificat

local

```bash
$ openssl x509 -text -noout -in ca.crt
```

distant

```bash
$ openssl s_client -connect isima.fr:443 -showcerts -servername isima.fr
```

* [Using OpenSSL’s s_client command with web servers using Server Name Indication (SNI)](https://major.io/2012/02/07/using-openssls-s_client-command-with-web-servers-using-server-name-indication-sni/)

usage du certificat

```bash
$ openssl x509 -purpose -in ca.crt  -inform PEM
```


## Faire parler un certificat

![Check CERT Firfox](images/ssl/check-cert-ff.png)

* Avec son navigateur en cliquant sur le cadenas


## Faire parler un certificat

![Check CERT Firfox](images/ssl/check-cert-ff2.png)


## Autorité de certificaiton (CA)

* Tiers de confiance
* Recueille les demandes de certifications
  * Vérifie la validité de la demande
    * Vérifie l'identité
      * Preuve par contrôle des domaines
* Signe les certificats
* Gère les révocations


## Autorité de certificaiton (CA)

* CA de confiance  
  * importées par défaut dans le navigateur
    * Tout supprimer?
  * Etre importée dans les navigateurs
    * payer (le navigateur)


## Known good signers

![Known good signers](images/ssl/known-good-signers.png)


## [Root CA](https://fr.wikipedia.org/wiki/Certificat_racine)

Certificat racine

* clés publiques non signées, ou auto-signées
  * le sommet de la pyramide de confiance  
  * Un certificat est rarement signé par une CA racine
  * La CA racine créée plusieurs CA intermédiaires
    * sous scellés / déconnectés / sortis (autre CA)
    * auto signé


## Chain of trust

Chaînes de certification

* Les CA intermédiaires signent
  * les certificats des clients
  * d'autres CA intermédiaires
    * il faut alors fournir la chaîne de certification
      * au cas où l'intermédiaire ne soit pas dans le navigateur


## CA connues

* [digicert](https://www.digicert.com/)
  * [verisign](https://www.websecurity.symantec.com/fr/fr/ssl-certificate)
* [Comodo](https://www.comodo.com/)
* Gratuites
  * [StartSSL free](https://www.startcomca.com/index/support?v=1)
  * [CAcert](http://www.cacert.org/) (not known good signers)
  * [Let's Encrypt](https://letsencrypt.org/) fondé par l'[EFF](https://www.eff.org/fr) et [Mozilla](https://www.mozilla.org/fr/)


## CA & Firefox

![Warning](images/ssl/https-ff.png)


## CA & Chrome

![Warning](images/ssl/https-chrome.png)


## Différentes causes

* Certificat différent du nom de domaine
  * wildcard
    * https://amendes.gouv.fr
* Certificats expirés
* Autorités de certification non importée
* ...


## Certificate Sign Request
### (CSR)

```bash
$ openssl req -new -newkey rsa:2048 -sha256 \
            -nodes -out user.csr -keyout user.key \
            -subj '/CN=example.com'
```

* Générer un requête de certification
* Un CSR est auto-signé (pour vérifier l'intégrité)

```bash
$ openssl req -in user.csr -text -noout
```

* Lire le CSR

```bash
$ openssl req -text -noout -verify -in user.csr
```

* Vérifier le CSR


### Création d'un certificat à partir d'un CSR

```bash
$ openssl x509 -req -days 365 \
       -CA ca.crt -CAkey ca.key \
       -CAcreateserial -CAserial serial \
       -in user.csr -out user.crt \
```

* Génèrer un certificat à partir d'un CSR
  * la CA vérifie qu'elle gère le domaine
  * la CA ajoute quelques informations
  * la CA signe avec sa clé privée
    * la CA protège sa clé privée

note:
- https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs


## Vérification de la signature

```bash
$ openssl verify -CAfile ca.crt user.crt
user.crt: OK
```

```bash
$ openssl x509 -text -noout -in user.crt
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            f0:61:f4:c1:96:86:21:07
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=m4z3.me
        Validity
            Not Before: Jan 18 17:27:54 2018 GMT
            Not After : Jan 18 17:27:54 2019 GMT
        Subject: CN=example.com
```
note:
- https://stackoverflow.com/questions/25482199/verify-a-certificate-chain-using-openssl-verify


## Signer un fichier

https://raymii.org/s/tutorials/Sign_and_verify_text_files_to_public_keys_via_the_OpenSSL_Command_Line.html

#### Certificate Revocation List (CRL)

Révocation de certificats

* Contient une liste de certificats valides à révoquer
  * utile en cas de compromission / décommissionnement
    * informer la CA
    * la CA ajoute le certificat à sa liste de certificats révoqués
    * cette liste est signée par la CA
* Souvent la clé qui signe les certificats signe les CRL
* Quand que le navigateur interroge-t-il les CRL ?


####  Certificate Revocation List (CRL)

* Serial
* Algorithme de signature de la CRL
* **Issuer** le signataire (DN de la CA)
* **Update date **
* **Next Update date**
* **CRL**
  * revoked 1
  ...
  * revoked 1
* Extensions
  * paires clé / valeur

note:
- next update parce que CRL delta


## Revocation reason

* unspecified (0)
* keyCompromise (1)
* CACompromise (2)
* affiliationChanged (3)
* superseded (4)
* cessationOfOperation (5)
* certificateHold (6)
* removeFromCRL (8)
* privilegeWithdrawn (9)
* AACompromise (10)


#### Online Certificate Status Protocol (OCSP)

Protocole d’interrogation de validité pour un certificat

![OCSP](images/ssl/OCSP.png)

* si l'OCSP n'est pas disponible pour le certificat firefox accepte le certificat
  * s'il est valide


#### Online Certificate Status Protocol (OCSP)

* peu déployé
* [Approche par log publique de création révocation](http://confiance-numerique.clermont-universite.fr/Slides/R-Sasse.pdf) [<i class="fa fa-video-camera"></i>](http://webtv.u-clermont1.fr/media-MEDIA150907102804168)
* [Google's Certificate Transparency project](http://www.certificate-transparency.org/)


## SSL / TLS

* Crée un canal de communication **authentifié**, protégé en **confidentialité** et en **intégrité**
* Utilise des certificats X.509
  * délivrés par des CA
* Utilise un système de chiffrement asymétrique
  * pour échanger une clé pour le chiffrement symétrique
* Protocole initialement pensé pour sécurisé HTTP
  * étendu à d'autres services (SMTP, LDAP, VPN, ...)


## TLS dans le modèle TCP/IP

![SSL/TLS in TCP/IP model](images/ssl/tcp-ip_model_ssl-tls_protocol.png)

* Couche intermédiaire car indépendante du protocole utilisé


## Versions SSL

Secure Socket Layer

* **1.0** par Netscape en 1994, pas de public release
* **2.0** par Netscape en Février 1995, [The SSL Protocol Version 2.0](http://www.frameip.com/rfc/draftxxx.php)
* **3.0** par Netscape en Novembre 1996, [The SSL Protocol Version 3.0](http://www.frameip.com/rfc/draft302.php)


## Versions TLS

Transport Layer Security

* **1.0** released en janvier 1999, [RFC 2246](http://www.frameip.com/rfc/rfc2246.php)
  * **TLS 1.0** = SSL 3.1 [IETF](http://www.ietf.org/)
* **1.1** released en Avril 2006, [RFC 4346](http://www.frameip.com/rfc/rfc3546.php)
* **1.2** released en Août 2008, [RFC 5246](http://www.frameip.com/rfc/rfc4366.php)


## Connexion SSL/TLS (1)

Le serveur

  * Envoie son certificat au client


## Connexion SSL/TLS (2)

Le client

  * Reçoit un certificat
  * Vérifie sa validité (domaine, date, émetteur, révocation?)
  * Génère une clé de chiffrement symétrique (**secret partagé**)
  * Chiffre le **secret partagé** avec la clé publique du serveur
  * Envoie le **secret partagé** chiffré au serveur (ClientKeyExchange)


## Connexion SSL/TLS (3)

Le serveur

  * Reçoit le **secret partagé** chiffré généré par le client
  * Déchiffre le **secret partagé** avec sa clé privée

<br>

#### La suite de la communication est chiffrée symétriquement


## Connexion SSL/TLS

* Le client a authentifié le serveur
  * mais le serveur n’a aucune information sur le client
    * possibilité d'avoir un certificat côté client

* Les paramètres de chiffrements
  * sont négociés et « jetables »

## Certificats clients

* Un client peut présenter un certificat au serveur
* Le serveur vérifie si le certificat est signé par une CA de confiance
* Le serveur peut utiliser ces informations pour authentifier l’utilisateur
* Le certificat peut être stocké dans un périphérique (e.g. Yubikey), une carte à puce (e.g. CPS), ...
vérifier avec le CNRS


## [Cypher suite](https://fr.wikipedia.org/wiki/Suite_cryptographique)

Suite cryptographique

* échange de clés
* authentification des parties
* chiffrer les données applicatives
* protéger les données applicatives en intégrité (MAC)

**Cipher suites** gérées par un système

<pre><code class="hljs bash" style="font-size: 35px">$ openssl ciphers -v</code></pre>


## ex: TLS_RSA_WITH_RC4_128_MD5

  Se lit

* [RSA](https://fr.wikipedia.org/wiki/Chiffrement_RSA)
  * authentification du serveur
* RC4_128 = algorithme de chiffrement [RC4](https://fr.wikipedia.org/wiki/RC4) avec clé de 128 bits
  * pour chiffrer le canal de communication
* [MD5](https://fr.wikipedia.org/wiki/MD5)  
  * protection de l'intégrité du canal de communication  via [HMAC MD5](https://fr.wikipedia.org/wiki/Keyed-Hash_Message_Authentication_Code)


## Handshake

[Comprendre le SSL/TLS: Partie 4 Handshake Protocol](https://blog.eleven-labs.com/fr/comprendre-le-ssltls-partie-4-handshake-protocol/)

<br>

(*[Déroulement des échanges ssl en détail](https://www.securiteinfo.com/cryptographie/ssl.shtml)*)


![TLS Handshake](images/ssl/TLS-Handshake.png "SSLv2 Handshake")


#### Négociation de la cipher suite

* Tous les serveurs web ne négocient pas les cypher suites de la même façon
  * IIS prend la première suite cryptographique préférée du serveur et proposée par le client
  * Apache prend la première suite proposée par le client et supportée par le serveur
    * permet une baisse du niveau de sécurité
    *  *SSLHonorCipherOrder* pour sécuriser

[SSL / TLS Renegotiation Handshakes MiTM Plaintext Data Injection- medium or low
risk?](https://security.stackexchange.com/questions/63867/ssl-tls-renegotiation-handshakes-mitm-plaintext-data-injection-medium-or-low)


## Vulnérabilité TLS_RSA_WITH_RC4_128_MD5

* si la clé privée du serveur est récupérée
  * le *pre master secret* est récupérable
    * on peut obtenir les clés de session
      * toutes les communications sont alors déchiffrables
        * passées
        * futures


## Perfect Forward Secrecy (PFS)

*Confidentialité Persistante*

* La clé compromission d'un clé privée n'affecte pas la confidentialité des communications passées
  * utilisée uniquement pour signer
* [Problème NP-complet](https://fr.wikipedia.org/wiki/Probl%C3%A8me_NP-complet)


![Diffie-Hellman exchange](images/ssl/diffie-hellman-exchange.png "Diffie-Hellman exchange")


<!-- !!!! -->
## Handshake - SSLv2

![SSLv2 Handshake](images/ssl/SSLv2-Handshake.png "SSLv2 Handshake")

* Il n'y a pas de message **finished**
  * **finished** protège l'échange en intégrité


## Handshake - SSLv2 - MIM

![SSLv2 Handshake](images/ssl/SSLv2-MIM-Handshake.png "SSLv2 Handshake")

Note:
- attaque man in the middle permet de faire baisser la sécurité des méthodes supportés par le client ou le serveur
  - pas de déchiffrement à la volée
  - mais possible avec un peu de temps
- SSLv2 est aussi vulnérable parce que
  - utilise MD5 dans toutes ses ciphersuites
  - utilise la même clé pour protéger le flux en intégrité et en confidentialité
  - pas de mécanisme de signalement de fin de connexion
    - attaques par "troncature" du flux
- SSLv2 ne doit pas être utilisé --


## Renégociation sécurisée

* en cas de
  * rafraîchissement des clés
    * à l'initiative du client ou du serveur
  * en cas d'authentification du client
    * authentification d'une partie protégée

le serveur initie une renégociation


[![TLS Renégociation](images/ssl/TLS-Renegociation.png "TLS Renégociation")<!-- .element style="width: 85%" -->](images/ssl/TLS-Renegociation.png)


![TLS Renégociation man in the middle](images/ssl/TLS-MIM-Renegociation.png "TLS Renégociation man in the middle")<!-- .element style="width: 75%" -->
<!-- !!!! -->


## Certification Authority Authorization (CAA)

* Une CA peut vérifier si elle est autorisée à émettre un certificat pour un domaine via le DNS (enregistrement CAA)

* Devenu obligatoire le 8 septembre 2017

* Le 9 septembre 2017, Comodo s’est fait pincer pour ne pas le respecter :
[Comodo Caught Breaking New CAA Standard One Day After It Went Into Effect](https://www.bleepingcomputer.com/news/security/comodo-caught-breaking-new-caa-standard-one-day-after-it-went-into-effect/)

Note:
- cas où un domaine est déjà enregistré chez un CA (let's encrypt)
  - et qu'une autre CA lui délivre un certificat
  - Comodo n'en a pas tenu compte


## DNS-Based Authentication of Named Entities (DANE)

* Publication du certificat dans un enregistrement TLSA du DNS, protégé par DNSSEC

* Validation par les clients


## HTTPS

* HTTP + SSL/TLS = HTTPS assure
  * Confidentialité
    * [Session Hijacking](http://en.wikipedia.org/wiki/Session_hijacking)
      * [les dangers du wifi](https://wiki.wireshark.org/CaptureSetup/WLAN)
        * [firesheep](http://codebutler.github.io/firesheep/)
  * Intégrité
  * Authentification (via les certificats)


## Apache

* __Open SSL__
  * mod_ssl
* __GnuTLS__
  * [mod_gnutls](https://technique.arscenic.org/lamp-linux-apache-mysql-php/apache-le-serveur-http/modules-complementaires/article/installer-et-configurer-le-module)


## Que "chiffre" https

* On ne voit pas l'url dans le traffic
  * mais on voit l'ip de l'hôte
* Proxy https ou VPN anonimisent complètement le traffic

Note:
- Attention les proxy
  - surtout anonymes sont de faux amis
  - ce n'est pas un vpn
  - pose des problèmes de certificats
    - proxy https = MITM


## Vulnérabilités multiples

* [2015] [Weak Diffie-Hellman and the Logjam Attack](https://weakdh.org/)
  * permet de forcé les connexions TLS à 512-bit export-grade cryptography
  * [Freack Attack](https://freakattack.com/) réminiscence
* [2014] [Poddle](http://www.dwheeler.com/essays/poodle-sslv3.html)
  * [POODLE test](https://www.poodletest.com/)
* [2014] [Heartbleed](https://fr.wikipedia.org/wiki/Heartbleed)
  * lecture de la mémoire du serveur via un heartbeat


## Vulnérabilités multiples

* [OpenSSL vulnerabilities](https://www.openssl.org/news/vulnerabilities.html)
* [GnuTLS security](http://www.gnutls.org/security.html)
* [Les attaques SSL / TLS](https://korben.info/les-attaques-ssltls.html)
* [Public Key Infrastructure (PKI)](https://fr.wikipedia.org/wiki/Infrastructure_%C3%A0_cl%C3%A9s_publiques)
* [Certificate authorities issue SSL certificates to fraudsters](http://news.netcraft.com/archives/2015/10/12/certificate-authorities-issue-hundreds-of-deceptive-ssl-certificates-to-fraudsters.html)  

Note:
- Repose sur la confiance dans les autorités de confiance
  - Honnêteté et sécurité des autorités de certification
  - savoir faire : délivré des certificats certifiant par erreur
  - signé par une autorité de confiance, chaine valide
    - on calcule le hash avec la clé publique de l'autorité et on la compare au hash du certificat


## <i class="fa fa-gears"></i> Tests serveurs

* Tester un certificat SSL
  * [SSL Decoder](https://ssldecoder.org/)
  * [Certificate Expiry Monitor](https://certificatemonitor.org/)
* Tester une configuration SSL
  * [Qualys](https://www.ssllabs.com/ssltest/)
  * [Comodo ssl analyzer](https://sslanalyzer.comodoca.com/)
  * [OpenSSL Decoder](https://raymii.org/s/software/OpenSSL_Decoder.html)
  * [Strong SSL Security On nginx](https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html)


## <i class="fa fa-gears"></i> Tests navigateurs

* [SSL Cipher Suite Details of Your Browser](https://cc.dcsec.uni-hannover.de/)
* [How's my SSL?](https://www.howsmyssl.com/)
* [<i class="fa fa-firefox"></i> Toggle Cipher Suites](https://addons.mozilla.org/fr/firefox/addon/toggle-cipher-suites/)
  * [<i class="fa fa-github"></i> Toggle Cipher Suites](https://github.com/dillbyrne/toggle-cipher-suites/releases)
* [<i class="fa fa-github"></i> Calomel SSL validator](https://addons.mozilla.org/fr/firefox/addon/calomel-ssl-validation/)

Note:
- aspect arbitraire de la notation notamment qualys
  - méfiance quand il y aquelque chose à vendre
- SSL en fait TLS on est d'accord


## <i class="fa fa-medkit"></i> Se protéger

* un service sans **s** est un problème
  * pas ftp, mais sftp ou ftps
  * pas rsync, mais rsync over sssh
  * pas imap, pop3 et smtp, mais imaps, pop3s et smtps
* Seules les implémentations conformes à TLSv1 et supérieures doivent être employées
* Les cyphersuites offrant la PFS doivent être favorisées
* [Anssi - SSL/TLS: état des lieux et recommandations](www.ssi.gouv.fr/.../SSL_TLS_etat_des_lieux_et_recommandations.pdf)


## <i class="fa fa-medkit"></i> Se protéger / Apache

* [Chiffrement fort SSL/TLS : Mode d'emploi](https://httpd.apache.org/docs/2.4/fr/ssl/ssl_howto.html)
* [Hardening Your Web Server’s SSL Ciphers](https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/)
* [ssllabs.com's own Apache SSL Config Directives](https://community.qualys.com/thread/9652)
* [Apache web server SSL best practices](https://wiki.fysik.dtu.dk/it/SSL_best_practices)


## <i class="fa fa-medkit"></i> Se protéger / Nginx

* [HTTPS on Nginx: From Zero to A+ (Part 1)](https://juliansimioni.com/blog/https-on-nginx-from-zero-to-a-plus-part-1/)
* [HTTPS on Nginx: From Zero to A+ (Part 2)](https://juliansimioni.com/blog/https-on-nginx-from-zero-to-a-plus-part-2-configuration-ciphersuites-and-performance/)


#### <i class="fa fa-medkit"></i> Se protéger / tout serveur

* [https://cipherli.st/](https://cipherli.st/) pour une conf sécurisée
  * [<i class="fa fa-warning"></i> Modifier tous les vhosts pour nginx!!](http://serverfault.com/questions/641150/nginx-cant-disable-sslv3)

* fixer le [weak Diffie-Hellmani (aka logjam Attack](https://weakdh.org/))
  <pre><code class="hljs bash" style="font-size: 28px"> openssl dhparam -out dhparams.pem 2048 </code></pre>

* suivre les [<i class="fa fa-book"></i> recommandations de l'ANSSI](https://www.ssi.gouv.fr/agence/publication/ssltls-3-ans-plus-tard/)


#### A lire

* [Comprendre SSL/TLS - 1](https://blog.eleven-labs.com/fr/comprendre-ssl-tls-partie-1/)
* [Comprendre SSL/TLS - 2](https://blog.eleven-labs.com/fr/comprendre-ssl-tls-partie-2-chiffrement/)
* [Comprendre SSL/TLS - 3](https://blog.eleven-labs.com/fr/comprendre-le-ssltls-partie-3-certificats/)
* [Comprendre SSL/TLS - 4](https://blog.eleven-labs.com/fr/comprendre-le-ssltls-partie-4-handshake-protocol/)
* [Comprendre SSL/TLS - 5](https://blog.eleven-labs.com/fr/comprendre-ssl-tls-partie-5-record-protocol/)
* [CaenCamp #33 : Infrastructures à clés publiques](https://www.youtube.com/watch?v=9zNAUFtw7Ac) par [Romain Tartiaire](https://romain.blogreen.org/)
* [Chrome, Firefox et recherches Google : passage en force du HTTPS ](http://dareboost.developpez.com/tutoriels/securite-web/https-nouveaute-recherche-google-chrome-firefox/)
* http://www.cypherpunks.to/~peter/T2a_X509_Certs.pdf