« Apache2 Authentification par carte à puce » : différence entre les versions

De NCad Wiki
Aller à la navigation Aller à la recherche
 
(Une version intermédiaire par le même utilisateur non affichée)
Ligne 121 : Ligne 121 :
  </Location></span>
  </Location></span>
  </VirtualHost>
  </VirtualHost>
=== Récupération des données du certificat ===
* Lorsqu’un certificat est utilisé pour l’authentification, les données de ce dernier sont accessibles via la variable globale serveur '''$_SERVER[‘SSL_CLIENT_CERT’]'''.
* La lecture des données du certificat contenues dans cette variable, s’effectue à l’aide la fonction PHP '''openssl_x509_read()'''.
* Il est également nécessaire de parser le contenu à l’aide de la fonction '''openssl_x509_parse()''' pour en extraire les données utiles.
* Voici un exemple de code permettant d’afficher l’ensemble des informations stockées dans le certificat :
<?php
$certificat = openssl_x509_parse(openssl_x509_read(($_SERVER['SSL_CLIENT_CERT'])));
echo "&lt;pre>";
print_r($certificat);
echo "&lt;/pre>";
?>

Dernière version du 13 juillet 2024 à 20:33

Serveur Web

Installation d'Apache2 Paramétrage courant

Certificats SSL Web | .htaccess | Authentification par carte à puce | Certificats Let's Encrypt


Archives : Ancien article sur Apache2 | Module Whois | ProFTPd


Note de version

Certificats de l’autorité racine émettant les cartes à puce

  1. Se rendre sur le site web de l’autorité de certification IGC-Santé accessible depuis le lien http://igc-sante.esante.gouv.fr.
  2. Télécharger le fichier de certificat au format PKCS#7 (P7B) regroupant tous les certificats racine de l’autorité.
  3. Téléverser ce fichier sur le serveur web via une connexion SFTP.

Configuration initiale

  • Pour illustrer cette documentation – nous déploierons à titre d’exemple – l’authentification par carte à puce sur le site web fictif www.smartcard.lan.
  • Sur notre serveur web Apache2, ce site dispose d’un vhost dédié. Voici la configuration initiale de ce vhost sauvegardée dans le fichier /etc/apache2/sites-available/www.smartcard.lan.conf :
<VirtualHost *:80>
	DocumentRoot /var/www/smartcard.lan/www/
	ServerName www.smartcard.lan

	ErrorLog ${APACHE_LOG_DIR}/smartcard.lan_error.log
	CustomLog ${APACHE_LOG_DIR}/smartcard.lan_access.log combined

	RedirectPermanent "/" "https://www.smartcard.lan"

	<Directory /var/www/smartcard.lan/www/>
		allow from all
		AllowOverride all
		Options +Indexes
	</Directory>
</VirtualHost>
<VirtualHost *:443>
	DocumentRoot /var/www/smartcard.lan/www/
	ServerName www.smartcard.lan

	ErrorLog ${APACHE_LOG_DIR}/smartcard.lan_error.log
	CustomLog ${APACHE_LOG_DIR}/smartcard.lan_access.log combined

	<Directory /var/www/smartcard.lan/www/>
		allow from all
		AllowOverride all
		Options +Indexes
	</Directory>

	SSLEngine on
	SSLCertificateFile /etc/ssl/private/smartcard.lan.crt
	SSLCertificateKeyFile /etc/ssl/private/smartcard.lan.key
</VirtualHost>

Installation du certificat

Conversion du certificat au format .cer

En l’état, le fichier de certificat au format p7b ne peut pas être exploité par le serveur web Apache2. Il est nécessaire de convertir le fichier au format cer.

  1. Ouvrir une session SSH sur le serveur web.
  2. Se rendre dans le répertoire où a été téléversé le fichier de certificat p7b.
  3. Exécuter la commande suivante pour la conversion :
    Openssl pkcs7 -print_certs -in Chaine_de_certification-IGC-Sante.p7b –out Chaine_de_certification-IGC-Sante.cer
  4. Déplacer le fichier convertit dans le répertoire /etc/ssl/private :
    mv Chaine_de_certification-IGC-Sante.cer /etc/ssl/private
  5. Affecter les autorisations adéquates sur le certificat pour permettre d'être lu par l’utilisateur www-data :

chown root:www-data /etc/ssl/private/Chaine_de_certification-IGC-Sante.cer
chmod 640 /etc/ssl/private/Chaine_de_certification-IGC-Sante.cer

Paramétrage de l’hôte virtuel

  • Editer le fichier de configuration de l’hôte virtuelle smartcard.lan à l'emplacement /etc/apache2/sites-available/www.smartcard.lan.conf, puis y ajouter les lignes suivantes (en vert) :
<VirtualHost *:80>
	DocumentRoot /var/www/smartcard.lan/www/
	ServerName www.smartcard.lan

	ErrorLog ${APACHE_LOG_DIR}/smartcard.lan_error.log
	CustomLog ${APACHE_LOG_DIR}/smartcard.lan_access.log combined

	RedirectPermanent "/" "https://www.smartcard.lan"

	<Directory /var/www/smartcard.lan/www/>
		allow from all
		AllowOverride all
		Options +Indexes
	</Directory>
</VirtualHost>
<VirtualHost *:443>
	DocumentRoot /var/www/smartcard.lan/www/
	ServerName www.smartcard.lan

	ErrorLog ${APACHE_LOG_DIR}/smartcard.lan_error.log
	CustomLog ${APACHE_LOG_DIR}/smartcard.lan_access.log combined

	<Directory /var/www/smartcard.lan/www/>
		allow from all
		AllowOverride all
		Options +Indexes
	</Directory>

	SSLEngine on
	SSLCertificateFile /etc/ssl/private/smartcard.lan.crt
	SSLCertificateKeyFile /etc/ssl/private/smartcard.lan.key

	SSLCACertificateFile /etc/ssl/private/Chaine_de_certification-IGC-Sante.cer

	SSLProtocol -all +TLSv1.1 +TLSv1.2
	SSLCipherSuite      ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
	SSLHonorCipherOrder on

	<Directory /var/www/smartcard.lan/www/>
		SSLOptions +StdEnvVars +ExportCertData
		SSLVerifyClient require
		SSLVerifyDepth 4

		SSLRequireSSL

		Options –Indexes
		AllowOverride All
		Allow from all
	</Directory>

	<Location /var/www/smartcard.lan/www/>
		RewriteEngine On
		RewriteCond %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
		RewriteRule .? - [F]
		ErrorDocument 403 https://diagcps.eservices.esante.gouv.fr/?URL=https://smartcard.lan
	</Location>
</VirtualHost>

Récupération des données du certificat

  • Lorsqu’un certificat est utilisé pour l’authentification, les données de ce dernier sont accessibles via la variable globale serveur $_SERVER[‘SSL_CLIENT_CERT’].
  • La lecture des données du certificat contenues dans cette variable, s’effectue à l’aide la fonction PHP openssl_x509_read().
  • Il est également nécessaire de parser le contenu à l’aide de la fonction openssl_x509_parse() pour en extraire les données utiles.
  • Voici un exemple de code permettant d’afficher l’ensemble des informations stockées dans le certificat :
<?php

	$certificat = openssl_x509_parse(openssl_x509_read(($_SERVER['SSL_CLIENT_CERT'])));

	echo "<pre>";
	print_r($certificat);
	echo "</pre>";

?>