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.
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
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 🙂
– Najciekawsze artykuły o .NET
Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl