Jak przekonwertować klucz publiczny ssh-keygen na format, który otwiera funkcja PEM_read_bio_RSA_PUBKEY ()?

49

Mam problem z generowaniem klucza publicznego, który PEM_read_bio_RSA_PUBKEY()może zużywać funkcja openssl . Wciąż pojawiają się błędy.

Oczywiście nie mogę po prostu użyć ciągu ASCII w ssh-keygen <>.pubpliku klucza, ponieważ jest on w formacie pliku SSH, lub może SubjectPublicKeyInfostruktury.

Oto kluczowy kod genowy: ssh-keygen -t rsa -b 1024 -C "Test Key"

W sieci znalazłem konwerter php, który przekonwertuje zawartość klucza publicznego na format łańcucha PEM ASCII base64. Jednak funkcja wciąż jej nie lubi.

Dokumentacja openssl stwierdza:

  1. „Funkcja RSA_PUBKEY () przetwarzająca klucz publiczny przy użyciu struktury EVP_PKEY”
  2. „Funkcje RSA_PUBKEY przetwarzają również klucz publiczny RSA przy użyciu struktury RSA”

Jak uzyskać klucz publiczny OpenSSH w dowolnym formacie, który będzie wykorzystywał funkcja OpenSSL?

PeteP
źródło
Zrozumiałem: użyj narzędzia openssl tylko jako takiego:
PeteP,
Utwórz klucz prywatny: openssl genrsa -out test.priv.key 2048; Wyjściowy klucz publiczny w tym samym formacie (PEM?): Openssl rsa -in test.priv.key -pubout -out test.pub.key
PeteP
Powiązane zabezpieczenia.
Stackexchange.com/questions/32768/…

Odpowiedzi:

56

DOBRZE!

Więc zacząłem myśleć: „Spokojnie, mam to”. Okazuje się, że jest o wiele więcej niż myślałem.

Pierwszym problemem jest to, że (według stron podręcznika OpenSSL (man 3 pem)) OpenSSL oczekuje, że klucz RSA będzie w formacie PKCS # 1. Najwyraźniej nie z tym współpracuje ssh-keygen. Masz dwie opcje (od przeszukiwania).

Jeśli masz OpenSSH w wersji 5.6 lub nowszej (nie miałem na swoim laptopie), możesz uruchomić to:

ssh-keygen -f key.pub -e -m pem

Dłuższą metodą na to jest rozbicie klucza SSH na różne komponenty ( wpis na blogu, który znalazłem trochę w tym, że oskarża OpenSSH o bycie „zastrzeżonym”, wolę nazywać go „unikalnym”), a następnie użyć biblioteki ASN1 zamieniać rzeczy.

Na szczęście dla ciebie ktoś napisał kod, aby to zrobić:

https://gist.github.com/1024558

Brian Redbeard
źródło
9
ssh-keygenMetoda wydaje się działać na Linuksie, ale nie w systemie Mac OS X.
pokrywa
3
Pokrywka, patrz uwaga w odpowiedzi na temat wersji SSH. OS X nie dostarcza najnowszej wersji OpenSSH. Uruchom polecenie ssh -V.
Brian Redbeard
3
Nie działa w OpenSSH_6.2p2. Działa w OpenSSH_6.6p1.
Old Pro
-mnie działa dla mnie ... co to za praca?
pstanton
2
Działa dla mnie na komputerze Mac!
Greg Hornby
18

Zakładając, że masz klucz prywatny SSH id_rsa, możesz wyodrębnić z niego klucz publiczny w następujący sposób:

openssl rsa -in id_rsa -pubout -out id_rsa.pub.pem

Zdaję sobie sprawę, że OP poprosił o konwersję klucza publicznego, więc to nie do końca odpowiada na pytanie, ale pomyślałem, że i tak będzie użyteczne dla niektórych.

Należy również zauważyć, że polecenie to powoduje utworzenie klucza publicznego PEM, czego generalnie oczekuje OpenSSL. Z drugiej strony odpowiedź Briana prowadzi do pliku w formacie RSAPublicKey, który nie jest normalnym formatem oczekiwanym przez OpenSSL (chociaż późniejsze wersje mogą go odczytać za pomocą -RSAPublicKey_inflagi). Aby przekonwertować, możesz to zrobić:

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem
shawkinaw
źródło
Dzięki, -pubout z klucza prywatnego załatwił sprawę.
Shaun Dewberry
openssl rsa -in id_rsa.pem -pubout -out id_rsa.pub.pemrównież działają (tzn. wejście jest kluczem prywatnym w formacie pem). Dobra odpowiedź.
Johnny Wong,
1
Aktualizacja: odpowiedź Brian został skorygowany do -m pkcs8której mimo OpenSSH ludzi stosujących niewłaściwą nazwę ma produkować X.509 „pubkey”. Ponadto, ponieważ OpenSSH 6.5 w wersji 2014-01, jeśli twórca określił „nowy format” -odla lepszego bezpieczeństwa, ta metoda nie będzie działać, a od 7,8 w sezonie 2018-08 „nowy format” jest teraz domyślny, podobnie.
dave_thompson_085
11

Wymagany format to to, co ssh-keygenwywołuje PKCS8. Tak więc następujące polecenie wygeneruje pożądany wynik:

ssh-keygen -f key.pub -e -m pkcs8

Ze strony podręcznika ssh-keygen:

-m key_format
         Specify a key format for the -i (import) or -e (export) conversion 
         options.  The supported key formats are: 
         ``RFC4716'' (RFC 4716/SSH2 public or private key), 
         ``PKCS8'' (PEM PKCS8 public key) or 
         ``PEM'' (PEM public key).  
         The default conversion format is ``RFC4716''.
Aaron Meriwether
źródło
Ten faktycznie działa zarówno na systemie Linux, jak i macOS.
Jay Taylor
wyodrębnić równoważny wygenerowany klucz publiczny z klucza prywatnego w OpenSSL openssl rsa -in key -pubout -out key.pub.openssl.pkcs8
Mohannd
6

Podobnie jak w poniższej metodzie Amala Chaudhuriego, to zadziałało dla mnie. Musiałem utworzyć plik pem z klucza publicznego ssh, który wygenerowałem dla mojego klienta SFTP (Cyberduck).

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
l3e0wu1f
źródło
to tak naprawdę nie działa.
outside2344
5
Działa to TYLKO dla prywatnego klucza RSA, a NIE dla klucza publicznego OP. Tak zła odpowiedź.
Devy,
3
Właściwie id_rsajest już w odpowiednim formacie, możesz to sprawdzić sam, wynik id_rsa.pemjest w 100% identyczny.
Miro Kropacek