Certificats SSL

Rédigé en avril 2015.

1) Introduction.

Nous allons aborder la question du protocole 'SSL' (Secure Sockets Layer) qui est un protocole de sécurisation des échanges sous internet. Pour ce faire, nous allons d'une part configurer apache et d'autre part créer et installer des certificats sous windows.

À l'origine, le standard SSL a été créé et développé par la société Netscape. Aujourd'hui SSL a évolué et l'on devrait plutôt parler de TLS (Transport Layer Security) dont la dernière version finalisée est la TLS v1.2 normalisé en 2008. Une nouvelle version, la TLS v1.3 est en cours d'élaboration depuis 2015, au moment où j'écris ce didicticiel.

Nous n'aborderons pas les questions historiques sur ces normes de sécurités, ni le fonctionnement des échanges entre le client et le serveur, mais simplement comment mettre en oeuvre ce protocole dans un environnement de test sous wampserver.

2) Ce qu'il faut savoir.

Pour les tests, j'ai utilisé deux navigateurs, à savoir Google Chrome et Mozilla Firefox. Je tiens à signaler qu'il existe quelques petites différences que nous aborderons au moment du rangement des certificats.

Comment reconnaitre l'état de sa connexion sous Google Chrome ? A vrai dire, j'ai travaillé sur ce navigateur car les symboles étaient bien plus parlant que chez les autres navigateurs.

Vous trouverez toutes les explications de ces symboles en vous rendant sur la page "Vérifier la connexion d'un site Web" de Google.

Si dans la barre des adresses, vous avez le symbole Blank Page Icon, votre connexion n'est pas sécurisé. Cela ne veut pas dire que vous avez un problème, mais que vous utilisez le protocole "http". En cliquant sur ce symbole, voici ce que vous pouvez obtenir :


Connexion http non sécurisée

Dans le cas d'un connexion sécurisée, vous devez voir apparaitre le symbole Cadenas Vert que l'on nomme cadenas vert. Il fait l'usage du protocole "https" et normalement, tout ce passe correctement, comme dans l'exemple ci-après :


Connexion https sécurisée

Avec ce symbole Cadenas barré, vous rencontrez un problème de sécurité, bien que vous fassiez l'usage du protocole "https" comme dans l'exemple ci-après :


Connexiion https non sécurisée

Quatrième et dernier symbole Cadenas attention, la connesion est sécurisée mais la clef publique est absente, comme dans l'exemple ci-après :


Connexion https sans clef publique

Vous risquez d'obtenir quelques différences d'interprétations avec les autres navigateurs, mais avec Google Chrome, nous aurons une interprétation facile à interpréter. Notre but, avec ce didacticiel est d'obtenir le cadenas vert Cadenas Vert pour nos connexion sécurisé.

3) Vérification à faire avant nos tests.

Nous nous trouvons dans un WampServer normalement configuré, dont l'icône est de la couleur verte. Autrement dit, nous avons une configuration en état de marche. Pour effectuer nos tests, nous avons besoin d'activer des modules d'apache, et des extensions de php, pour utiliser le protocole SSL et créer nos certificats.

3-A) Activation des modules d'apache.

Nous nous rendons dans l'icône de WampServer, en cliquant dans l'onglet "apache", puis dans "Module d'apache". Nous devons nous assurer que les deux modules suivants sont bien activés :

flechesocache_shmcb

flechessl

S'ils ne sont pas cochés, alors vous devez cliquer dessus. Cela va se traduire dans le fichier 'httpd.conf' par la suppression du commentaire devant les deux lignes suivantes :

LoadModule socache_shmcb_module        modules/mod_socache_shmcb.so
LoadModule ssl_module                  modules/mod_ssl.so
			

Normalement, il n'y a rien d'autre à faire, mais assurez-vous que ces modules sont bien présents dans le répertoire '/apache/modules'.

flechemod_socache_shmcb.so

flechemod_ssl.so

Sur ce point, nous reviendrons lors de la configuration d'apache afin d'introduire le protocole 'SSL' sur le site 'localhost'.

3-B) Activation des extensions php.

Nous nous rendons aussi sous Wampserver, en cliquant dans l'onglet "php", puis dans "Extensions php". Nous devons nous assurer que l'extension 'OPENSSL' soit bien activé.

flechephp_openssl

S'il n'est pas coché, vous devez cliquer dessus. Dans le fichier 'php.ini', vous obtiendrez l'extension sans commentaire et vous pouvez ajouter le paramétrage suivant :

extension = php_openssl.dll

[openssl]
openssl.cafile =
openssl.capath =
			

Nous laissons en l'état ce paramétrage, vu que l'autorité de certification (CA) sera renseigné sous apache. Afin de vérifier que l'extension 'OPENSSL' soit bien activé, nous nous rendons dans 'phpinfo()'. Voici ce que nous devons obtenir :

extension php_openssl sous phpinfo()

Normalement, c'est terminé. Vous pouvez vérifier que vous avez bien dans le répertoire "/php/ext" :

flechephp_openssl.dll

ainsi que les DLL dans le répertoire "/php" :

flechessleay32.dll

flechelibeay32.dll

Pour travailler avec cet extension 'OPENSSL', nous avons besoin du fichier 'OPENSSL.CNF' que nous trouvons, soit dans le répertoire "/php/extras/ssl" ou soit dans le répertoire "/apahe/conf". À partir d'une de ces copies, nous allons créer un environnement de travail afin de créer nos certificats 'SSL'.

4) Configuration d'apache.

Nous nous rendons dans le fichier 'httpd.conf' afin de renseigner d'une part la configuration 'SSL' général à tout le serveur Apache et d'autre part le site 'localhost" en VirtualHost, qui va utiliser le protocole 'https'. Dans mon 'httpd.conf', l'emplacement de WampServer est paramétré avec la variable d'apache "${Repertoire}", qui contient la valeur "F:/Wamp". C'est la seule particularité vis-à-vis de mon environnement.

Cette configuration se décompose en trois parties que voici :

4-A) Activation de l'écoute du port 443.

Nous ajoutons les directives suivantes afin de signaler à Apache que l'on désire faire une écoute sur les ports 80 et 443.

Listen 80 http
#
<IfModule ssl_module>
	listen 443 https
</IfModule>
			

Pourquoi ces deux ports ? Le protocole "http" utilise le port 80 pour ses échanges alors que le protocole "https" utilise avec le port 443. Il est donc impératif d'activer l'écoute du port 443 pour nos échanges sécurisés.

4-B) Configuration du protocole 'SSL'.

Nous retrouvons nos deux modules que nous avons activé précédemment. Afin de pouvoir désactiver ces modules, nous devons toujours placer le paramétrage 'SSL' dans un bloc testant l'activation du module 'SSL_MODULE'.

# -------------------------------------- #
#     Module SSL                         #
# -------------------------------------- #

