Jak wygenerować klucz openSSL za pomocą hasła z wiersza poleceń?

107

Po pierwsze - co się stanie, jeśli nie podam hasła? Czy użyto jakiejś pseudolosowej frazy? Po prostu szukam czegoś „wystarczająco dobrego”, aby powstrzymać przypadkowych hakerów.

Po drugie - jak wygenerować parę kluczy z wiersza poleceń, podając hasło w wierszu poleceń?


W końcu udało mi się go uruchomić za pomocą tych poleceń, używając funkcji exec (), której używanie jest ogólnie uważane za niebezpieczne, ponieważ lepiej jest podać hasło w pliku. Mogę zaakceptować to ryzyko, ponieważ jestem pewien, że PHP zostanie uruchomione tylko na moim komputerze (z systemem Windows i bez polecenia PS).

openssl genrsa -aes128 -passout pass:foobar -out privkey.pem 2048
openssl rsa -in privkey.pem -passin pass:foobar -pubout -out privkey.pub

Wielkie dzięki dla @caf, bez którego nie byłoby to możliwe.

Żałuję tylko jednego - że bez względu na to, jak bardzo Google, nikt nie wydaje się openssl_pkey_new()pracować z Xampp w systemie Windows (co jest właściwym sposobem na wygenerowanie pary kluczy)

Mawg mówi, że przywróć Monikę
źródło
4
dlaczego openssl_pkey_new()... jest „właściwym” sposobem generowania pary kluczy?
Jake Berger
Windows (normalnie) nie ma, psale od Vista mawmic process get commandline
dave_thompson_085

Odpowiedzi:

210

Jeśli nie używasz hasła, klucz prywatny nie jest zaszyfrowany żadnym szyfrem symetrycznym - jest przesyłany całkowicie bez ochrony.

Możesz wygenerować parę kluczy, podając hasło w wierszu poleceń za pomocą wywołania takiego jak (w tym przypadku hasło to foobar):

openssl genrsa -aes128 -passout pass:foobar 3072

Należy jednak pamiętać, że to hasło może zostać przechwycone przez dowolny inny proces działający w tym czasie na komputerze, ponieważ argumenty wiersza poleceń są ogólnie widoczne dla wszystkich procesów.

Lepszą alternatywą jest zapisanie hasła do pliku tymczasowego chronionego uprawnieniami do pliku i określenie, że:

openssl genrsa -aes128 -passout file:passphrase.txt 3072

Lub podaj hasło na standardowe wejście:

openssl genrsa -aes128 -passout stdin 3072

Możesz także użyć nazwanego potoku z file:opcją lub deskryptorem pliku.


Aby następnie uzyskać pasujący klucz publiczny, musisz użyć openssl rsatego samego hasła z -passinparametrem, które zostało użyte do zaszyfrowania klucza prywatnego:

openssl rsa -passin file:passphrase.txt -pubout

(Oczekuje zaszyfrowanego klucza prywatnego na standardowym wejściu - zamiast tego można go odczytać z pliku za pomocą -in <file>).


Przykład tworzenia 3072-bitowej pary kluczy prywatnych i publicznych w plikach, z parą kluczy prywatnych zaszyfrowanych hasłem foobar:

openssl genrsa -aes128 -passout pass:foobar -out privkey.pem 3072
openssl rsa -in privkey.pem -passin pass:foobar -pubout -out privkey.pub
kawiarnia
źródło
+1 Świetnie, to działa! Dzięki, jeśli możesz trochę więcej pomóc nastolatkowi, otrzymasz odpowiedź ... dlaczego to nie zadziała? openssl rsa -in privkey.pem -pubout -passout pass: foobar -out pubkey.pem
Mawg mówi, że przywróć Monikę
inaczej mówiąc - jak uzyskać klucz publiczny z twojego polecenia (który nieco się różnił od mojego). Potrzebuję tylko dopasowanej pary. To tylko „po prostu wystarczająco dobre” zabezpieczenie.
Mawg mówi, że przywróć Monikę
4
@Mawg: Twoje opensslpolecenie wyświetla klucz publiczny odpowiadający dostarczonemu kluczowi prywatnemu - klucze publiczne nie są szyfrowane (nie są tajne), więc używanie -passoutnie ma sensu. Prawdopodobnie będziesz chciał użyć -passintam hasła, które zostało użyte do zaszyfrowania klucza prywatnego w pierwszym kroku. Dodałem też coś do odpowiedzi.
kawiarnia
@caf, dzięki za wspaniałe opinie (jeszcze raz +1). Jednak najwyraźniej jestem zbyt głupi, aby móc używać OpenSSL. Chcę mieć klucz w pliku iz jakiegoś powodu openssl genrsa 2048 -aes128 -passout pass:foobar -out privkey.pemtego nie robi. Czy możesz mi podać dwie komendy - jedną do wygenerowania klucza prywatnego do pliku i drugą do wygenerowania klucza publicznego (również w pliku)? Przepraszam, że jestem taka uciążliwa, ale
bawiłem się
3
@Mawg: OpenSSL nie lubi, jeśli -outparametr pojawia się po 2048- naprawdę, to ma być ostatnia rzecz w linii poleceń (zaktualizowałem moją odpowiedź jako taką). Zobacz ostatni przykład, myślę, że tego chcesz. Jeśli chodzi o AES-128, ktoś , komu ufam w tych sprawach, zaleca go zamiast AES-256.
kawiarnia
9

genrsazostał zastąpiony przezgenpkey & po ręcznym uruchomieniu w terminalu zapyta o hasło:

openssl genpkey -aes-256-cbc -algorithm RSA -out /etc/ssl/private/key.pem -pkeyopt rsa_keygen_bits:4096

Jednak po uruchomieniu ze skryptu komenda nie poprosi o podanie hasła, więc aby uniknąć wyświetlenia hasła, gdy proces używa funkcji w shellskrypcie:

get_passwd() {
    local passwd=
    echo -ne "Enter passwd for private key: ? "; read -s passwd
    openssl genpkey -aes-256-cbc -pass pass:$passwd -algorithm RSA -out $PRIV_KEY -pkeyopt rsa_keygen_bits:$PRIV_KEYSIZE
}
Stuart Cardall
źródło