Hallo Leute,
ich benötige mal Fachwissen im Bereich TLS / Zertifikate.
Und zwar baue ich eine Verbindung zu einem TLS Server auf. Dies klappt auch bei den meisten Servern.
Nun habe ich einen Server der bricht den TLS Handshake ab, nachdem ich das Client Zertifikat gesendet habe. Hierbei ist nicht das Client Zertifikat an sich das Problem, sondern dass mein .Net Client mit der SSLStream Klasse im TLS Handshake nur das Client Zertifikat, aber nicht das zugehörige Root Zertifikat mit überträgt. Dies erwartet der Remote Server jedoch.
Andere Tests mit Linuxservern oder z.B. einem Python Script haben ergeben, dass diese immer das CA Zertifikat mit übertragen. (Durch entsprechende Wireshark Mitschnitte analysiert)
Handshake Beispiel ohne CA Zertifikat (Schlägt fehl, .Net sslstream)
Secure Sockets Layer
TLSv1.2 Record Layer: Handshake Protocol: Multiple Handshake Messages
Content Type: Handshake (22)
Version: TLS 1.2 (0x0303)
Length: 2064
Handshake Protocol: Certificate
Handshake Type: Certificate (11)
Length: 1470
Certificates Length: 1467
Certificates (1467 bytes)
Certificate Length: 1464
Certificate: 308205b43082039ca003020102020107300d06092a864886... (pkcs-9-at-emailAddress=***,id-at-commonName=***,id-at-organizationalUnitName=***,id-at-organizationName=***,id-at-localityName=Frankfurt,id-at-state
Handshake Beispiel mit CA Zertifikat (Klappt wunderbar, Python Script)
Secure Sockets Layer
TLSv1.2 Record Layer: Handshake Protocol: Certificate
Content Type: Handshake (22)
Version: TLS 1.2 (0x0303)
Length: 2968
Handshake Protocol: Certificate
Handshake Type: Certificate (11)
Length: 2964
Certificates Length: 2961
Certificates (2961 bytes)
Certificate Length: 1464
Certificate: 308205b43082039ca003020102020107300d06092a864886... (pkcs-9-at-emailAddress=***,id-at-commonName=***,id-at-organizationalUnitName=***,id-at-organizationName=***,id-at-localityName=Frankfurt,id-at-state
Certificate Length: 1491
Certificate: 308205cf308203b7a003020102020101300d06092a864886... (pkcs-9-at-emailAddress=***,id-at-commonName=***,id-at-organizationalUnitName=***,id-at-organizationName=***,id-at-localityNa
Ich übergebe in der AuthenticateAsClient Methode eine X509Certificate2Collection, die auch aus der P12 Datei importiert habe. Diese P12 Datei enthält das eigene Zertifikat, den Schlüssel für das eigene Zertifikat und das CA Zertifikat. Es ist also alles vorhanden und an den SSL Stream übergeben.
Gibt es hier Experten in dieser Tiefe?
Gruß
MeisterM
und es vollkommen ausgeschlossen, dass die Server bei denen es funktioniert
die Root-CA des Clientzertifikates nicht kennen ?
Mein Gedanke dazu, ein Server sendet auch nicht die CA des Serverzertifikates
beim SSLHandshake. Der Client ist im Besitz der vertrauenswürdigen CA und
validiert das Serverzertifikat. Die vertrauenswürdige CA kommt aber auf anderen Wegen
OS-Update, Browser-Update o.ä. auf den Client. Nicht beim
SSLHandshake. Das hatte ich heute erst in Bearbeitung - allerdings mit Java.
Und irgendwas ist seltsam bei den Mitschnitten - oder ?
Length: 2064 => Length: 1470 => Length: 1467
Length: 2968 => Length: 2964 => Length: 2961 => Length: 1464 + 1491
Wenn das zweite Beispiel vollständig ist, dann ist das erste unvollständig
1464 + 3 + 1491 + 3 = 2961 + 3 = 2964 + 3 = 2968 == vollständig ?
1467 + 3 = 1470 + 3 != 2064 == unvollständig ?
Wenn das Clientzertifikat unmittelbar von einer Root-CA signiert wurde
reicht es nur das Zertifikat allein zu senden. Ansonsten muss die komplette
Chain gesendet werden - ohne Root-CA. Es würde die komplette Verschlüsselung obsolete
machen, wenn gegen die gesendete Root-CA validiert werden würde.
Dann wäre JEDES Zertifikat valide und Man-in-Middle der Normalfall.
"Yes, the whole chain (except the root) should be sent. I'll test (first) and commit your fix. Thanks."