LoadModule ssl_module                  modules/mod_ssl.so
LoadModule socache_shmcb_module        modules/mod_socache_shmcb.so

<IfModule ssl_module>
	SSLProtocol +All -SSLv3
#
	SSLRandomSeed startup builtin
	SSLRandomSeed connect builtin
#
	SSLCipherSuite HIGH:!aNULL:!MD5
#
	SSLPassPhraseDialog             builtin
#	
	SSLSessionCache                 "shmcb:${Repertoire}/tmp/ssl_scache(512000)"
	SSLSessionCacheTimeout          300
</IfModule>
			

Deux remarque à faire :

flecheNous rejetons le protocole SSLv3 car il a été interdit d'utilisation par le navigateur Mozilla Firefox (voir ce lien en anglais).

Suite aux vulnérabilités découvertes sur la version 'SSLv3', voici ce que vous pouvez ajouter :

	SSLProtocol -ALL +TLSv1 +TLSv1.1 +TLSv1.2
#
	SSLHonorCipherOrder On
	SSLCipherSuite ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:HIGH:!MD5:!aNULL:!EDH:!RC4
#
	SSLCompression off
			

Ainsi nous utilisons que le protocole 'TLS' pour les version 1.0, 1.1 et 1.2 qui est la dernière.

La directive 'SSLCipherSuite' définie les algorityhmes de chiffrement que vous utilisez.

flecheDans nos certificats, nous n'utilisons pas de 'Pass Phrase'. Si vous désirez mettre un mot de passe, voilà comme procéder :

	SSLPassPhraseDialog             "exec:${Version_Apache}/conf/Certificat/passphrase.txt"
			

Si vous désirez plus d'explication, je vous conseille de lire la documentation officielle d'apache.

4-C) La configuration du site 'localhost'.

Nous avons configuré notre site 'localhost' avec le protocole 'http' pour le port 80, comme ci-après :

# -------------------------- #
#     Localhost sans SSL     #
# -------------------------- #

<VirtualHost 127.0.0.51:80>
	ServerName localhost
	ServerAdmin artemus@jcz.fr
	DocumentRoot "${Repertoire}/www/"
#
	ErrorLog  "${Repertoire}/www/Logs/error.log"
	CustomLog "${Repertoire}/www/Logs/custom.log" common
#
	<Directory />
		Options -Indexes +FollowSymLinks +MultiViews
		AllowOverride none
		<RequireAny>
			Require local
		</RequireAny<
	</Directory>
</VirtualHost>
			

Afin de conserver un accès non sécurisé, nous pouvons laisser cette déclarative en l'état dans le fichier 'httpd.conf.

Si vous désirez faire une redirection vers votre site sécurisé, autrement dit, vous désirez forcer l'url par un "https://localhost", il suffit dans ce virtualHost d'ajouter la ligne suivante :

	Redirect / https://localhost/
			

Nous ajoutons dans le fichier 'httpd.conf' cette autre déclarative de 'localhost', mais cette fois-ci sur le port 443 avec le protocole "https" sécurisé :

# -------------------------- #
#     Localhost avec SSL     #
# -------------------------- #

<IfModule ssl_module>
	<VirtualHost 127.0.0.51:443>
		ServerName localhost
		ServerAdmin artemus@jcz.fr
		DocumentRoot "${Repertoire}/www/"
#
		ErrorLog  "${Repertoire}/www/Logs/error.log"
		CustomLog "${Repertoire}/www/Logs/custom.log" common
#
		SSLEngine on
		SSLCertificateFile      "${Version_Apache}/conf/Certificat/Site/localhost.crt"
		SSLCertificateKeyFile   "${Version_Apache}/conf/Certificat/Site/localhost.key"
#
#		SSLCACertificatePath    "${Version_Apache}/conf/Certificat/Ca"
		SSLCACertificateFile    "${Version_Apache}/conf/Certificat/Ca/Ca.crt"
#
		SSLVerifyClient none
		SSLVerifyDepth  10
#
		<Directory />
			SSLOptions +StdEnvVars
			Options    -Indexes +FollowSymLinks +MultiViews
			AllowOverride none
#
			<RequireAny>
				Require local
			</RequireAny>
		</Directory>
#
		<FilesMatch "\.(cgi|shtml|phtml|php)$">
#			SSLOptions +StdEnvVars
		</FilesMatch>
#
		BrowserMatch "MSIE [2-5]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
		CustomLog "f:/wamp/www/Logs/custom.log" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
	</VirtualHost>
</IfModule>
			

Quelques remarques :

flechenous avons conditionné le virtualHost en fonction de l'activation du module 'SSL'. Sans cela, nous aurions une erreur en désactivant le module 'SSL'.

fleche"SSLCertificateFile" désigne le certificat serveur qui a été signé par un CA. (CRT)

fleche"SSLCertificateKeyFile" désigne le fichier contenant la clef privée. (KEY)

fleche"SSLCACertificateFile" désigne le certificat d'autorité de certification (CA) auto-signé. (CA CRT)

fleche"SSLCACertificatePath" désigne le chemin vers un répertoire contenant tous les CA.

fleche"SSLVerifyClient" désigne la façon dont le client doit s'identifier.

fleche"SSLVerifyDepth" désigne le niveau de profondeur de la vérification du certificat client.

fleche"CustomLog" contient la nouvelle présentation des messages d'erreurs en provenance du 'SSL'.

Pour tester une connexion sécurisée, c'est largement suffisant !

5) Comment créer nos certificats.

Pour ce faire, nous avons besoin de créer un environnement de travail, destiné à la création de nos certificats. Nous devons récupérer le fichier 'OPENSSL.CNF' que nous avon signalé ci-dessus, au paragraphe 3-B). Nous devons le modifier pour l'adapter à nos spécificités.

Vous pouvez nommer comme vous le désirez, votre répertoire de travail. À l'intérieur de celui-ci, pour stocker les étapes intermédiaires de la création de vos certificats, j'ai créé un répertoire de stockage, de nom "/certificats". Je sais, ce n'est pas très original. Si vous désirez le modifier, vous pouvez le renommer comme bon vous semble. Ne pas oublier de le modifier dans le fichier 'OPENSSL.CNF' (ce qui est en rouge) dont voici un exemplaire, ci-après :

RANDFILE                       = ./Certificats/.rnd

#==================================================================#
[ ca ]
default_ca                     = CA_default

#==================================================================#
[ CA_default ]

dir                            = ./Certificats
certs                          = $dir/Cacerts
new_certs_dir                  = $dir/NewCerts
private_dir                    = $dir/Private    

database                       = $dir/Other/index.txt
serial                         = $dir/Other/serial.txt

certificate                    = $certs/ca.crt
private_key                    = $private_dir/ca.key
RANDFILE                       = $private_dir/ca.rnd

default_days                   = 4383
default_crl_days               = 30
default_md                     = md5
preserve                       = no

policy                         = policy_anything
			

Hormis le nom du répertoire de stockage, vous ne pouvez pas changer les autres répertoires, qui sont nécessaire à l'utilitaire 'OPENSSL'.

Dans 'Default_days', j'ai mis une période de validité de douze ans, ce qui correspond exactement à une période couvrant quatre années bisextiles, soit 4383 jours. Je n'ai pas touché au reste du paramétrage.

Ci-après, nous définissons les champs qui sont obligatoires, de ceux qui sont facultatifs. Il vous est demandé quelques renseignements d'identifications de votre certificat.

#==================================================================#
[ policy_match ]
countryName                    = match
stateOrProvinceName            = match
localityName                   = match
organizationName               = optional
organizationalUnitName         = optional
commonName                     = supplied
emailAddress                   = optional

#==================================================================#
[ policy_anything ]
countryName                    = optional
stateOrProvinceName            = optional
localityName                   = optional
organizationName               = optional
organizationalUnitName         = optional
commonName                     = supplied
emailAddress                   = optional
			

Ci-après, nous définissons les valeurs par défaut et les caractéristiques du mot de passe.

#==================================================================#
[ req ]
default_bits                   = 4096
default_keyfile                = privkey.pem
distinguished_name             = req_distinguished_name
attributes                     = req_attributes

#==================================================================#
[ req_distinguished_name ]
countryName                    = Country Name (2 letter code)
countryName_default            = FR
countryName_min                = 2
countryName_max                = 2

stateOrProvinceName            = State or Province Name (full name)
stateOrProvinceName_default    = Aquitaine

localityName                   = Locality Name (eg, city)
localityName_default           =

0.organizationName             = Organization Name (eg, company)
0.organizationName_default     =

organizationalUnitName         = Organizational Unit Name (eg, section)
organizationalUnitName_default =

commonName                     = Common Name (eg, your website’s domain name)
commonName_max                 = 64

emailAddress                   = Email Address
emailAddress_default           = artemus@jcz.fr
emailAddress_max               = 40

#==================================================================#
[ req_attributes ]
challengePassword              = A challenge password
challengePassword_min          = 4
challengePassword_max          = 20
			

Et enfin, les caractéristiques du certificat d'autorité (Authority Certificate = CA)

#==================================================================#
[ x509v3_extensions ]

# These extensions are added when 'ca' signs a request.

# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.

basicConstraints=CA:TRUE

# Here are some examples of the usage of nsCertType. If it is omitted
# the certificate can be used for anything *except* object signing.

# This is OK for an SSL server.
# nsCertType			= server

# For an object signing certificate this would be used.
# nsCertType = objsign

# For normal client use this is typical
# nsCertType = client, email

# and for everything including object signing:
# nsCertType = client, email, objsign

# This is typical in keyUsage for a client certificate.
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment

# This will be displayed in Netscape's comment listbox.
nsComment			= "OpenSSL Generated Certificate"

# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

# This stuff is for subjectAltName and issuerAltname.
# Import the email address.
# subjectAltName=email:copy
# An alternative to produce certificates that aren't
# deprecated according to PKIX.
# subjectAltName=email:move

# Copy subject details
# issuerAltName=issuer:copy

#nsCaRevocationUrl		= http://www.domain.dom/ca-crl.pem
#nsBaseUrl
#nsRevocationUrl
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName

# This is required for TSA certificates.
# extendedKeyUsage = critical,timeStamping

#==================================================================#
[ v3_req ]

# Extensions to add to a certificate request

basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment


#==================================================================#
[ v3_ca ]

# Extensions for a typical CA
# PKIX recommendation.

subjectKeyIdentifier=hash

authorityKeyIdentifier=keyid:always,issuer

# This is what PKIX recommends but some broken software chokes on critical
# extensions.
#basicConstraints = critical,CA:true
# So we do this instead.

basicConstraints = CA:true
			

6) Usage de la commande 'OPENSSL' pour créer nos certificats.

Le but de ce paragraphe est de montrer comment créer des certificats nécessaire à notre exemple :

flecheun certificat d'autorité de certification auto-signé que l'on note 'CA'.

flecheun certificat serveur (CSR).

flecheun certificat client (PFX).

flechela clef privée (KEY).

Nous allons passer en revue les différents paramétrages de la commande 'OPENSSL' pour produire la création de nos trois certificats et de ma clef privée. Afin d'illustrer chaque commande, je donnerai le contenu du fichier ainsi produit.

7) Création d'un certificat d'authenticité auto-signé (CA).

Afin d'être dans un cas réel, nous avons besoin de créer un certificat faisant office d'autorité de certification noté CA, sous le nom 'Artemus & Cie".

Dans les étapes ci-après, nous détaillons la création de ce certificat CA qui va nous servir, par la suite, pour signer le certificat client que nous allons utiliser pour nous identifier vis-à-vis du serveur de nom 'localhost'.

7-A) Générateur d'un nombre pseudo aléatoire.

openssl rand  -out %DIRNAME%/Private/Ca.rnd  -base64  1257
			

La variable d'environnement '%DIRNAME%' contient le chemin vers le répertoire '/certificats' que nous avons créé précédemment dans notre environnement.

Nous produisons un nombre aléatoire dont la longueur est de 1257 bits. C'est juste un exemple que nous utilisons et vous pouvez mettre autre chose que 1257. Voici ce que nous obtenons dans le fichier 'ca.rnd' :

