[V] Comment lire les informations d'un certificat SSL ?

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Verrouillé
Whaouu
Niveau 2
Niveau 2
Messages : 15
Enregistré le : ven. 13 févr. 2009 15:54
Status : Hors ligne

[V] Comment lire les informations d'un certificat SSL ?

#1

Message par Whaouu »

Bonjour, à tous,

Je désire pouvoir extraire les informations d'un certificat SSL lié à un site.

Après recherches j'ai trouvé cet exemple qui utilise "WinINet.au3" et qui permet de lire la date d'expiration du certificat.
► Afficher le texte
Cela fonctionne parfaitement, mais voilà, la date d'expiration ne me suffit pas je désirerais extraire le nom de l'organisme d'émission et le nom de détenteur du certificat.

J'au constaté que cette information était accessible via des pointeurs, mais je ne sais pas comment y accéder.

http://msdn.microsoft.com/en-us/library ... S.85).aspx

Pouvez-vous m'aider ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Comment lire les informations d'un certificat SSL ?

#2

Message par Tlem »

Pour faire suite à vos deux messages du forum Anglais et celui-ci ;) , ces informations sont présentes dans le fichier WinInetConstants.au3 ligne 641 pour la version '2010'.

Code : Tout sélectionner

Global Const $tagINTERNET_CERTIFICATE_INFO = "dword ExpiryTime[2]; dword StartTime[2]; ptr SubjectInfo; ptr IssuerInfo; ptr ProtocolName; ptr SignatureAlgName; ptr EncryptionAlgName; dword KeySize"
Après, je ne sais pas trop comment le gérer dans le DllStructCreate() car ce ne sera plus un dword mais un ptr ...
Donc il faut sans doute remplacer le "int64" par autre chose. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Whaouu
Niveau 2
Niveau 2
Messages : 15
Enregistré le : ven. 13 févr. 2009 15:54
Status : Hors ligne

Re: [..] Comment lire les informations d'un certificat SSL ?

#3

Message par Whaouu »

Merci pour votre réponse Tlem,

Je ne l'avais pas précisé, mais j'en étais parvenu à la même conclusion tout simplement en affichant la contenue de la variable.

Code : Tout sélectionner

MsgBox(0, "", $tagINTERNET_CERTIFICATE_INFO)
J'ai bien tenté de récupérer un pointeur de cette façon :

Code : Tout sélectionner

Local $pSubjectInfo = DllStructCreate("ptr", DllStructGetPtr($tINTERNET_CERTIFICATE_INFO, "SubjectInfo"))
Mais je ne sais pas comment l'exploiter (en admettant que ce soit la bonne façon de faire) après.

En bref ce n'est vraiment pas mon truc, je manque cruellement d'informations dans ce domaine.

Il me faudrait l'aide de Sylvanie qui me semble parfaitement s'y connaître en la matière, donc Sylvanie si jamais tu passes par là... :wink:
Whaouu
Niveau 2
Niveau 2
Messages : 15
Enregistré le : ven. 13 févr. 2009 15:54
Status : Hors ligne

Re: [..] Comment lire les informations d'un certificat SSL ?

#4

Message par Whaouu »

J'ai un peu avancé dans mes recherches, j'ai trouvé un exemple en C++ de lecture du certificat via l'API WinInet.

http://blogs.msdn.com/jpsanders/archive ... -apis.aspx

Il semble qu'il soit possible de récupérer les informations via deux structures différentes :

INTERNET_OPTION_SECURITY_CERTIFICATE
INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT

http://msdn.microsoft.com/en-us/library ... S.85).aspx

Pour le moment cela ne m'avance pas énormément vue mes connaissances en C++, mais c'est déjà une piste.
Whaouu
Niveau 2
Niveau 2
Messages : 15
Enregistré le : ven. 13 févr. 2009 15:54
Status : Hors ligne

Re: [..] Comment lire les informations d'un certificat SSL ?

#5

Message par Whaouu »

Personne ne peut m'aider pour mon problème de certificat ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Comment lire les informations d'un certificat SSL ?

#6

Message par Tlem »

Le double 'postage' n'est pas autorisé sur ce forum : http://www.autoitscript.com/forum/index ... omsearch=1
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [V] Comment lire les informations d'un certificat SSL ?

