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

C# Discussion :

problème de verification de validité d'un SLL avec un timer


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 20
    Par défaut problème de verification de validité d'un SLL avec un timer
    Bonjour,

    Voilà mon problème : je souhaite vérifier un certificat SSL toutes les 2h, mon code pour vérifier le SSL fonctionne, le timer aussi, MAIS lorsque je fait tourner le programme, le timer se lance, la verif se fait une première fois, puis une seconde fois, mais ensuite celui-ci tourne dans le vent sans checker le SSL.

    De plus, si le certificat n'est pas bon, j'obtiens bien le resultat attendu.

    Voici mon code pour plus de précision :

    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
    public static void Main(string[] args)
    		{
                            //CREATION DE MON TIMER
    			TimerCallback callback = new TimerCallback(Tick);		
    		  	Console.WriteLine("\n Creating timer: {0} \n", DateTime.Now.ToString("h:mm:ss"));
    		  	Timer stateTimer = new Timer(callback, null, 0, 5000); //--> ici toutes les 5 secondes pour les testes
     
     
    			Console.ReadKey(true);
    		}
     
    		static public void Tick(Object stateInfo)
    		{
                            Console.WriteLine("appel de la fonction SSL . . .\n");
    			ssl();
    		}
     
    		public static void ssl()
    		{
    			try
    			{
    				ServicePointManager.ServerCertificateValidationCallback += ServerCertificateValidationCallback;			
    				var request = WebRequest.Create("https://exemple.com:443");				
    				var response = request.GetResponse();
     
    				Console.WriteLine("\n is ok \n");
     
    			}
    			catch
    			{
    				Console.WriteLine("\n is not ok \n");				
    			}
    		}
     
    		//callback du SSL 
    		private static bool ServerCertificateValidationCallback(object sender, X509Certificate certificate,
                                                                X509Chain chain, SslPolicyErrors sslPolicyErrors)
    	    {
    	    	string sN = certificate.GetSerialNumberString();
    	    	string Iss = certificate.Issuer.ToString();
    	    	string exp = certificate.GetExpirationDateString();
    	    	string serialNumber ="XXXXXXXXXXXXXXXXXXXXXx";
    			string issuer = "CN=XXXX  Standard SSL CA, O=XXXXXX SAS, C=XX";
    			string expiration = "XX/XX/XXXX XX:XX:XX";
     
    			if(sN != serialNumber || Iss != issuer || exp != expiration)
    			{
    				Console.WriteLine("probleme de certificat");
    				return false;				
    			}
    	      	else
    	      	{
    	      		return true;
    	      	}
     
    	    }

    Avec mes remerciement,
    Leo

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Qu'est-ce qui s'affiche dans la console ? Le callback du timer est bien appelé à chaque fois ? Tu as essayé de déboguer pas à pas ?

    Au passage, cette instruction ne doit être exécutée qu'une seule fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ServicePointManager.ServerCertificateValidationCallback += ServerCertificateValidationCallback;
    Là tu ajoutes un handler de plus à chaque fois, donc la 1ere fois, ServerCertificateValidationCallback est appelée 1 fois, puis 2 fois la 2e fois, 3 fois la 3e fois, etc

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 20
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Qu'est-ce qui s'affiche dans la console ? Le callback du timer est bien appelé à chaque fois ? Tu as essayé de déboguer pas à pas ?

    Au passage, cette instruction ne doit être exécutée qu'une seule fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ServicePointManager.ServerCertificateValidationCallback += ServerCertificateValidationCallback;
    Là tu ajoutes un handler de plus à chaque fois, donc la 1ere fois, ServerCertificateValidationCallback est appelée 1 fois, puis 2 fois la 2e fois, 3 fois la 3e fois, etc
    j'ai deplacé le handler au début de mon programme, effectivement celui ci posait problème.

    En ce qui concerne l'affichage à la console, voilà ce que j'obtiens lorsque que le SSL est sensé fonctionner :

    creating timer XX:XX:05

    time XX:XX:05

    is ok

    time XX:XX:10

    is ok

    time XX:XX:15

    time XX:XX:20


    ...etc sans plus m'écrire is ok ou is not ok comme si la vérification était stopé.

    or lorsque je change les données en dure concernant le serial number par exemple (afin qu'il me sort un "problème de certificat") voilà ce que j'ai :

    creating timer XX:XX:05

    time XX:XX:05

    problème de crtificat

    is not ok

    time XX:XX:10

    problème de certificat

    is not ok


    ... et là il fait effectivement une comparaison à chaque fois.

    J'ai fait un programme de timer, puis un programme de comparaison de SSL et ces deux programme seuls.

    Pour déboguer pas à pas j'ai fais un simple :

    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
     
    //recupération des infos
    string sN = certificate.GetSerialNumberString();
    string Iss = certificate.Issuer.ToString();
    string exp = certificate.GetExpirationDateString();
     
    //infos de bases en dure
    string serialNumber ="XXXXXXXXXXXXXXXXXXXXX";
    string issuer = "CN=XXXX Standard SSL CA, O=XXXXX SAS, C=XX";
    string expiration = "13/04/2015 01:59:59";
     
    Console.WriteLine(" serial number = {0}\n Issuer = {1}\n expiration = {2}\n",sN,Iss,exp);
     
    //compare les données			
    if(sN != serialNumber || Iss != issuer || exp != expiration)
    {
    	Console.WriteLine("probleme de certificat");
    	return false;				
    }
    else
         return true;
    et avec cela j'ai le resultat suivant :
    -lorsque cela fonctionne -> j'ai la même chose qu'évoqué plus tôt avec les infos du certificat, deux fois (2 ticks), puis plus que le "time XX:XX:XX"
    -lorsque cela ne fonctionne pas -> idem à l'execption que cela m'affiche bien tous les messages attendus!

    merci

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Je pense que ton souci vient du fait que tu ne préserves pas une référence vers ton timer.

    Donc même s'il est actif, du point de vue mémoire il est inutilisé, donc collectable par le GC.

    Essaye avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    static Timer stateTimer;
    public static void Main(string[] args)
    {
        //CREATION DE MON TIMER
        TimerCallback callback = new TimerCallback(Tick);		
        Console.WriteLine("\n Creating timer: {0} \n", DateTime.Now.ToString("h:mm:ss"));
        stateTimer = new Timer(callback, null, 0, 5000); //--> ici toutes les 5 secondes pour les testes
     
        Console.ReadKey(true);
    }

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 20
    Par défaut
    J'ai instancié le timer avant, je n'y avais pas pensé!!

    En revanche, impossible de compiler, l'erreur suivante est afficher -> "Erreur CS0120: Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'test.Program.stateTimer"

    Bien que je n'y croyais pas trop j'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                    static Timer stateTimer; //le passé en static
     
    		public static void Main(string[] args)
    		{
    		    ServicePointManager.ServerCertificateValidationCallback = ServerCertificateValidationCallback; //ici le callback
    		    //CREATION DE MON TIMER
    		    TimerCallback callback = new TimerCallback(Tick);		
    		    Console.WriteLine("\n Creating timer: {0} \n", DateTime.Now.ToString("h:mm:ss"));
    		    stateTimer = new Timer(callback, null, 0, 5000); //--> ici toutes les 5 secondes pour les testes
     
    		    Console.ReadKey(true);
    		}
    mais la même chose se reproduit encore... =/

  6. #6
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Oui en effet pour le static, c'était du codage à la volée.

    Donc si c'est OK maintenant avec le timer je me demande s'il n'y a pas de la mise en cache quelque part qui expliquerait pourquoi quand ça marche il ne revérifierait pas à chaque fois...

Discussions similaires

  1. Verification la validite de plusieurs adresses emails
    Par Slim_Tunisien dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 27/01/2011, 07h08
  2. Problèmes d'affiche du header de mon JTable avec un Model
    Par Baptiste Wicht dans le forum Composants
    Réponses: 16
    Dernier message: 08/02/2006, 18h37
  3. Problème lors de la lecture d'un fichier avec Input...
    Par Kronoob dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 18/11/2005, 18h55
  4. [C#][service windows] problème de débutant avec 1 timer
    Par Nycos62 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 14/10/2005, 11h22
  5. [Débutant]Problème avec les timers
    Par mickael777 dans le forum MFC
    Réponses: 1
    Dernier message: 11/04/2005, 11h00

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