xvVMxMaCINBjdiWwURQ9aPgyIrUyM6jP5DRsw3g/nCr3rjZ8j1Xai7FQcLLAqQ78
WgR5s8ATZC5I1/5JGZUSPRMdDUmCrKrgA3l44QTM7vAFk0MCBGYIvCHxM3aKoCG5
cE0yj5NlqckgbYsDHaqs/UPsPnMz0F+ApqjjdUL0kQzZ53N9txNgR5B6oQ2R8j0y
Yv2RyqrIvOwKa0QGLgFKZbKw8Q7FCYh0WnOLJU8v4YLzo2iekFwdSiiMmQ7QNZKo
4vxu7rP9dK5LdnPE01zpjDxslZ6DPazIE38HOfeEPFrp16r1rEEqfLSbpCuFgGBP
sP532oWTDQ03PG904ZScPZ21I7ysMyA1AyZS0SpcjLXgO/Ek6DEYkRVNXUS1WjGr
7ZQowiUqrOfLPj+YpUsRxdT3iodIxrbyaARx4jYfmFYFktYqaDOcgGlfDtiZ1d+k
BQaWi6KgB4SyHkXt5R/GPlBtTqdflCV+MOlSl0MKrC+UkPjtPmLMRga9Wl0caSW3
JeBPL+hWJ0ZayKtXMlwiOqSKn0wjw+7ba1NxF4HANeFVV3GwQB7ma3WagfA3P4Ei
O+qfCMaj7+BD+FTnRroVK0nz/JtlZtY9gRGf5SAyUchCGB2peb4g8GxbK3r1jmME
y/AGbtHINzAsRCxnIgFG4qbnFCQ6BnjUcnIYKj88OHQrujjuaC4c+dB/77VDmvLm
wSn/C1zYzwPDSQvLBZcOscY2TwTBNUrRcPKuIAElejq0QlVlj5miraBTgz+Jxn4d
1Sz+938XRkoLG2gjDnblQJiPFZ1fzS3oCt+b3/gvsQoeYtNPPbIUU0801O/p6CLU
aS3vriXTgnbvHzOX4CYAWBb3vGU4Ww7QGXJCPBTCFw5OO82ii6ALdTdbq/cE4PXS
4XhfHnQiouN4+f0M0hDjCCRs7RK0xKYq1/vd7x9bR95zVfxh0lUm7iZx7vNc6HkQ
lasQLOPxrpQu/lRsZxtjB+UIY8aOdRGeni9Qhjc9KacDlPpgWFd9syK7BfRJQoSi
kHBE9+K9CspQFE3x1MgoK2GYLHQAQUGrv+jQoA68CIEgjdryqXEQoMitAz0LR0b7
xNS1mdSryzwehKExzJcAJHDq1rKQSzV9qTKq5KJllHJ1pG/3GLyaMcSInYELLkZt
HLdTiOg+6W5gcai91AXz4imXZ+qkuiO7EXj/s8QazKjnrQLKcwY3opU6AXsIOfUi
55Qx/jG1afxj+0++eLqCaiqulN7dxcLjtN0/7CgqDOd5pOsOF5Q7j3WwE+jnPhem
1J+3Gc4a/ZMeN2VOa1jk5HryQVfDuVo/dMKJScKtAhAl5dstKMpsDujfhMwtmojw
AD7Od4pkvjhdHhBj1+r+BobHSghFlq9Jf/dhzvGEYDSivtRf1//AajmO23fltEvR
DOb5H+O3VVOLx8XLkZ3rbV/oqJWp22f03xh7av3IkbZm60O51FyalB+Njqsc2wr1
QGPkaPIbqmIy9M91GMOtSdiHfYYV4mwqrQcR9aF5BDgV5eL1exWDC91469TY8c1I
Nyv7IEQb4t2Lig3gqH+hGKEUIq+QQ0ZepEFlCI7yhQ75gItA7LhmrloztXdYA1Ut
DMNRlr0R2nNeRJBrear1pm9kotP0lYH7ij93etgwTt+mqCJQddUxfWzc6Af0eFze
TpZG1i1L5Ca5
			

Chaque ligne fait exactement 64 caractères, et il y a 26 lignes + 12 caractères, ce qui donne un total de 1676 caractères. À chaque exécution, vous obtenez une nouvelle séquence aléatoire.

7-B) Produire une clef RSA privée.

openssl genrsa  -out %DIRNAME%/Private/Ca.key  -rand %DIRNAME%/Private/Ca.rnd  4096
			

Nous reprenons la séquence aléatoire que nous avons produit précédemment. 4096 est la taille en bit de la clef privée. Voici ce que nous obtenons dans le fichier 'Ca.key' :

Aucun 'pass phrase' sera demandé lors de la création de la clef privée. Si vous en désirez un, il suffit d'ajouter l'un des codes d'encryptage ci-après : -aes128 -aes192 -aes256 -camellia128 -camellia192 -camellia256 -des -des3 -idea.

-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
			

Nous avons deux lignes servant de prologue et d'épilogue à chaque contenu, dont le message commence et se termine toujours par cinq tirets. Nous retrouverons ce même format dans les autres fichiers produit par la commande 'OPENSSL'.

7-C) Création d'une demande de signature.

openssl req  -new  -sha256  -key %DIRNAME%/Private/Ca.key  -out %DIRNAME%/Cacerts/Ca.csr
  -subj "/C=FR/ST=Aquitaine/L=/O=Artemus & Cie/CN=Artemus & Cie"
			

Pour créer cette demande de signature, nous nous servons de la clef privée créé précédemment. Nous renseignons cette demande avec les caractéristiques qui nous intéresse. Ici, mon futur certificat se nommera 'Artemus & Cie'. Voici la requête que nous obtenons dans le fichier 'Ca.csr' :

-----BEGIN CERTIFICATE REQUEST-----
MIIEqjCCApICAQAwZTELMAkGA1UEBhMCRlIxEjAQBgNVBAgMCUFxdWl0YWluZTES
MBAGA1UEBwwJTW9udGlnbmFjMRYwFAYDVQQKDA1BcnRlbXVzICYgQ2llMRYwFAYD
VQQDDA1BcnRlbXVzICYgQ2llMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC
AgEA0f4LWQPPRu33LiWiQQKukJfVfKLNPouykc90FL7CrW8ymaayW+0nj/FVrca6
016a3CC2YiYq/FQabvKMwsruo+BzmvDYNY7kNIXpPFeadQKxWTkssCVvGICeZT54
8W685uKjFIvBZLqP5ncNv6LZrFS6/vZTt9TVFuGAzNje9vBH4Ry4cqnWPbXc/pFi
/UbYxdD/NbZQHZCVOVZCDeivYiiGlZLyutbi39CgXtqIztj5ldOvemexx5aXGyba
SO811wgZMjBIliwnUmNpRAUMWWLLSVHHpU58xTKcUTeNUnxT+MiDdOUKhr3tXrsC
aT0XfMRHxnnnc33WNLXhJr9yac44dUZzTXf0cpmSvwBmjTNU2WJB72YnrLfhoV7U
4QfTB3kFzg8/i59Qlv3WBaLn/0+FOIhgx5gKg0blqD4+WqNNqZ8GchfzM2Yp1UYg
Ol8gP5Kf2Y3uTxsN9LGMF4XdZoj/AEtxqZupW6VjpSYJnEwvJIIQKRn7KT2tU/lr
x+ys8BDq9+BjmuAJ1KF1FIUy388dTZO51EQdf10UYYUXQ6Rvzr1UYIMr/qoRGz0+
QxGM03IBbeRVC6jmxYBVUIbNiX95W9pPWz4kSPf7p8Gc1X9ucN/Ols3yivMM4oE1
DLctKfdA7BkyU2mNn9/7L+g1FDWknDk88d2wTGdYiJzvLZsCAwEAAaAAMA0GCSqG
SIb3DQEBCwUAA4ICAQCqtSo7jS80reISJ1dG5pj7ufLeSqoCj1m8H7oqpWV0Vt+l
CRw/oFw7n4B2lzhLFKD+uYYxGhL0aWhyMMqCCCZR3r08b8HRZtmx17RW3o1YdU/z
z2X6b1Bue8XytgUGiKbeZQh2dByVrDhMZ2XVkkqbr65U8t6XujjUPMj3FnvtSFgI
KLqWDD9KTG9TnuL7exUXW6hSepZpUnRI64kyJcVA97EZQjg7+K1YhuQOftL58qrZ
PfHiuBfS4ht4W9NyPVFaGMnWlE556AdR+UJ925G4lawOhWoqWN9ZplB4/90rbVDS
PeBf2m2aMYbkcceIMthRxyWItyQrWZdQPlWXR+w+J04hljIvqR1dgInmwz1qyS3V
6bA09EiM/nNJB0pp3yF2Ks7Ymh/pYzGkDLBG5IaJcpFroUTApWAbQiTjtUZmXRyP
rVz/A7gTTSUbvRLZ8ZPZbKMjQoyStBS+dXpeLvphpfRPMM2asxc1gEuYvDY4CvWf
Qyb7wVbTS+7/MU6s9/Po7pdUEID5jvChgj+AT11BlRTDhdcwTZ2tfL4QtU5ZK3w8
A84/kEN4pZBAuk5QUHoloythGDFRwbwU5hbfw6jEKNxWJBHdhNBzPkEht1F17Y7s
wx1snWovzAonNmBTN7mHCo12aF6HHzM0TRz96c+2TUAaGkGgvENJwMrnthoL1g==
-----END CERTIFICATE REQUEST-----
			

