IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Apache Discussion :

Connexion SSL avec certificat auto-signé


Sujet :

Apache

  1. #1
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut Connexion SSL avec certificat auto-signé
    Bonjour,


    Je cherche depuis des jours (c'est ça d'être noob..) la solution au problème suivant et je me permets donc de solliciter votre aide :

    1- Le problème
    Le basculement de la connexion http en https ne s'effectue plus depuis la création/utilisation d'un certificat auto-signé. Le(s) navigateur(s) testés me renvoient invariablement un "Problem Loading page / Unable to connect"
    Firebug m'informe que la requete "GET https://www.mon_domaine.fr/index.php?page=100&new_session=a4da9106dba2ffd40345a5eb624d7788" est avortée.

    2- Qu'ai-je pu faire comme boulette(s) entre le moment où ça fonctionnait et maintenant ?
    Hum de nombreuses possibilités certainement mais entre autres :

    - Modif des accès réseau (Firewall),
    - Création d'un certificat auto-signé,
    - Basculement php.ini en config de développement pour essayer d'y voir plus clair,
    - Modification de la config Apache (vhost avec les nouveaux certificats ssl),
    - Relance d'Apache bien sûr.

    3- Les symptômes et indications des logs
    Bah je n'y vois pas grand chose mais en même temps, je n'y comprends rien..

    ssl_request.log
    pas de requête de log ssl depuis les petites modifs ... et ça, c'est super étonnant.

    Nota:
    Ce log est obtenu par la directive suivante placé dans le vhost:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CustomLog "/mnt/HDA_ROOT/.config/apache/logs/ssl_request.log" \
    		"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r \" %b"
    access.log
    Il n'y a que des retours "200" sur les requêtes HTTP, rien sur HTTPS

    error.log
    J'ai juste ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Tue Jun 22 14:03:06 2010] [debug] mod_headers.c(665): headers: ap_headers_output_filter()
    4- Recherche des causes :

    41- Est ce mon navigateur qui avait déjà un certificat de classe 1 pour mon domaine, qui serait "perdu" ..?
    => a priori non, j'ai supprimé ces certif et j'ai aussi essayé avec un autre navigateur et PC qui n'avaient pas ce certificat, mais les symptômes restent les mêmes.

    42- Le port 443 serait-il bloqué pour la machine d'accès à mon domaine ..?
    Non. Cette machine est autorisée sur les ports 80 et 443 nattés vers ma machine d'hébergement. L'accès en http sur le port 80 s'effectue correctement.

    43- Serait-ce Apache qui n'écouterait pas le port 443 ?
    Si, la configuration du vhost concerné écoute bien ce port, comme auparavant. Pas de changement ici.

    44- ma clé privée ne serait-elle pas accordée avec le certificat auto-signé ?
    La création du certificat crt auto-signé avec la clé privée me renvoie un Signature ok
    La vérification par openssl x509 -noout -text -in $SERVER_NAME".crt" ne me parle pas vraiment mais je peux la poster le cas échéant..

    5- Info: shell de création des clés privées et du certificat crt (voir à partir du step1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    #!/bin/sh
     
    # OBJECTIVE: to install a ssh key for connecting via SSL to the webserver
    # USE: my_rsa_install.sh <OPTION=0 for CA, OPTION=1 for self generated certificate>
    # example of use: my_rsa_install.sh 0
    # Nota: do not forget to chmod 700 this shell
    # WHAT IT DOES : See each block comments
    # Doc-Info: http://slacksite.com/apache/certificate.php
    # Written by hornetbzz 20/06/2010
     
    # OPTIONS
    	# OPTION=0 => certificate to be validated by a CA
    	# OPTION=1 => Self-validated certificate 
    	# Defaults value
    	[[ -z $1 ]] && SELFVALIDATED=1
     
    # INIT: pls do not change these datas
    	SEP="_"
     
    # DATAS to be tuned according to my specific needs
     
    	# Self validated certificate validity period (days)
    	SELF_VALID_PERIOD=365
     
    	# can be 1024; 2048, 4096	
    	ENCODING=1024
     
    	# Dir name and files
    	PWD_FILE=/tmp/gen_passwd
    	DESTINATION_FOLDER=/...../certif_ssl
    	SSL_CFG=/....../openssl.cnf
    	SERVER_NAME="server"
    	BACKUP=$DESTINATION_FOLDER/old
     
    # PREREQUISITES: if these tools are not install, you shall call this function below
    # how to check if these packages are already installed : ipkg list_installed | grep package_to_check
    function check_ipkg()
    {
    ...
    }
     
    # PROMPT "PROCEED FURTHER
    # call : proceed_further $msg
    function proceed_further()
    {
    ...
    }
     
     
    # Prerequisite required packages: uncomment the line below if you need to install the required packages
    	#check_ipkg 1
     
    # Check that ssl config file exists
    ...
     
    # Create cfg folder if not exists
    ...
     
    # Incremental backup of previous certs files
    ...
     
    # Generate a pwd file (ideally build several different files. But here, we'll just use the same file twice)
    	echo "1) Removing old tmp pwd file if existing..."
    	[[ -f $PWD_FILE ]] && rm $PWD_FILE
    	i="1 2 3 4 5"
    	for n in $i
    	do
    		pwgen -c -n -y >> $PWD_FILE
    	done
     
    	# remove the EOL using "while" and build a one-line pwd
    	echo "2) Generating tmp pwd ..."
    	while read i; do foo=$foo`echo -e $i`; done < $PWD_FILE
    	echo $foo > $PWD_FILE
     
     
    # Generate the private key on choice : 1024 to 4096 bits (ie highest possible but depends on your certificate provider requirements)
    	echo "3) Generating rsa key ..."
    	openssl genrsa -des3 -rand $PWD_FILE:$PWD_FILE -out $SERVER_NAME".key" $ENCODING
    	[[ -f $PWD_FILE ]] && rm $PWD_FILE
     
    # Remove passphrase from the private key
    	echo "4) Removing passphrase from private key ..."
    	openssl rsa -in $SERVER_NAME".key" -out $SERVER_NAME".pem" 
     
    # Generate a CSR file (certificate signing request) to an approved CA
    	echo "5) Generating csr file ..."
    	openssl req -new -key $SERVER_NAME".key" -out $SERVER_NAME".csr" -config $SSL_CFG
    	# alternative 1: openssl req -new -key $SERVER_NAME".pem" -out $SERVER_NAME".csr" -config $SSL_CFG
    	# alternative 2:openssl req -new -key $SERVER_NAME".key" -out $SERVER_NAME".csr"
     
    # ALERT
    	echo "6) WARNING: at this stage, pls WRITE DOWN all entered datas and I'd advice you to print a screen shot (ALT ou SHIFT or CTRL+PRINT SCRN)"
    	proceed_further "Ready to proceed further (Y/n)"
     
    # ASK for CRT file to a CA
    	echo "7) At this stage you've generated 3 files"
    	/opt/bin/find -amin -5 -name $SERVER_NAME".*" 2>/dev/null -exec ls -lsth {} \;
    	[[ $? -eq 1 ]] && echo -e "you shall install better findutils :-) \n" && ls -ltsh $DESTINATION_FOLDER
     
    	if [ $SELFVALIDATED -eq 0 ]
    	then
    		echo "8) Option "$SELFVALIDATED" choosen : CA validated certificate"
    		echo -e "\nYou shall now go to your favorite certificate provider (CA) and get back a crt file with the csr file we've just generated"
    		echo "CA providers example: thawte, verisign, startssl, godaddy ..."
    		echo "Once you've got back the crt file, pls copy the file to your NAS to "$DESTINATION_FOLDER
    	else
    		# Or 2nd option: Generating a Self-Signed Certificate
    		echo "8) Option "$SELFVALIDATED" choosen : self validated certificate"
    [[ $SELFVALIDATED -eq 1 ]] && openssl x509 -req -days $SELF_VALID_PERIOD -in $SERVER_NAME".csr" -signkey $SERVER_NAME".key" -out  $SERVER_NAME".crt"
     
    	fi
     
    # Check the received certificate
    	echo "Checking certif validity"
    	openssl x509 -noout -text -in $SERVER_NAME".crt"
    	[[ $? -eq 1 ]] && echo "Warning: certif crt issue" && exit
     
    # APACHE DIRECTIVES & VHOST DEFINITION
    	SSL_DIRECTIVES="AddType application/x-x509-ca-cert .crt \
    	SSLPassPhraseDialog builtin \n
    	SSLMutex default \n"
     
    	VHOST="SSLRequireSSL\n
    	SSLEngine on\n
    	SSLProtocol all -SSLv2 \n
    	SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM \n
    	SSLSessionCache dbm:/etc/config/apache/logs/ssl_gcache_data \n
    	SSLSessionCache shm:/etc/config/apache/logs/ssl_gcache_data(512000) \n
    	SSLCertificateFile /mnt/HDA_ROOT/.config/apache/certif_ssl/ssl.crt\n
    	SSLCertificateKeyFile /mnt/HDA_ROOT/.config/apache/certif_ssl/ssl.key\n"
     
    	echo "9) copy & paste this to your vhost or ssl config file"
    	echo -e $SSL_DIRECTIVES"\n"
    	echo -e $VHOST"\n"
    	proceed_further "Have you copied (Shift+CTRL+C) these directives into your httpd-ssl.conf file (Y/n)"
     
    # Restart Apache
    	echo "10) Restarting Apache"
    	/etc/init.d/Qthttpd.sh restart
    6- Les questions auxquelles je n'arrive pas à répondre clairement :
    Et évidemment pour lesquelles j'ai cherché dans les forums .

    61- Faut il utiliser la clé privée sans passphrase (.pem)pour générer le certificat auto-signé ?

    62- Faut-il aussi inclure la clé server.pem dans la config du vhost Apache ?

    63- Faut il supprimer la directive SSLPassPhraseDialog builtin de la config Apache ?

    64- Euh Arghhh , je disjoncte, comment faire ..??

    Voila... et merci d'avance

  2. #2
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    C'est un peu long, je n'ai pas tout lu

    Citation Envoyé par hornetbzz Voir le message
    Le basculement de la connexion http en https ne s'effectue plus depuis la création/utilisation d'un certificat auto-signé. Le(s) navigateur(s) testés me renvoient invariablement un "Problem Loading page / Unable to connect"
    Firebug m'informe que la requete "GET https://www.mon_domaine.fr/index.php?page=100&new_session=a4da9106dba2ffd40345a5eb624d7788" est avortée.
    Comment est faite la redirection HTTP -> HTTPS ? Tu peux envoyer la même trace mais prise avec LiveHttpHeaders ?

  3. #3
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    La redirection en https n'est pas réalisée sous Apache, en tous cas pas dans ce cas, mais par un header en php (qui ne renvoie pas un header par dessus un autre). La fonction marchait très bien avec l'ancien certificat donc je ne pense pas que ça soit le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $redirection = "Location: ../index.php?page=100&new_session=".sha1($hash);
    header($redirection);
    exit;
    En fait, tout se passe comme si le "/etc/hosts" était incorrect.
    Je n'ai pas encore installé LiveHttpHeaders sur cette machine de test: ça vient au prochain msg.

    NETSTAT
    Je viens de m'apercevoir que le "Listen 443" d'apache n'apparait pas dans le netstat si je le laisse dans la config httpd-ssl.conf, par contre l'écoute du port 443 apparait dans le cas où je place la directive d'entrée dans le httpd.conf. Mais bon, même résultat final.
    Pour info
    netstat -na | egrep ':443 .* LISTEN|:80 .* LISTEN'
    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
    tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
    TELNET: si je teste la connexion en ligne de commande directement sur la machine hébergeant le serveur :
    => Ok, ça me renvoie bien la page d'index

    Redéfinition de la clé et du certificat auto-signé:
    Ah il y a du mieux si je relance une clé auto-signée selon la doc d'Apache (ici) et que je vérifie ce que ça donne :
    openssl s_client -connect 127.0.0.1:443 -state -debug
    CONNECTED(00000003)
    SSL_connect:before/connect initialization
    write to 0x80c6d38 [0x80c7440] (127 bytes => 127 (0x7F))
    0000 - 80 7d 01 03 01 00 54 00-00 00 20 00 00 39 00 00 .}....T... ..9..
    ....
    0070 - 09 42 40 1a 53 ec ca 13-aa c2 76 a5 86 07 04 .B@.S.....v....
    SSL_connect:SSLv2/v3 write client hello A
    read from 0x80c6d38 [0x80cc9a0] (7 bytes => 7 (0x7))
    0000 - 0a 0a 3c 21 44 4f 43 ..<!DOC
    SSL_connect:error in SSLv2/v3 read server hello A
    28443:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:607:
    Il reste encore une erreur. J'ai la même si je teste la même connexion depuis une autre machine vers le serveur.

  4. #4
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    HEADERS
    En un sens, il y a du mieux, car au moins, le navigateur me renvoie qq chose maintenant :
    An error occurred during a connection to www.mon_domaain.fr:443.
    SSL received a record with an unknown content type.
    (Error code: ssl_error_rx_unknown_record_type)
    Par contre, LiveHttpHeaders ne me renvoie rien du tout...

    CERTIFICAT
    Mais il reste cette erreur :
    openssl verify server.crt
    server.crt: /C=FR/ST=ma_city/L=mon_quartier/O=ma_boite/OU=ma_fonction/CN=www.mon_domaine.fr/emailAddress=foo@bar.com
    error 18 at 0 depth lookup:self signed certificate
    OK

  5. #5
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    LiveHttpHeaders ne t'affiche rien car la connexion SSL avec le serveur ne peut pas s'établir : le navigateur ne peut pas envoyer de requête car il ne peut pas se connecter au serveur.

    Ce qu'il doit se passer c'est que le port 443 est certes ouvert mais c'est du HTTP, pas du HTTPS qui transite dessus car il manque la configuration SSL. Ce qu'il faut c'est retirer le Listen 443 du fichier httpd.conf, le laisser dans httpd-ssl.conf et faire un include de httpd-ssl.conf dans httpd.conf. C'est ce qui doit manquer et qui fait que quand la directive Listen est dans ce fichier Apache n'écoute pas sur le port 443. Après l'ajoute du include, redémarre Apache, vérifie avec netstat comme tu as fait que le port 443 est bien ouvert en écoute et teste. Si ça ne marche toujours pas, vérifie la configuration du fichier httpd-ssl.conf, notamment que les chemins vers les fichiers générés par openssl pour le certificat auto-signé sont corrects. S'il y a toujours des problèmes, envoie-nous le contenu de ce fichier httpd-ssl.conf, le message d'erreur affiché par Firefox et le contenu de error_log.

  6. #6
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    [EDIT]: croisement avec ton message MAC, merci et bien vu !

    Comme d'habitude, une erreur idiote :

    J'avais commenté la ligne d'inclusion du vhost https dans httpd.conf ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Include /mon/chemin/vers/httpd-ssl_light.conf
    Tout de suite, ça marche mieux !


    Bon quand même, je résume car j'imagine que ça peut servir aussi à d'autres :

    # Se positionner dans le répertoire cible de ses certificats

    # créer la clé privée (attention: clé privée max 1024 bits pour un certificat auto-signé)
    openssl genrsa -des3 -out server.key 1024

    # vérifier sa clé
    openssl rsa -noout -text -in server.key

    # créer le certificat auto-signé
    openssl req -new -x509 -nodes -sha1 -days 365 -key server.key -out server.crt

    # supprimer la pass phrase de la clé privée (pour les tests)
    openssl rsa -in server.key -out server.pem

    # Configurer et relancer Apache
    # notamment j'ai utilisé la clé sans passphrase, pas recommandé en production
    # dans le vhost (qui écoute le port 443 :-)
    SSLCertificateFile /vers/mes/certs_ssl/server.crt
    SSLCertificateKeyFile /vers/mes/certs_ssl/server.pem

    # vérifier la connexion ssl
    openssl s_client -connect 127.0.0.1:443 -state -debug

    # Voila, c'est prêt, à table :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/11/2013, 17h35
  2. Réponses: 1
    Dernier message: 16/05/2010, 11h12
  3. Connexion SSL avec composants INDY
    Par Tenguryu dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/11/2009, 09h41
  4. Réponses: 1
    Dernier message: 26/08/2009, 21h12
  5. Prism et https avec certificat auto signé
    Par wodel dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 23/03/2008, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo