<div class="gmail_quote">2011/1/24  <span dir="ltr"><<a href="mailto:mickflemm@gmail.com">mickflemm@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Εδώ και μερικές μέρες γράφω ένα ας πούμε frontend στην OpenSSL για να κάνω ποιο εύκολα ελέγχους για την ισχύ πιστοποιητικών x509. Βασικά μου τη σπάει το command line της OpenSSL και δε πολυβολεύει αν πχ. θες να τα κάνεις όλα με τη μία και απλά. Στόχος μου ήταν να μπορώ να περνάω κάπου το certificate του client/user/whatever και να τσεκάρω και το signature και το revocation status με CRL και OCSP, να έχω την ευελιξία να του περάσω ca certificates που δεν περιέχονται στο σύστημα (πχ. το class3 root certificate της CAcert) ή να το υποχρεώσω να τσεκάρει κάποια CRL ακόμα και όταν δεν υπάρχει ορισμένο distribution point στο certificate (π.χ. στα class3 signed certificates της CAcert υπάρχει το OCSP uri αλλά όχι το CRL distrtibution point -ενώ υπάρχει διαθέσιμη CRL-, αντίθετα σε όσα είναι signed με το class1 υπάρχουν και τα δύο) + να κάνει handle και local resources και network resources transparently.<br>


<br>
Έτσι έφτιαξα αυτό εδώ χρησιμοποιώντας OpenSSL + cURL με μερικά κολπάκια για να κάνω τη δεύτερη να παίζει όπως τη θέλω :P<br>
<a href="http://www.kernel.org/pub/linux/kernel/people/mickflemm/pkitest.tar.bz2" target="_blank">http://www.kernel.org/pub/linux/kernel/people/mickflemm/pkitest.tar.bz2</a><br>
<br>
Καταρχάς το έχω κάνει debug με ένα class3 revoked certificate και ένα class1 valid certificate και δουλεύει μια χαρά εδωπέρα, έχω όμως κάποιες αμφιβολίες και θέλω να το δείτε κι εσείς και να μου πείτε. Ποιο συγκεκριμένα:<br>


<br>
α) Φοβάμαι για memory leaks, γίνεται το χάος στην OpenSSL με τα macros της, ενώ στην αρχή είχα φτάσει σε σημείο να κάνω double free κλπ (paranoid mode), μετά το συμάζεψα κάπως και τώρα δε μου πετάει κάτι. Δεν κάθισα όμως να το κάνω profile και να δω ότι πραγματικά δεν αφήνει σκουπίδια στο διάβα του.<br>


<br>
β) Πιστεύω ότι υπάρχει κάποιο καλύτερο regexp για το URL από αυτό που του έχω βάλει.<br>
<br>
γ) Υποτίθεται ότι υπάρχουν certificates που δηλώνουν πολλά distribution points για τη CRL, μέχρι στιγμής δεν έχω πετύχει κάποιο, με της CAcert που έπαιξα έχει ένα distribution point και δε ζορίζεται ιδιαίτερα. Θέλω να δω αν η loop θα παίξει όπως πρέπει.<br>


<br>
δ) Θα μου άρεσε ένας καλύτερος τρόπος να διαχειρίζομαι το debug output και γενικότερα το output, ίσως κάποιος logger αλλά δεν το έχω ψάξει γενικότερα.<br>
<br>
ε) Θέλει cleanup, ότι δείτε σε code duplication, σπαστικά nested loops (έχω ένα που μου τη δίνει απίστευτα, αν έχετε καμιά καλύτερη ιδέα θα ήταν χρήσιμη) βαράτε.<br>
<br>
ζ) Δε ξέρω τι να κάνω με τα redirections, πχ η CAcert έχει αλλάξει την τοποθεσία της CRL από το distribution point που έχει στο certificate της και κάνει HTTP redirect στο καινούριο URL. Γενικώς μου τη δίνουν τα redirects και θα ήθελα να τα αποφύγω, για την ώρα επιτρέπω ένα redirection max και μετά η cURL θα ψοφήσει.<br>


<br>
η) Ένας τρόπος για να ελέγξω αν κάτι είναι URL αφού έχει περάσει το regexp είναι να προσπαθήσω να κάνω resolve το hostname και σε δεύτερη φάση να πάρω τα headers και να δω αν υπάρχει (αν πρόκειται γι' αρχείο) -το τελευταίο δεν το έχω υλοποιήσει ακόμα-. Έλα όμως που αν έχεις OpenDNS ή κάτι αντίστοιχο ο DNS server δεν επιστρέφει ποτέ fail και πρέπει να κάνω αναγκαστικά και το check της σύνδεσης ! Και όχι μόνο αυτό αλλά κάνει resolve σε ένα http server οπότε δεν καταλαβαίνεις διαφορά εύκολα, όχι αν δεν πας να κατεβάσεις αρχείο -πχ. τη CRL ή κάποιο certificate- για να δεις αν θα σου βγάλει not found ο server που θα σε πετάξει. Σκέφτηκα<br>


να βάλω με το χέρι τις IPs του OpenDNS αλλά είναι και λάθος αρχιτεκτονικά (ειδικά αν λάβεις υπόψη και το IPv6) και υπάρχουν και άλλοι resolvers που κάνουν το ίδιο. Για την ώρα θα αναλάβει η cURL να το κατεβάσει και αν είναι σκουπίδι θα μου επιστρέψει error οπότε είμαι οκ αλλά το ερώτημα παραμένει. Πώς κάνουμε validate ένα URL με σιγουριά ?<br>


<br>
<br>
Αυτά για την ώρα αν μου έρθει κάτι άλλο τα ξαναλέμε, πάω να τη πέσω επιτέλους γιατί είμαι λιώμα :P</blockquote><div><br></div><div>Αν ψάχνεις για URL regexp, δε νομίζω να βρεις καλύτερο από αυτό:</div><div><br></div><div>

<a href="http://daringfireball.net/2010/07/improved_regex_for_matching_urls">http://daringfireball.net/2010/07/improved_regex_for_matching_urls</a> </div></div><div><br></div>Επίσης, μην κακολογείς τα HTTP redirects, φαντάσου πόσο χρήσιμο θα ήταν ένα file system χωρίς symlinks :-)<br clear="all">

<br>-- <br>Panagiotis Astithas<br><a href="http://astithas.com" target="_blank">http://astithas.com</a><br>