7-D) Création d'un certificat auto-signé.

openssl x509  -req  -days 4383  -sha256  -in %DIRNAME%/Cacerts/Ca.csr
  -signkey %DIRNAME%/Private/Ca.key  -out %DIRNAME%/Cacerts/Ca.crt
			

Pour créer ce certificat auto-signé, nous nous servons de la demande de signature et de la clef RSA privée. En fait, la demande de signature n'était pas nécessaire mais nous avons préféré décomposer les étapes afin de comparer le résultat lors de la création d'un certificat client signé, justement ce certificat d'autorité.

-----BEGIN CERTIFICATE-----
MIIFRjCCAy4CCQDkCFUxKTZCzzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJG
UjESMBAGA1UECAwJQXF1aXRhaW5lMRIwEAYDVQQHDAlNb250aWduYWMxFjAUBgNV
BAoMDUFydGVtdXMgJiBDaWUxFjAUBgNVBAMMDUFydGVtdXMgJiBDaWUwHhcNMTUw
MzI5MTYwMTM0WhcNMjcwMzI5MTYwMTM0WjBlMQswCQYDVQQGEwJGUjESMBAGA1UE
CAwJQXF1aXRhaW5lMRIwEAYDVQQHDAlNb250aWduYWMxFjAUBgNVBAoMDUFydGVt
dXMgJiBDaWUxFjAUBgNVBAMMDUFydGVtdXMgJiBDaWUwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQDR/gtZA89G7fcuJaJBAq6Ql9V8os0+i7KRz3QUvsKt
bzKZprJb7SeP8VWtxrrTXprcILZiJir8VBpu8ozCyu6j4HOa8Ng1juQ0hek8V5p1
ArFZOSywJW8YgJ5lPnjxbrzm4qMUi8Fkuo/mdw2/otmsVLr+9lO31NUW4YDM2N72
8EfhHLhyqdY9tdz+kWL9RtjF0P81tlAdkJU5VkIN6K9iKIaVkvK61uLf0KBe2ojO
2PmV0696Z7HHlpcbJtpI7zXXCBkyMEiWLCdSY2lEBQxZYstJUcelTnzFMpxRN41S
fFP4yIN05QqGve1euwJpPRd8xEfGeedzfdY0teEmv3Jpzjh1RnNNd/RymZK/AGaN
M1TZYkHvZiest+GhXtThB9MHeQXODz+Ln1CW/dYFouf/T4U4iGDHmAqDRuWoPj5a
o02pnwZyF/MzZinVRiA6XyA/kp/Zje5PGw30sYwXhd1miP8AS3Gpm6lbpWOlJgmc
TC8kghApGfspPa1T+WvH7KzwEOr34GOa4AnUoXUUhTLfzx1Nk7nURB1/XRRhhRdD
pG/OvVRggyv+qhEbPT5DEYzTcgFt5FULqObFgFVQhs2Jf3lb2k9bPiRI9/unwZzV
f25w386WzfKK8wzigTUMty0p90DsGTJTaY2f3/sv6DUUNaScOTzx3bBMZ1iInO8t
mwIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQAZFYHeWlkGoYwBXxZHQCnWazRzETuV
Mut8r+DRVPmQzf3KbT1/ka5/+darR3VK+tI7nch7os8fCWLKnT3kMF6xe9Epo5aX
FmfLfleYnAE5h+njQrOWt+Y4Nsiw7P3NTWvmTaKglT21Ez5x0L3vAO235nOUz0aR
zAGn5mudbOYeeYhJbBZa0CrtSKowmaBDAef9RBrVltqGyF0oG/SLlEv5/p5v8KL2
lpB/SgL0Ijb+0takgaKikgwEweicFu5h3LrMGe6VQ2cr6ICnniu89b9LBgp+HbZ7
cIJjIJlya1QoMJNkFdHH9rXqlLz8R5721AjM4QzsCPJ7FtVSU5i9poHx7QmuFY46
lH41qknOqcu7lKmRA/Embmwe9q8Oxc2P3V1DLdI0I8F9FJZQifL7QRRO33r+aQvt
Ig3jCQ0UyEnuNg/Ytf1Db/3vcAVxz6kDt++/HGy2dhwjnV5Cf04HvZW7melppXiA
xO3+7d/WrmzjAVOHKanxkf+dO/sl6QTnMLaQ9knwEjPCHuHE80zBTI6jLWUaiKaB
OF9p+qnos9O0a/rCu4tSzAqSqRDmj/RpjVWsfgP2lR+4pbnLe2LJ7uUe0PFTmm+t
EeY3X1WQwnEGQHQ8iJeH4HsJIsY88Zm0/6sRsYF+xcsvJfkpS73Rgxv55omdl348
41Q9xOPgFRz2XQ==
-----END CERTIFICATE-----
			

Ce certificat qui est un 'CA' (certificate Authority en anglais) va nous servir pour signer le certificat client que nous allons créer un peu plus bas dans ce didacticiel.

7-E) Visualisation du certificat CA.

openssl x509  -in %DIRNAME%/Cacerts/Ca.crt  -noout  -text
			

