Wyodrębnij klucz publiczny / prywatny z pliku PKCS12 do późniejszego użycia w uwierzytelnianiu SSH-PK

194

Chcę wyodrębnić klucz publiczny i prywatny z mojego PKCS#12pliku do późniejszego użycia w uwierzytelnianiu klucza publicznego SSH.

W tej chwili generuję klucze za pomocą ssh-keygen, do którego wkładam .ssh/authorized_key, odpowiednio gdzieś po stronie klienta.

W przyszłości chcę używać kluczy z PKCS#12kontenera, więc najpierw muszę wyodrębnić klucz publiczny, PKCS#12a następnie umieścić je w .ssh/authorized_keyspliku. Czy jest jakaś szansa, aby to zadziałało openssl? Czy klucze są PKCS#12zgodne z uwierzytelnianiem ssh-public-key?

lazydaemon
źródło

Odpowiedzi:

283

Do wyodrębnienia klucza publicznego / prywatnego z kontenera PKCS # 12 można użyć następujących poleceń:

  • PKCS nr 1 Klucz prywatny

    openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
    
  • Certyfikaty:

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
    
Nilesh
źródło
7
polecenia działają, ale klucz prywatny jest eksportowany jako format PKCS1 i potrzebuję PKCS8 ... Czy jest jakaś opcja, której mi brakuje? Na przykład eksportuje „----- ROZPOCZNIJ KLUCZ PRYWATNY -----„ ale potrzebuję ”----- ROZPOCZNIJ KLUCZ PRYWATNY -----”
edthethird
4
Aby to zrobić, możesz spróbowaćopenssl rsa -in privateKey.pem -out private.pem
Francois,
28
@edthethird: Aby uzyskać PKCS8, dodaj flagę -nodes
Christopher K.,
7
Aby wyeksportować bez hasła, dodaj -passout pass:. Oczekuje, że parametr będzie miał postać pass: mypassword. stackoverflow.com/a/27497899/206277
nidheeshdas
2
@ChristopherK. dzięki! to było dla mnie dobre. dodanie -nodespoprawnie eksportuje klucz
TecHunter
85

Jest to możliwe przy odrobinie konwersji formatu.

Aby wyodrębnić klucz prywatny w formacie openssh, można użyć:

openssl pkcs12 -in pkcs12.pfx -nocerts -nodes | openssl rsa > id_rsa

Aby przekonwertować klucz prywatny na klucz publiczny:

openssl rsa -in id_rsa -pubout | ssh-keygen -f /dev/stdin -i -m PKCS8

Aby wyodrębnić klucz publiczny w formacie openssh, można użyć:

openssl pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8
ryanc
źródło
2
Dziękuję Ci! Pierwsza linia była tą, której potrzebowałem. Tylko klucz, niezaszyfrowany, dzięki czemu można go zainstalować za pomocą większości zautomatyzowanych systemów CDN.
BTC
1
@PhilipRego Myślę, że masz pomieszane klucze publiczne i prywatne. Klucz publiczny RSA ma dwie wartości: „e” wykładnik publiczny i „n” moduł - obie są przechowywane obok prywatnych części klucza.
ryanc
17

OpenSSH nie może używać plików PKCS # 12 po wyjęciu z pudełka. Jak sugerowali inni, musisz wyodrębnić klucz prywatny w formacie PEM, który przeniesie Cię z krainy OpenSSL do OpenSSH. Inne wymienione tutaj rozwiązania nie działają dla mnie. Używam OS X 10.9 Mavericks (obecnie 10.9.3) z narzędziami „paczkowanymi” (OpenSSL 0.9.8y, OpenSSH 6.2p2).

Najpierw wyodrębnij klucz prywatny w formacie PEM, który będzie używany bezpośrednio przez OpenSSH:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa > ~/.ssh/id_rsa

Zdecydowanie sugeruję zaszyfrowanie klucza prywatnego hasłem:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa -passout 'pass:Passw0rd!' > ~/.ssh/id_rsa

Oczywiście pisanie hasła w postaci zwykłego tekstu w wierszu poleceń również nie jest bezpieczne, dlatego należy usunąć ostatnie polecenie z historii lub po prostu upewnić się, że go nie dostanie. Różne muszle mają różne sposoby. Możesz poprzedzić swoje polecenie spacją, aby zapobiec zapisaniu go w historii w Bash i wielu innych powłokach. Oto także, jak usunąć polecenie z historii w Bash:

