Używam SSH (a dokładniej OpenSSH 5.5p1 w systemie Linux). Mam klucz, na którym mam hasło. Używam tego do zwykłego logowania do komputera.
Czy mogę go również używać do podpisywania plików?
Jak rozumiem, klucz SSH jest kluczem RSA (lub DSA), a podczas procesu logowania SSH służy do podpisywania wiadomości wysyłanych na serwer. Tak więc w zasadzie i w praktyce można go używać do podpisywania rzeczy - w rzeczywistości jest to jego jedyny cel.
Ale o ile widzę, nie ma sposobu, aby użyć klucza do podpisania dowolnego pliku (tak jak w przypadku PGP, powiedzmy). Czy jest jakiś sposób, aby to zrobić?
ssh
digital-signature
Tom Anderson
źródło
źródło
Odpowiedzi:
Może nie być sposobu, aby to zrobić za pomocą samych narzędzi OpenSSH.
Ale można to zrobić dość łatwo za pomocą narzędzi OpenSSL. W rzeczywistości istnieją co najmniej dwa sposoby, aby to zrobić. W poniższych przykładach
~/.ssh/id_rsa
jest twój klucz prywatny.Jednym ze sposobów jest użycie dgst :
Drugi używa pkeyutl :
Oba zapisują binarny podpis na standardowe wyjście. dgst wybiera
-hex
opcję, aby wydrukować reprezentację tekstową z pewnymi szczegółami dotyczącymi formy podpisu. pkeyutl ma-hexdump
opcję, która jest nieco mniej przydatna. Oba zaakceptują zarówno klucze RSA, jak i DSA. Nie mam pojęcia, jaki jest format wyjściowy. Oba polecenia tworzą różne formaty. Mam wrażenie, że pkeyutl jest uważany za bardziej nowoczesny niż dgst .Aby zweryfikować te podpisy:
i:
Problem jest tutaj
$PUBLIC_KEY_FILE
. OpenSSL nie może odczytać formatu klucza publicznego OpenSSH, więc nie możesz po prostu używaćid_rsa.pub
. Masz kilka opcji, żadna idealna.Jeśli masz wersję OpenSSH w wersji 5.6 lub nowszej, najwyraźniej możesz to zrobić:
Który zapisze klucz publiczny na standardowym wyjściu w formacie PEM, który OpenSSL może odczytać.
Jeśli masz klucz prywatny i jest to klucz RSA, możesz z niego wyodrębnić klucz publiczny (zakładam, że plik klucza prywatnego zakodowany w PEM zawiera kopię klucza publicznego, ponieważ nie można uzyskać klucza publicznego z samego klucza prywatnego) i użyj tego:
Nie wiem, czy istnieje odpowiednik DSA. Zauważ, że takie podejście wymaga pewnej współpracy ze strony właściciela klucza prywatnego, który będzie musiał wyodrębnić klucz publiczny i wysłać go do potencjalnego weryfikatora.
Na koniec możesz użyć programu w języku Python napisanego przez faceta o nazwie Lars, aby przekonwertować klucz publiczny z OpenSSH na format OpenSSL.
źródło
@ Odpowiedź Toma pomogła mi zacząć, ale nie wyszła z pudełka.
Te polecenia będą działać z:
Korzystanie z pkeyutl
Korzystanie z dgst
Wersja pkeyutl może podpisywać tylko małe pliki. Podczas gdy dgst może podpisywać dowolnie duże pliki, ponieważ wymaga podpisu przed podpisaniem wyniku.
źródło
Aby zweryfikować te podpisy - łatwiejsze rozwiązanie:
Łatwiejszym sposobem upewnienia się, że podpisany dokument jest taki sam, jest ponowne wygenerowanie pliku podpisu cyfrowego, a następnie użycie mechanizmu różnicowego do sprawdzenia, czy dwa pliki podpisu są takie same.
źródło