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