history -d $(history | tail -n 2 | awk 'NR == 1 { print $1 }')

Alternatywnie możesz użyć innego sposobu, aby przekazać hasło klucza prywatnego do OpenSSL - zapoznaj się z dokumentacją OpenSSL, aby uzyskać argumenty wyrażenia hasła .

Następnie utwórz klucz publiczny OpenSSH, który można dodać do pliku uprawnionych kluczy:

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
Frzng
źródło
Po co to jest | openssl rsa?
Snekse
1
@Snekse upewnia się, że w danych wyjściowych jest tylko klucz prywatny. W moim przypadku tworzy plik tożsamości ( ~/.ssh/id_rsa) z pewnym „cruft”, takim jak atrybuty torby bez `| openssl rsa`. Wydaje mi się, że OpenSSH i inne narzędzia, które używają pliku tożsamości, potrafią poradzić sobie z tym cruftem (nie próbowałem), ale jestem po prostu przyzwyczajony do dostarczania tylko niezbędnych danych i nic więcej, szczególnie jeśli chodzi o bezpieczeństwo.
frzng
1
Ta odpowiedź pomogła mi uzyskać dostęp do klucza prywatnego formatu PEM w terminalu, który udało mi się skopiować / wkleić: openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
BillyRayCyrus
7

Rozwiązanie 1:

Wyodrębnij P12 z jks

keytool -importkeystore -srckeystore MyRootCA.jks -destkeystore MyRootCA.p12 -deststoretype PKCS12

Wyodrębnij PEM z P12 i Edytuj plik i pem z pliku crt

openssl pkcs12 -in MyRootCA.p12 -clcerts -nokeys -out MyRootCA.crt

Wyodrębnij klucz z jks

openssl pkcs12 -in MyRootCA.p12 -nocerts -out encryptedPrivateKey.pem
openssl rsa -in encryptedPrivateKey.pem -out decryptedPrivateKey.key

Rozwiązanie 2:

Wyodrębnij PEM i encryptedPrivateKey do pliku txt ''

openssl pkcs12 -in MyRootCA.p12 -out keys_out.txt

Odszyfruj klucz prywatny

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key
Ali Alimohammadi
źródło
1
Odpowiadając na pytania, warto wyróżnić polecenia. Możesz to zrobić, dodając trzy cudzysłowy przed i po komendzie, dzięki czemu staje się `` echo witaj '' echo hello.
PatS
2

Aktualizacja: Zauważyłem, że moja odpowiedź była tylko kiepskim duplikatem dobrze wyjaśnionego pytania na stronie https: //unix.stackexchange.com / ... autorstwa BryKKan

Oto fragment z niego:

openssl pkcs12 -in <filename.pfx> -nocerts -nodes | sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > <clientcert.key>

openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <clientcert.cer>

openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <cacerts.cer>
gvlax
źródło
3
Dodanie jakiegoś wyjaśnienia uczyni tę odpowiedź bardziej przydatną.
mx0,
0

O ile wiem PKCS # 12 to tylko magazyn certyfikatów / kluczy publicznych / prywatnych. Jeśli wyodrębniłeś klucz publiczny z pliku PKCS # 12, OpenSSH powinien móc go używać, dopóki jest on wyodrębniony w formacie PEM . Prawdopodobnie już wiesz, że potrzebujesz również odpowiedniego klucza prywatnego (również w PEM ), aby móc go używać do uwierzytelniania ssh-kluczem publicznym.

Sirgeorge
źródło
0

Zaakceptowana odpowiedź to poprawne polecenie, chcę tylko dodać jedną dodatkową rzecz, podczas wyodrębniania klucza, jeśli pozostawisz "Enter PEM pass phrase:"puste hasło PEM ( ), pełny klucz nie zostanie wyodrębniony, ale tylkolocalKeyID zostanie wyodrębniony. Aby uzyskać pełny klucz, musisz podać hasło PEM, uruchamiając następujące polecenie.

Pamiętaj, że jeśli chodzi o hasło importowania, możesz podać rzeczywiste hasło "Enter Import Password:"lub pozostawić to hasło puste:

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
Arvind Sachdeva
źródło
1
To powinien być komentarz do zaakceptowanej odpowiedzi, a nie odpowiedź.
Styx