Dans cet exemple, nous obtenons la visualisation du certificat CA auto-signé que nous avons obtenu précédemment. Voici le résultat obtenu :

Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            e4:08:55:31:29:36:42:cf
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=FR, ST=Aquitaine, L=, O=Artemus & Cie, CN=Artemus & Cie
        Validity
            Not Before: Mar 29 16:01:34 2015 GMT
            Not After : Mar 29 16:01:34 2027 GMT
        Subject: C=FR, ST=Aquitaine, L=, O=Artemus & Cie, CN=Artemus & Cie
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:d1:fe:0b:59:03:cf:46:ed:f7:2e:25:a2:41:02:
                    ae:90:97:d5:7c:a2:cd:3e:8b:b2:91:cf:74:14:be:
                    c2:ad:6f:32:99:a6:b2:5b:ed:27:8f:f1:55:ad:c6:
                    ba:d3:5e:9a:dc:20:b6:62:26:2a:fc:54:1a:6e:f2:
                    8c:c2:ca:ee:a3:e0:73:9a:f0:d8:35:8e:e4:34:85:
                    e9:3c:57:9a:75:02:b1:59:39:2c:b0:25:6f:18:80:
                    9e:65:3e:78:f1:6e:bc:e6:e2:a3:14:8b:c1:64:ba:
                    8f:e6:77:0d:bf:a2:d9:ac:54:ba:fe:f6:53:b7:d4:
                    d5:16:e1:80:cc:d8:de:f6:f0:47:e1:1c:b8:72:a9:
                    d6:3d:b5:dc:fe:91:62:fd:46:d8:c5:d0:ff:35:b6:
                    50:1d:90:95:39:56:42:0d:e8:af:62:28:86:95:92:
                    f2:ba:d6:e2:df:d0:a0:5e:da:88:ce:d8:f9:95:d3:
                    af:7a:67:b1:c7:96:97:1b:26:da:48:ef:35:d7:08:
                    19:32:30:48:96:2c:27:52:63:69:44:05:0c:59:62:
                    cb:49:51:c7:a5:4e:7c:c5:32:9c:51:37:8d:52:7c:
                    53:f8:c8:83:74:e5:0a:86:bd:ed:5e:bb:02:69:3d:
                    17:7c:c4:47:c6:79:e7:73:7d:d6:34:b5:e1:26:bf:
                    72:69:ce:38:75:46:73:4d:77:f4:72:99:92:bf:00:
                    66:8d:33:54:d9:62:41:ef:66:27:ac:b7:e1:a1:5e:
                    d4:e1:07:d3:07:79:05:ce:0f:3f:8b:9f:50:96:fd:
                    d6:05:a2:e7:ff:4f:85:38:88:60:c7:98:0a:83:46:
                    e5:a8:3e:3e:5a:a3:4d:a9:9f:06:72:17:f3:33:66:
                    29:d5:46:20:3a:5f:20:3f:92:9f:d9:8d:ee:4f:1b:
                    0d:f4:b1:8c:17:85:dd:66:88:ff:00:4b:71:a9:9b:
                    a9:5b:a5:63:a5:26:09:9c:4c:2f:24:82:10:29:19:
                    fb:29:3d:ad:53:f9:6b:c7:ec:ac:f0:10:ea:f7:e0:
                    63:9a:e0:09:d4:a1:75:14:85:32:df:cf:1d:4d:93:
                    b9:d4:44:1d:7f:5d:14:61:85:17:43:a4:6f:ce:bd:
                    54:60:83:2b:fe:aa:11:1b:3d:3e:43:11:8c:d3:72:
                    01:6d:e4:55:0b:a8:e6:c5:80:55:50:86:cd:89:7f:
                    79:5b:da:4f:5b:3e:24:48:f7:fb:a7:c1:9c:d5:7f:
                    6e:70:df:ce:96:cd:f2:8a:f3:0c:e2:81:35:0c:b7:
                    2d:29:f7:40:ec:19:32:53:69:8d:9f:df:fb:2f:e8:
                    35:14:35:a4:9c:39:3c:f1:dd:b0:4c:67:58:88:9c:
                    ef:2d:9b
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         19:15:81:de:5a:59:06:a1:8c:01:5f:16:47:40:29:d6:6b:34:
         73:11:3b:95:32:eb:7c:af:e0:d1:54:f9:90:cd:fd:ca:6d:3d:
         7f:91:ae:7f:f9:d6:ab:47:75:4a:fa:d2:3b:9d:c8:7b:a2:cf:
         1f:09:62:ca:9d:3d:e4:30:5e:b1:7b:d1:29:a3:96:97:16:67:
         cb:7e:57:98:9c:01:39:87:e9:e3:42:b3:96:b7:e6:38:36:c8:
         b0:ec:fd:cd:4d:6b:e6:4d:a2:a0:95:3d:b5:13:3e:71:d0:bd:
         ef:00:ed:b7:e6:73:94:cf:46:91:cc:01:a7:e6:6b:9d:6c:e6:
         1e:79:88:49:6c:16:5a:d0:2a:ed:48:aa:30:99:a0:43:01:e7:
         fd:44:1a:d5:96:da:86:c8:5d:28:1b:f4:8b:94:4b:f9:fe:9e:
         6f:f0:a2:f6:96:90:7f:4a:02:f4:22:36:fe:d2:d6:a4:81:a2:
         a2:92:0c:04:c1:e8:9c:16:ee:61:dc:ba:cc:19:ee:95:43:67:
         2b:e8:80:a7:9e:2b:bc:f5:bf:4b:06:0a:7e:1d:b6:7b:70:82:
         63:20:99:72:6b:54:28:30:93:64:15:d1:c7:f6:b5:ea:94:bc:
         fc:47:9e:f6:d4:08:cc:e1:0c:ec:08:f2:7b:16:d5:52:53:98:
         bd:a6:81:f1:ed:09:ae:15:8e:3a:94:7e:35:aa:49:ce:a9:cb:
         bb:94:a9:91:03:f1:26:6e:6c:1e:f6:af:0e:c5:cd:8f:dd:5d:
         43:2d:d2:34:23:c1:7d:14:96:50:89:f2:fb:41:14:4e:df:7a:
         fe:69:0b:ed:22:0d:e3:09:0d:14:c8:49:ee:36:0f:d8:b5:fd:
         43:6f:fd:ef:70:05:71:cf:a9:03:b7:ef:bf:1c:6c:b6:76:1c:
         23:9d:5e:42:7f:4e:07:bd:95:bb:99:e9:69:a5:78:80:c4:ed:
         fe:ed:df:d6:ae:6c:e3:01:53:87:29:a9:f1:91:ff:9d:3b:fb:
         25:e9:04:e7:30:b6:90:f6:49:f0:12:33:c2:1e:e1:c4:f3:4c:
         c1:4c:8e:a3:2d:65:1a:88:a6:81:38:5f:69:fa:a9:e8:b3:d3:
         b4:6b:fa:c2:bb:8b:52:cc:0a:92:a9:10:e6:8f:f4:69:8d:55:
         ac:7e:03:f6:95:1f:b8:a5:b9:cb:7b:62:c9:ee:e5:1e:d0:f1:
         53:9a:6f:ad:11:e6:37:5f:55:90:c2:71:06:40:74:3c:88:97:
         87:e0:7b:09:22:c6:3c:f1:99:b4:ff:ab:11:b1:81:7e:c5:cb:
         2f:25:f9:29:4b:bd:d1:83:1b:f9:e6:89:9d:97:7e:3c:e3:54:
         3d:c4:e3:e0:15:1c:f6:5d
			

