Wbrew temu, co można by sądzić po tytule dzisiejszego wpisu, nie będziemy się dziś ładować z SSL-em na zaplecza lokalnych pubów. Nie będziemy też mierzyć ciśnienia barometrem.
Będziemy się z SSL-em mocować.
To znaczy, ja będę.
A właściwie byłem. Byłem się mocowałem z SSL-em, aby na końcu odnieść nieco dziwne, ale jednak - zwycięstwo.
SSL to taki protokół szyfrujący, który już jakiś czas temu odszedł do lamusa, zastąpiony przez TLS. Ale w niektórych miejscach jeszcze się go używa i to w celach kompletnie nie związanych z www.
Za pomocą SSL można bowiem zaszyfrować dowolny plik, nie musi to był od razu zielona kłódeczka w przeglądarce.
No i teraz tak: poproszono mnie niedawno w pracy o zautomatyzowanie pewnego procesu, ponieważ zajmuje on dzień w dzień jednemu pracownikowi około czterdziestu minut, co po przeliczeniu na pracownikoroboczominutogodziny daje średnio nieco ponad dziewięć tysięcy minut rocznie, a więc jakieś dwadzieścia dni roboczych, przy założeniu irlandzkiego siedmioipółgodzinnego dnia pracy. Dwadzieścia dni roboczych - toż to miesiąc pracy jest, jeżeli da się to zautomatyzować, wówczas ten gość zamiast siedzieć 40 minut dziennie i klikać, będzie mógł pójść na spacer. Albo oglądać w tym czasie śmieszne koty na Tyrurce.
Gra warta świeczki.
Proces, który miałem zautomatyzować, składa się z ośmiu kroków. Większość z nich polega na logowaniu się do różnych usług oraz pobieraniu / wysyłaniu plików, ale gdzieś tam po drodze musimy jeszcze te pliki zdeszyfrować - właśnie za pomocą SSL (a konkretnie - OpenSSL).
OpenSSL to darmowa biblioteka, która implementuje SSL (a ostatnio również TLS) na wszystkie główne systemy operacyjne. W tym również Windows.
Wersja dla Windows składa się z jednego pliku exe oraz paru "satelitarnych" bibliotek (tak, biblioteka ma biblioteki i nie ma w tym nic nadzwyczajnego). Szyfrowanie / deszyfrowanie odbywa się poprzez wywołanie tego pliku exe z odpowiednimi parametrami. Ewentualnie można uruchomić plik exe bez parametrów - wtedy pojawia się tryb interaktywny (shell), w którym można wpisywać komendy i w ten sposób szyfrować / deszyfrować dane, generować klucze i tak dalej.
Teoretycznie jest tak, że każdą operację, jaka jest dostępna w OpenSSL, da się wykonać przekazując aplikacji odpowiednie parametry.
Ponieważ jednak teoria z praktyką zgadza się tylko w teorii, rzeczywistość jest nieco inna. Na przykład komenda cms -decrypt w pewnej konkretnej konfiguracji kluczy i haseł działa wyłącznie w trybie interaktywnym. Z wiersza poleceń nie zadziała, choćby się człowiek sfajdał.
Żeby dojść do tego odkrycia, potrzebowałem pół dnia. Zmarnowałem cztery godziny na to, żeby odkryć, że nie da się zdeszyfrować pliku za pomocą polecenia cms -decrypt używając wyłącznie parametrów wiersza poleceń. Jedyne, co działa, to tryb interaktywny. Koniec, kropka.
Myślę sobie, dupa przenajbledsza, nie zautomatyzuję tego.
Odłożyłem zagadnienie "na później".
"Później" przyszło po jakichś dwóch godzinach. Rozwiązanie obrzydliwe, nieeleganckie i powolne. Ale - działa!
Skoro deszyfrowanie da się zrobić wyłącznie interaktywnie, zaprzęgłem PowerShell-a, żeby zasymulować tę interaktywność programowo. A więc: uruchamiam OpenSSL, następnie przechwytuję okienko konsoli i wysyłam do niego (również za pomocą PowerShell) naciśnięcia klawiszy. Aplikacji "wydaje się", że polecenia wpisuje człowiek, więc wszystko działa jak należy. Jedyny kłopot jest taki, że trzeba trochę dłużej poczekać, bo wpisanie pięćdziesięcio- czy osiemdziesięcioznakowego polecenia trochę zajmuje - ale wszystko robi się "samo". No i nie wolno w tym czasie klikać w żadne inne okienka, bo się komendy SSL "wpiszą" gdzieś indziej.
Reakcja szefostwa podczas prezentacji rozwiązania była raczej mdła. Zobaczyli, stwierdzili, że działa, kazali puścić do produkcji, koniec tematu.
Żadnych fontann, fajerwerków, żadnego Computti Militari ani oklasków.
No ale w końcu nie dla oklasków pracuję.
C'nie?
Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]
Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.