05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

384 7 Client-/Server-Programmierung <strong>mit</strong> Open<strong>SSL</strong><br />

131 if( ! ( cert = <strong>SSL</strong>_get_peer_certificate( ssl ) ) )<br />

132 return( 0 );<br />

133<br />

134 /* steckt im Zertifikat eine SubjectAltName -Extension? */<br />

135 if( altnames = X509_get_ext_d2i( cert,<br />

136 NID_subject_alt_name , NULL, NULL ) )<br />

137 {<br />

138 /* falls ja: wieviele GeneralNames enthält diese? */<br />

139 numaltnames = sk_GENERAL_NAME_num( altnames );<br />

140<br />

141 /* alle GeneralNames der Extension durchsuchen */<br />

142 for( i = 0; i < numaltnames && ok type == GEN_DNS &&<br />

149 ( dns = (char *)ASN1_STRING_data( gn->d.ia5 ) ) )<br />

150 {<br />

151 /* ... <strong>und</strong> <strong>mit</strong> dem Hostnamen vergleichen */<br />

152 ok = ( strcasecmp( dns, host ) == 0 );<br />

153 /* ok ist 1 bei einem Treffer , andernfalls 0 */<br />

154 }<br />

155 }<br />

156<br />

157 /* zum Schluß die GeneralNames wieder freigeben */<br />

158 sk_GENERAL_NAME_free( altnames );<br />

159 }<br />

134–137<br />

138–143<br />

Wie in RFC 2818 festgelegt, wird nun im Zertifikat als erstes nach Subject<br />

Alternative Names gesucht. Mit der X509_get_ext_d2i()-Funktion wird die<br />

entsprechende Erweiterung im Zertifikat des Kommunikationspartners aufgespürt.<br />

Die Funktion liefert als Ergebnis entweder einen Stapel von General<br />

Names oder, falls die Erweiterung nicht vorhanden ist, einen Nullzeiger.<br />

Sind im Zertifikat Subject Alternative Names enthalten, dann wird die Folge<br />

der General Names nach dem gesuchten FQDN durchforstet. Open<strong>SSL</strong> stellt<br />

dazu einen Satz von Makros bereit, <strong>mit</strong> deren Hilfe ein Stapel von Daten bearbeitet<br />

<strong>und</strong> durchsucht werden kann. Im konkreten Beispiel verwenden wir die<br />

drei Makros sk_GENERAL_NAME_num() um die Anzahl der General Names auf<br />

dem Stapel zu bestimmen, sk_GENERAL_NAME_value() um den n-ten General<br />

Name zu er<strong>mit</strong>teln <strong>und</strong> sk_GENERAL_NAME_free() um den Stapel am Ende<br />

wieder freizugeben. Die openssl_match_host_cert()-Funktion bestimmt auf<br />

der Suche nach dem passenden FQDN zunächst die Anzahl der Elemente <strong>und</strong><br />

iteriert dann über alle Elemente des Stapels. Falls die Suche erfolgreich war,<br />

gilt ok == 1 <strong>und</strong> die Schleife wird vorzeitig beendet.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!