Créer un certificat SSL autosigné pour le développement en local

Pour le local on peut utiliser un certificat dit auto-signé, ou self-signed, c'est à dire sans certification d'une autorité compétente (let's encrypt ou gandi par exemple).
Un certificat auto-signé déclenche une alerte dans la plupart des navigateurs, ce qui est évidement pas recommandé pour de la production, mais cela suffira très bien en local.

 Génération du certificat

Créer un dossier certs dans /etc/nginx/ puis entrer dans le dossier certs
Créer un fichier texte qui contiendra la phrase de passe (pour copie-coller) qui sera demandé lors de la génération.
Attention : dans un environnement de production, ces éléments doivent être gardés très précieusement et à l'abri des curieux.

Ensuite ouvrez un terminal et lancez la commande suivante qui va générer la clé qui permettra de signer le certificat :
openssl genrsa -des3 -out server.key 1024

Génération du fichier csr (Cerficat Signing Request)
openssl req -new -key server.key -out server.csr

Vous devrez renseigner votre passphrase ainsi que différents éléments (pays, nom...) vous pouvez laisser l'ensemble vide.

Maintenant nous allons supprimer la passphrase de la clé afin qu'apache ne nous la demande pas à chaque fois qu'il démarre :
//Création d'un backup
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
La passphrase vous sera demandée une dernière fois.

Enfin, génération du certificat :
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

C'est terminé ! Voila ce que devrait maintenant contenir votre dossier certs :
passphrase.txt (Mon mot de passe)
server.crt (le certificat géneré)
server.csr ( la demande de signature de certificat)
server.key ( a clé qui permettra de signer le certificat)
server.key.org (Sauvegarde )

Configuration avec CentOS et Tomee:

vim /etc/nginx/conf.d/tomee.conf
ssl on;
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;

Vérifier avec la commande : nginx -t

Relancer tomee et nginx
systemctl stop tomme.service
systemctl stop nginx.service
systemctl start tomme.service
systemctl start nginx.service

Configuration avec Apache 2

Maintenant il faut modifier votre virtual host, (ici avec apache2) :

Je laisse volontairement l'accès sans https activé. Les chemins sont à adapter en fonction de votre configuration.

<VirtualHost *:80>
	ServerName monsite.dev
	ErrorLog /media/vhosts/monsite.com/logs/error.log
	CustomLog /media/vhosts/monsite.com/logs/access.log common
	#PHPINIDir /media/vhosts/monsite.com/conf
	DocumentRoot "/media/vhosts/monsite.com/www/"
	<directory /media/vhosts/monsite.com/www/>
		Options -Indexes +FollowSymLinks +MultiViews
		AllowOverride All
		Require all granted
	</Directory>
</VirtualHost>


<virtualhost *:443>
  ServerName monsite.dev
  ServerAlias *.monsite.dev
  DocumentRoot "/media/vhosts/monsite.com/www/"
  ErrorLog /media/vhosts/monsite.com/logs/error.log
  CustomLog /media/vhosts/monsite.com/logs/access.log common
  # Activation du mode SSL
  SSLEngine On
  SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire

  SSLCertificateFile "/media/vhosts/monsite.com/certs/server.crt"
  SSLCertificateKeyFile "/media/vhosts/monsite.com/certs/server.key"

  <directory /media/vhosts/monsite.com/www/>
    Options -Indexes +FollowSymLinks +MultiViews
    AllowOverride All
    Require all granted
  </Directory>
</virtualhost>

Les lignes importantes sont les suivantes :

SSLEngine On
  SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire

  SSLCertificateFile "/media/vhosts/monsite.com/certs/server.crt"
  SSLCertificateKeyFile "/media/vhosts/monsite.com/certs/server.key"

Pensez à activer le module SLL d'apache 2 :

sudo a2enmod ssl

et enfin relancez apache2 :

sudo service apache2 restart

 
Génération du certificat autosigné:

cd /etc/nginx
mkdir /etc/nginx/certs
cd certs/

vim /etc/nginx/certs/pass
Ouvrir un e autre console ssh:
cd /etc/nginx/certs/
openssl genrsa -des3 -out server.key 2048 (copie-collé de la paraphrase)
openssl req -new -key server.key -out server.csr (copie-collé de la paraphrase insi que différents éléments (pays, nom...)
!! Très important :
Common Name (eg, your name or your server's hostname) []: Nom de la machine (nom dns complet) exemple : agabfs.bibliomondo.fr

vous pouvez laisser le reste vide.)
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key (copie-collé de la paraphrase)
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
cp server.crt server.key /etc/nginx/ssl/
vim /etc/nginx/conf.d/tomee.conf

#ssl on; (:commantai ssl on cars dèja défini plus haut dans le fichier tomee.conf)
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
nginx -t (pour vérifer)

Vérification de la validité d’un certificat SSL

openssl x509 -in certificat.rsa.crt -text | grep Not

Pour voir le domaine concerné par le certificat 

openssl x509 -in certificat.crt -text | grep DNS

Vérifier le hash

openssl x509 -noout -modulus -in certificat.crt |
openssl md5 && openssl rsa -noout -modulus -in certificat.key | openssl md5

Vérifier un certificat :

openssl x509 -in certificat.crt -text -noout

Vérifier une clé privée 

Tester si tout fonctionne 

openssl s_client -connect www.exemple.com:443

NANTES:
Le certificat est en place, pour ton info j'ai fait un lien symbolique de leur certificat dans le dossier nginx/ssl:


ln -s /etc/local/tls/certs/mondo-pp.nantesmetropole.fr+chaine.pem /etc/nginx/ssl/mondo-pp.nantesmetropole.fr.pem
ln -s /etc/local/tls/private/mondo-pp.nantesmetropole.fr.key.pem /etc/nginx/ssl/mondo-pp.nantesmetropole.fr.key

Ensuite j'ai modifier les 2 lignes suivantes pour que nginx utilise les nouveaux certificats:


ssl_certificate /etc/nginx/ssl/mondo-pp.nantesmetropole.fr.pem;
ssl_certificate_key /etc/nginx/ssl/mondo-pp.nantesmetropole.fr.key;

A