Laden...

SslStream AuthenticateAsClient überträgt manchmal Root Zertifikat nicht mit

Erstellt von MeisterM vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.420 Views
M
MeisterM Themenstarter:in
17 Beiträge seit 2012
vor 7 Jahren
SslStream AuthenticateAsClient überträgt manchmal Root Zertifikat nicht mit

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

R
74 Beiträge seit 2006
vor 7 Jahren

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."

https://bugzilla.xamarin.com/show_bug.cgi?id=16974