Nous constatons que ce certificat contient une clef public.

7-F) Extraction de la clef publique.

openssl rsa  -in %DIRNAME%/Private/Ca.key  -pubout  -out %DIRNAME%/Private/Ca.pbc
			

Nous suffixons le fichier contenant la clef publique des trois lettres 'PBC' extraite du mot PuBliC en anglais. Voici le contenu de ce fichier :

-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0f4LWQPPRu33LiWiQQKu
kJfVfKLNPouykc90FL7CrW8ymaayW+0nj/FVrca6016a3CC2YiYq/FQabvKMwsru
o+BzmvDYNY7kNIXpPFeadQKxWTkssCVvGICeZT548W685uKjFIvBZLqP5ncNv6LZ
rFS6/vZTt9TVFuGAzNje9vBH4Ry4cqnWPbXc/pFi/UbYxdD/NbZQHZCVOVZCDeiv
YiiGlZLyutbi39CgXtqIztj5ldOvemexx5aXGybaSO811wgZMjBIliwnUmNpRAUM
WWLLSVHHpU58xTKcUTeNUnxT+MiDdOUKhr3tXrsCaT0XfMRHxnnnc33WNLXhJr9y
ac44dUZzTXf0cpmSvwBmjTNU2WJB72YnrLfhoV7U4QfTB3kFzg8/i59Qlv3WBaLn
/0+FOIhgx5gKg0blqD4+WqNNqZ8GchfzM2Yp1UYgOl8gP5Kf2Y3uTxsN9LGMF4Xd
Zoj/AEtxqZupW6VjpSYJnEwvJIIQKRn7KT2tU/lrx+ys8BDq9+BjmuAJ1KF1FIUy
388dTZO51EQdf10UYYUXQ6Rvzr1UYIMr/qoRGz0+QxGM03IBbeRVC6jmxYBVUIbN
iX95W9pPWz4kSPf7p8Gc1X9ucN/Ols3yivMM4oE1DLctKfdA7BkyU2mNn9/7L+g1
FDWknDk88d2wTGdYiJzvLZsCAwEAAQ==
-----END PUBLIC KEY-----
			

7-G) Conclusion.

Tout ce dont nous avons besoin est le fichier noté 'Ca.crt' pour, d'une part signer le certificat client et d'autre part l'introduire dans le répertoire ci-après :

SSLCACertificateFile    "${Version_Apache}/conf/Certificat/Ca/Ca.crt"
			

Dans le cas de la signature du certificat serveur, nous avons également besoin de la clef privée noté 'Ca.key'.

8) Création du certificat serveur, client et de la clef privée.

Je ne vais pas détailler à nouveau les commandes que nous venons de voir, car nous allons devoir les utilise pour créer nos certificats. Entre autre, créer un nombre pseudo-aléatoire (paragraphe 7-A) où il suffit de changer la taille de ce qui sera produit (mettez autre que chose que 1257) et créer une clef privée (paragraphe 7-B). Il faut juste renommer les fichiers en remplaçant 'Ca' par 'Server'.

8-A) Création d'une demande de signature pour certificat serveur.

openssl req  -new  -sha256  -key %DIRNAME%/Server/Server.key  -out %DIRNAME%/Server/Server.csr
  -subj "/C=FR/ST=Aquitaine/L=/O=Artemus & Cie/CN=Localhost"
			

C'est pratiquement identifique au paragraphe 7-C). Afin de faire le lien avec le certificat CA, nous mettons l'identité du CA qui est 'Artemus & Cie'. Nous précisons aussi pour quel site nous créons ce certificat. Ici, il s'agit de 'localhost'.

8-B) Création d'une demande de signature pour certificat serveur.

openssl x509  -req  -days 4383  -sha256  -in %DIRNAME%/Server/Server.csr  -CA %DIRNAME%/Cacerts/Ca.crt
  -CAkey %DIRNAME%/Private/Ca.key  -CAcreateserial  -out %DIRNAME%/Server/Server.crt
			

Nous retrouvons la demande de signature qui est le fichier 'server.csr'. Afin de faire le lien avec le certificat CA, nous indiquons le certificat CA de nom 'Ca.crt' et la clef privée de nom Ca.key'.

Je ne me suis pas trop compliqué l'existence, puisque j'ai repris la même durée que pour le certifricat CA, c'est-à-dire une période de validité de douze ans, qui correspond à une période de quatre années bisextiles, soit 4383 jours.

8-C) Création du certificat client.

openssl pkcs12  -export  -in %DIRNAME%/Server/Server.crt  -inkey %DIRNAME%/Server/Server.key
  -out %DIRNAME%/Server/Server.pfx  -clcerts  -descert  -name "Client Localhost Certificate"
			

Nous créons le certificat client à partir du certificat serveur, en effectuant une conversion au format PFX ou P12. Nous devons préciser quelques paramètres comme ci-après :

fleche"-export" permet de faire cette conversion.

fleche"-clcerts" définit qu'il s'agit d'un certificat client.

fleche"-descert" triple encryptage 'DES' du certificat afin de le rendre illisible.

fleche"-name" nous donnons un nom à ce certificat.

C'est ce certificat que nous nommons client ! PFX ou P12 sont synonymes. Il faut savoir qu'un mot de passe sera demandé lors de la création de ce certificat client. Il faudra s'en souvenir.

8-D) Visualisation du certificat client.

openssl pkcs12  -info  -passout file:./%DIRNAME%/Other/Password.txt  -in %DIRNAME%/Server/Server.pfx
			

Nous retrouvons dans la fichier 'password.txt' le mot de passe que nous avons saisi à l'étape précédent.

Cette commande est le pendant du paragraphe 7-E).

8-E) Conclusion.

Nous avons créé tous nos fichiers en les préfixant avec le mot "Server" afin de les distinguer du "Ca" qui est un certificat à part.

Voici les certificats que nous avons créé dans cette deuxième partie :

flechecertificat serveur de nom "server.crt" que nous renommons en "localhost.crt".

flecheclef privée du certificat serveur de nom "server.key" que nous renommons en "localhost.key".

flechecertificat client de nom "server.pfx". Nul besoin de changer son nom.

Nous rangeons les deux fichiers préfixés 'localhost' dans le répertoire ci-après :

