Nie, nie… dziś nie będzie o daktyloskopii a o odciskach palca dla certyfikatów. Jak wiemy (albo i nie wiemy) certyfikat każdy posiada skrót (‘odcisk palca’), który unikalnie go identyfikuje (jak w życiu :)). Niedawno miałem potrzebę znalezienie takowego certyfikatu po takowym odcisku. Wygooglałem MSDNa i znalazłem potrzebną mi funkcję – Find.

var store = new X509Store(storeName, storeLocation);
store.Open(OpenFlags.ReadOnly);
var coll = store.Certificates.Find(findType, findValue, true);                                
if (coll.Count < 1)
{
    throw new ArgumentException(“Unable to locate certificate”);
}

Zapodałem jej odpowiednie argumenty, jako findType ustawione FindByThumbprint, jako findValue – odcisk. Uruchamiam i bum. Wyjątek. Sprawdzam raz jeszcze odcisk. Zgadza się. Wyjątek dalej. Sprawdzam bajt po bajcie i znów to samo! Kolejne WTF leci pod nosem…

Rozwiązanie (a przynajmniej naprowadzenie na trop) pojawia się w głowie gdy zajrzymy sobie do metody Find… pomiędzy innymi rzeczami zobaczymy taki oto kawałek kodu

byte[] managed = X509Utils.DecodeHexString((string) findValue);

Czyli nasz odcisk jest zamieniany na bajty przed porównaniem…a skoro bajty to może kodowanie znaków?Może ono ma coś do czynienia tutaj? Przepuśćmy nasze findValue przez prostą metodę konwertującą UTF8 do ASCII. Po takiej prostej operacji widzimy, że na początku poza znakami ASCII mamy powtarzającą się dwukrotnie sekwencję – E2 80 E8
Szybkie zerknięcie na tabelkę kodów UTF8 i wszystko jasne. LEFT-TO-RIGHT marker – niewidoczny znacznik, który powodował, że porównanie odcisków skutkowało niemożliwością prawidłowego znalezienia certyfikatu…wystarczyło skasować odcisk (ważne – wraz z ” “)…napisać go jeszcze raz i działa. Taki mały upierdliwiec zabierający 2-3h z życiorysu…

Nauczka na przyszłość, aby nie kopiować kodu ze strony WWW 🙂


dotnetomaniak.plNajciekawsze artykuły o .NET