Page 1 sur 1

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

Posté : mer. 03 mars 2010 11:40
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 ?

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

Posté : mer. 03 mars 2010 23:39
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. ;)

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

Posté : jeu. 04 mars 2010 09:20
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:

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

Posté : jeu. 11 mars 2010 16:28
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.

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

Posté : jeu. 01 avr. 2010 11:07
par Whaouu
Personne ne peut m'aider pour mon problème de certificat ?

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

Posté : jeu. 01 avr. 2010 21:13
par Tlem
Le double 'postage' n'est pas autorisé sur ce forum : http://www.autoitscript.com/forum/index ... omsearch=1

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

Posté : mar. 19 oct. 2010 20:20
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