Pages : 1
#1 Le 01/12/2019, à 23: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, à 09: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.
#3 Le 03/12/2019, à 12: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, à 14: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…
Pages : 1