Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/12/2019, à 00:04

trucky

apache2-openssl-chrome

Bonjour à tous.
juste un petit descriptif de ce que je veux faire
une CA -> CA intermédiaire -> serveur
Tous ça pour mon serveur localhost (qui redirige vers le port 80 et 443 de ma vm).
Mon serveur est dans une VM (c'est un lamp classique avec juste la page apache2 par défaut). Il faut bien commencer quelque part pour jouer avec les certificats.
J'ai pas mal chercher sur le net et je ne trouve rien de vraiment explicite comme tuto surtout avec openssl.
D’ailleurs si vous voulez le prendre pour faire un tuto pas de problème ^^

Voici donc rapidement ma procédure :

cd ~
mkdir -p root_ca/{certs,crl,newcerts,private}
mkdir -p core_ca/{certs,crl,newcerts,private}
mkdir -p srv/
mkdir -p /etc/ssl/certs/localhost/
touch root_ca/index.txt
touch core_ca/index.txt
touch root_ca/serial
touch core_ca/serial
touch openssl.cnf

Mon fichier openssl.cnf

openssl_conf = default_conf
[ ca ]
# autorité de certification par défaut.
default_ca      = root_ca

#l'autorité de certification racine (root) valable 10 ans
[ root_ca ]
dir             = root_ca
certs           = $dir/certs
new_certs_dir   = $dir/newcerts
database        = $dir/index.txt
certificate     = $dir/root_ca.pem
serial          = $dir/serial
private_key     = $dir/private/root_ca.key
default_days    = 3650
default_md      = sha256
preserve        = no
policy          = policy_match

#l'autorité de certification intermédiaire valable 10 ans
[ core_ca ]
dir             = core_ca
certs           = $dir/certs  
new_certs_dir   = $dir/newcerts
database        = $dir/index.txt
certificate     = $dir/core_ca.pem 
serial          = $dir/serial
private_key     = $dir/private/core_ca.key
default_days    = 3650
default_md      = sha256
preserve        = no  
policy          = policy_match

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

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

[ req ]
default_bits            = 4096
default_md 				= sha512
distinguished_name      = req_distinguished_name
string_mask 			= utf8only
prompt 				= no

[ req_distinguished_name ]
commonName 		= localhost
countryName 			= FR
stateOrProvinceName 	= Île-de-France
localityName 			= Paris # il faut bien mettre un truc
organizationName 		= localhost group
organizationalUnitName 	= localhost
emailAddress 			= root@localhost

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

[ default_conf ]
ssl_conf = ssl_sect

[ ssl_sect ]
system_default = system_default_sect

[ system_default_sect ]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=2

[ ROOT_CA ]
nsComment                       = "ROOT LOCALHOST CA"
subjectKeyIdentifier            = hash
authorityKeyIdentifier          = keyid,issuer:always
basicConstraints                = critical,CA:TRUE,pathlen:1
keyUsage                        = keyCertSign, cRLSign

[ CORE_CA ]
nsComment                       = "SSL LOCALHOST CA"
basicConstraints                = critical,CA:TRUE,pathlen:0
subjectKeyIdentifier            = hash
authorityKeyIdentifier          = keyid,issuer:always
issuerAltName                   = issuer:copy
keyUsage                        = keyCertSign, cRLSign
nsCertType                      = sslCA

[ SERVER_SSL ]
nsComment                       = "SSL Server Certificate"
subjectKeyIdentifier            = hash
authorityKeyIdentifier          = keyid,issuer:always
issuerAltName                   = issuer:copy
subjectAltName                  = DNS:localhost, DNS:www.localhost #obligatoire pour chrome
basicConstraints                = critical,CA:FALSE
keyUsage                        = critical, digitalSignature, nonRepudiation, keyEncipherment
nsCertType                      = server
extendedKeyUsage                = serverAuth


Et donc voici mes différentes commande:

Création de l'autorité root

cd root_ca
openssl req -x509 -config ../openssl.cnf -newkey rsa:8192 -sha256 -extensions ROOT_CA -days 3650 -keyout private/root_ca.key -out root_ca.pem

initialiser le serial par un nombre aléatoire

openssl x509 -serial -noout -in root_ca.pem | cut -d= -f2 > serial

Création de l'autorité intermédiaire

cd ../core_ca
openssl req -config ../openssl.cnf -newkey rsa:8192 -sha256 -extensions CORE_CA -days 3650 -keyout private/core_ca.key -out core_ca.req

Signer le certificat en utilisant la CA

openssl ca -config ../openssl.cnf -extensions CORE_CA -in core_ca.req -out core_ca.pem

On génère le serial de core_ca

openssl x509 -serial -noout -in core_ca.pem | cut -d= -f2 > serial

Générer un certificat

serveur

Générer la clé privé et la demande de certificat
(-nodes pour ne pas avoir de mot de passe à renseigner au redémarrage du pc)

cd ../srv/
openssl req -nodes -newkey rsa:4096 -sha256 -keyout cle-privee.key -out cle-publique.req -config ../openssl.cnf

Puis on signe le certificat.

openssl ca -name core_ca -extensions SERVER_SSL -in cle-publique.req -out certificat.pem -config ../openssl.cnf

Il est préférable de

 déplacer le certificat

dans le dossier en root de apache2

cp certificat.pem cle-privee.key cle-publique.req /etc/apache2/ssl/
chown -R root:root /etc/apache2/ssl/
chmod -R 600 /etc/apache2/ssl/

créer un fichier contenant la chaine de certification (on est dans le répertoire srv en root)

cat ../core_ca/core_ca.pem ../root_ca/root_ca.pem  > /etc/apache2/ssl/ca_chain.pem

Ensuite c'est de la conf apache mais je le met ici :

<IfModule mod_ssl.c>
        <VirtualHost *:443>
                ServerAdmin root@localhost
                ServerName localhost
                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/ssl-error.log
                CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined
                SSLEngine on
                SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
                SSLCertificateChainFile /etc/apache2/ssl/ca_chain.pem
                SSLCertificateFile      /etc/apache2/ssl/certificat.pem
                SSLCertificateKeyFile   /etc/apache2/ssl/cle-privee.key
                SSLCipherSuite !EDH:!RC4:!ADH:!DSS:HIGH:+AES128:+AES256-SHA256:+AES128-SHA256:+SHA:!3DES:!$
                SSLProtocol all  -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
				Protocols h2 http/1.1
                SSLHonorCipherOrder on
                Header always set Strict-Transport-Security "max-age=15768000"
                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>

        </VirtualHost>
</IfModule>

Et là biensûr c'est le drame lol
mon

apachectl configtest

fonctionne bien
par contre au redémarrage il aime pas
et voici l'erreur de log

 [ssl:emerg] [pid 1198:tid 139831731466304] AH02565: Certificate and private key localhost:443:0 from /etc/apache2/ssl/certificat.pem and /etc/apache2/ssl/cle-privee.key do not match

Pourtant je ne vois pas trop ou j'ai fait une erreur.
Si une âme veux bien regarder.
Et si vous avez d'autre recommandation au niveau de la conf apache pour améliorer la sécrité
Merci par avance

Hors ligne

#2 Le 03/12/2019, à 10:23

bruno

Re : apache2-openssl-chrome

Bonjour,

Je n'ai pas regardé en détail mais :
- SSLCertificateChainFile est une directive obsolète. Toute la chaîne de certificats doit se trouver dans un seul fichier.
- le message d'erreur est explicite : la clé privée ne correspond pas au certificat, donc à vérifier avec les commandes ssl.

Après, si ce n'est dans un but d'apprentissage, je ne vois pas l’intérêt de telle complications par rapport à un certificat auto-signé, ni le rapport avec chrome.

Hors ligne

#3 Le 03/12/2019, à 13:47

trucky

Re : apache2-openssl-chrome

Et bien déjà, merci pour la réponse.

Je ne savais pas pour la directive SSLCertificateChainFile. Merci
Si elle est dépréciée, je dois tout concaténer dans un seul fichier avec et la mettre en paramètre de la directive SSLCertificateFile ?

cat core_ca/core_ca.pem root_ca/root_ca.pem  srv/certificat.pem > /etc/apache2/ssl/chaine.pem

Ensuite, mon problème avec chrome c'est que j'ai une erreur de certificat (sans trop d'explication même en regardant dans le tab sécurité de la console) et je n'ai rien de particulier avec firefox. (https://localhost fonctionne)
Sous firefox, j'importe mon certificat et tout marche, mais sous chrome nop.

Sous chrome la première erreur que j'avais était avec subjectAltName que je n'avais pas inclus dans le certificat de mon serveur.

Je viens de voir que la directive nsComment est dépréciée aussi.
Je modifierais mon premier post en conséquence.

Ensuite, pour un certificat auto-signé, je ne sais pas. Je voulais avoir une hiérarchie comme dans la vraie vie.

Hors ligne

#4 Le 03/12/2019, à 15:21

bruno

Re : apache2-openssl-chrome

Si elle est dépréciée,

obsolète pas dépréciée.

Encore une fois il faut commencer par vérifier que ton certificat et ta clef privée correspondent :

openssl x509 -noout -modulus -in certifaicat.pem | openssl md5
openssl rsa -noout -modulus -in cle_privee.key | openssl md5

Sinon, cela n'a effectivement qu'un intérêt purement didactique, surtout pour chiffrier une connexion vers localhost…

Hors ligne