SSLCertificateFile      "${Version_Apache}/conf/Certificat/Site/localhost.crt"
SSLCertificateKeyFile   "${Version_Apache}/conf/Certificat/Site/localhost.key"
			

Ne pas oublier de "relancer les services" de WampServer après avoir terminé vos modifications dans Apache, même pour l'introduction des certificats dans les répertoires ci-dessus. Normalement, la création de nos certificats est terminée.

9) Test du protocole HTTPS pour le site 'localhost'.

Pour l'instant, tout ce que nous venons de faire, c'est de créer nos certificats, et de les ranger dans les répertoires utilisés par Apache, c'est-à-dire le serveur Web.

Si dans le navigateur "Google Chrome", nous tappons dans la barre des adresses "http://localhost", vous devez accéder au site 'localhost'. C'est tout à fait normal car vous n'utilisez pas le protocole de sécurité 'https'.

Si nous tappons maintenant "https://localhost", cette fois-ci, Google Chrome vous indique le message d'erreur suivant : "Erreur de connexion SSL". C'est tout à fait normal car vous demandez d'accéder à un site sécurisé sans que le certificat client soit reconnu sur votre ordinateur.

Si nous faisons le même test avec le navigateur "Mozilla Firefox", nous avons le même problème mais avec un autre message :


message d'erreur Mozilla Firefox

Pour résoudre ce problème, nous devons appliquer le rangement du certificat 'CA' selon le navigateur.

9-A) Le navigateur "Google Chrome".

Ce navigateur, comme "Opera" ou Microsoft Internet Explorer" ou encore "Safari" utilise les magasins des certificats de Windows pour vérifier les autorisations. Pour accéder à l'utilitaire de Windows qui gère ces magasins, vous devez dans l'invite de commandes, tapez la ligne suivante :

certmgr.msc
			

Un magasin en particulier nous intéresse :

flecheAutorités de certification racines de confiance / certificats.

Nous allons détailler comment ranger notre certificat.

9-A-1) Le magasin "Autorités de certification racines de confiance".

Nous allons ranger le certificat 'CA', qui se trouve dans le répertoire "/Certificats/Cacerts" sous le nom de "Ca.crt" dans le magasin "Autorités de certification racines de confiance". Il suffit de cliquer avec le bouton droite de la souris sur ce certificat et cliquer sur "installer le certificat".

On coche "placer tous les certificats dans le magasin suivant". Et ce magasin est "autorités de certification racines de confiance", et on valide. Une deuxième validation vous sera demandé, genre avertissement, en précisant les caractéristiques de ce certificat Ca, comme ci-après :


Avertissement certificat CA

Si vous refaites le même test avec le navigateur "Google Chrome", on vous demande de sélectionner le certificat client et cette fois-çi, vous obtenez le cadenas vert ! Ca y est, vous avez un site sécurisé.

9-B) Le navigateur "Mozilla Firefox".

Après voir fait le rangement des certificats dans les magasins de Windows, nous faisons le même test avec le navigateur "Mozilla Firefox" et nous obtenons le message d'anomalie déjà signalé.

Pourquoi avons-nous ce message ? Qu'est-ce que nous avons oublié de faire ?

Il faut savoir que "Mozilla Firefox" n'utilise pas les magasins de windows mais a ses propres magasins, que l'on trouve en tapant dans le navigateur sur l'onglet "outils", puis "options", sur "avancé" et enfin sur l'onglet "certificats". Nous cliquons maintenant sur "afficher les certificats".

9-B-1) Le magasin "autorités".

Comme au paragraphe 9-A-1), pour importer le certificat 'CA', nous devons cliquer sur le bouton "importer" qui se trouve en bas de la page.

Une demande de renseignement vous est demandé comme ci-après :


Information complémentaire

Nous cochons les trois cases, puisque nous sommes en test local sur notre ordinateur.

Nous faisons le test et cette fois-ci, nous avons la confirmation de la sélection du certificat, comme dans le cas de "Google Chrome", comme ci-après :


Demande de confirmation

Nous acceptons, et nous avons l'accès à notre site "localhost" sécurisé.

À la différence de "Google Chrome", nous pouvons ne plus obtenir cette confirmation, en venant dans le paragraphe "lorsqu'un serveur demande mon certificat personnel :", on coche alors sur la case "en sélectionner un automatiquement".

9-C) Nécessité d'avoir le certificat client et le certificat Ca.

Nous avons réussi à obtenir un accès avec le protocole "https à notre site "localhost" d'une manière sécurisé sur le navigateur "Google Chrome " et sur Mozilla Firefox". C'était le but recherché de ce didacticiel.

Pour obtenir un bon fonctionnement, nous avons besoin de nos deux certificats, et surtout que ceux-ci puisse être vu d'une manière hiérarchisée, comme ci-après :


Lien entre certificats

C'est ce lien qui permet la reconnaissance et la validation du certificat client vis-à-vis du certificat d'authorité (CA). Sans cela, notre certificat client ne serait pas valide.

Pour nos tests, il existe une autre solution, qui consiste à faire de nos deux certificats, un seul qui sera à la fois signé et d'authentification et que l'on nomme auto-signé.

9-D) Nécessité d'avoir un certificat officiel.

Depuis quelque temps, il est possible d'avoir un certificat de nom Let's Encrypt, qui est gratuit. Oui, vous avez bien lu, il est gratuit.

Ca durée de vie n'excède pas les trois mois, et une alerte au bout de 60 jours, vous demande de le renouveller.

L'avantage de ce certificat SSL Ca est qu'il se trouve sur tous les ordinateurs du monde sous le nom de Let's Encrypt Autority X3, dans le magasin des certificats intermédiaire.

10) Les outils qui m'ont permis de faire ce test.

Afin de faire ce didacticiel, je mets à votre disposition les fichiers qui m'ont servi à créer less certificats. Vous pouvez modifier ces fichiers afin de créer les votre.

flecheopenssl.cnf

flechelancer.bat

De même, je vous donne aussi le descriptif à installer dans le fichier 'httpd.conf', à savoir celui du paragraphe 4-B) et celui du 4-C).

flecheconfiguration du protocole SSL

flecheconfiguration du site 'Localhost'

11) Conclusion.

Ce didacticiel est un peu plus complet que ceux trouvés sur le net car fréquemment, on n'aborde que la question de la création des certificats sans parler ni du paramétrage, ou très peu, ni du fichier 'httpd.conf', ni où ranger ces certificats dans votre environnement.

Pour un usage local, ce didacticiel répond à toutes vos demandes d'un site sécurisé. Comme nous venons de le voir, on peut créer nos propres certificats.

Mais si maintenant, vous avez besoin de rendre accessible votre site depuis internet, vous aurez besoin d'un certificat officiel de nom Let's Encrypt.

Si vous avez des réponses à mes questions, vous pouvez me joindre par l'onglet contact afin de venir compléter ce didacticiel.