#7

Message par sylvanie »

Bonsoir, après concertation je déverouille temporairement ce post pour donner la réponde au cas où d'autres personnes rencontreraient le même soucis.

Et bien à vrai dire, tout y était ^^
Il ne manquait plus la lecture de l'information elle même.
Pour rappel, un pointeur est une adresse où on lit / écrit des données.
Comme on a ici une structure contenant un pointeur par retours de l'appel à :

Code : Tout sélectionner

DllStructCreate("ptr", DllStructGetPtr($tINTERNET_CERTIFICATE_INFO, "SubjectInfo"))
 
il faut le lire. Mais en Autoit, on n'a pas explictement de fonction de type Readbuffer(address,mongueur,type)
Cependant on peut recréer un buffer (de 500 bytes ici arbitrairement) de char grâce à DllStructCreate("char subject[500]"),DllStructGetData($tsubjectinfo, 1)) à laquelle on passe en deuxième argument DllStructGetData($tsubjectinfo, 1) qui correspond à notre pointeur extraît de sa structure

du coups en faisant un DllStructGetData on lit le contenu de ce buffer (sur 500 caractères, mais Autoit sais s'arrêté à l'octet null)

et au final on a :

Code : Tout sélectionner


#include <WinINet.au3>
#include "WinINetConstants.au3"


; Initialize WinINet"
_WinINet_Startup()

Global $sURIScheme = "https"
Global $sServerName = "mail.google.com"
Global $iServerPort = 443

; Create handles
ConsoleWrite("Opening Internet connection ..." & @LF)
Global $hInternetOpen = _WinINet_InternetOpen("AutoIt/" & @AutoItVersion);,$INTERNET_OPEN_TYPE_DIRECT);$INTERNET_OPEN_TYPE_PROXY,"Nom_mandataire");"10.10.10.10:8080")
if @error Then
    ConsoleWrite("Open Internet connection: failed." & @LF)
Else
    ConsoleWrite("Open Internet connection: ok." & @LF)
EndIf



;Global $hInternetOpenUrl = _WinINet_InternetOpenUrl($hInternetOpen, $sURIScheme & "://" & $sServerName &":"&$iServerPort, Default, $INTERNET_FLAG_SECURE)
Global $hInternetOpenUrl = _WinINet_InternetOpenUrl($hInternetOpen, $sURIScheme & "://" & $sServerName &":"&$iServerPort, Default, $INTERNET_FLAG_SECURE )
if @error Then
    ConsoleWrite("Open Internet URL: failed." & @LF)
Else
    ConsoleWrite("Open Internet URL: ok." & @LF)
EndIf

; Query certificate info...
Global $tBuffer = _WinINet_InternetQueryOption($hInternetOpenUrl, $INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT)
;Local $pSubjectInfo = DllStructCreate("ptr", DllStructGetPtr($tagINTERNET_CERTIFICATE_INFO, "SubjectInfo"))
Local $tINTERNET_CERTIFICATE_INFO = DllStructCreate($tagINTERNET_CERTIFICATE_INFO, DllStructGetPtr($tBuffer))

Local $tExpiryTime = DllStructCreate("int64", DllStructGetPtr($tINTERNET_CERTIFICATE_INFO, "ExpiryTime"))
ConsoleWrite("Expiry Time (100-nanoseconds): " & DllStructGetData($tExpiryTime, 1) & @LF)

Local $tsubjectinfo = DllStructCreate("ptr", DllStructGetPtr($tINTERNET_CERTIFICATE_INFO, "SubjectInfo"))
ConsoleWrite("subjectinfo pointer: " & DllStructGetData($tsubjectinfo, 1) & @LF)

$chain_subj_to_print = DllStructCreate("char subject[500]",DllStructGetData($tsubjectinfo, 1))
ConsoleWrite("subject txt :"&@CRLF&DllStructGetData($chain_subj_to_print,"subject")&@CRLF)

; Cleanup
_WinINet_InternetCloseHandle($hInternetOpenUrl)
_WinINet_InternetCloseHandle($hInternetOpen)
_WinINet_Shutdown()

ConsoleWrite("End of program..." & @LF)


 

NB : Il est impératif que le certificat de l'autorité de certification soit déjà connu d'IE pour que ça marche
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Verrouillé