Uwaga: To nie jest tak naprawdę pytanie, ponieważ już znalazłem odpowiedź, ale ponieważ nie znalazłem jej tutaj łatwo, opublikuję ją, aby mogła przynieść korzyści innym.
Pytanie: Jak odczytać skonkatowany plik PEM jako plik używany przez dyrektywę apache / mod_ssl SSLCACertificateFile ?
Odpowiedź (oryginał) ( źródło ):
cat $file|awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}'
Może to pozostawić pusty plik, jeśli na końcu jest pusty wiersz, na przykład with openssl pkcs7 -outform PEM -in my-chain-file -print_certs
. Aby temu zapobiec, sprawdź długość linii przed drukowaniem:
cat $file|awk 'split_after==1{n++;split_after=0}
/-----END CERTIFICATE-----/ {split_after=1}
{if(length($0) > 0) print > "cert" n ".pem"}'
Odpowiedź 29.03.2016 :
W następstwie @slugchewer odpowiedź , csplit
może być wyraźniejszy opcja z:
csplit -f cert- $file '/-----BEGIN CERTIFICATE-----/' '{*}'
openssl
ten, którego analizowanie wymaga jednego certyfikatu.Odpowiedzi:
Fragment awk działa w celu wyodrębnienia różnych części, ale nadal musisz wiedzieć, która sekcja to klucz / cert / chain. Musiałem wyodrębnić określoną sekcję i znalazłem ją na liście mailingowej OpenSSL: http://openssl.6102.n7.nabble.com/Convert-pem-to-crt-and-key-files-tp47681p47697.html
źródło
Na to wcześniej odpowiedziano na StackOverflow :
Edytuj 29.03.2016: Zobacz odpowiedź @slugchewer
źródło
split
Polecenie jest dostępne w większości systemów, a jego wywołanie jest prawdopodobnie łatwiejsze do zapamiętania.Jeśli masz plik
collection.pem
, który chcesz podzielić naindividual-*
pliki, użyj:Jeśli nie masz
split
, możesz spróbowaćcsplit
:źródło
-p
opcji (ani stron, które czytam ) przy podziale. Być może używasz specjalnego pliku binarnego / pakietucsplit
zamiast tego spróbować ... (patrz edycja powyżej)csplit
!csplit: *}: bad repetition count
(ale split wydaje się działać)Jeśli chcesz uzyskać pojedynczy certyfikat z pakietu PEM z wieloma certyfikatami, spróbuj:
openssl
polecenia przetworzą plik PEM i wyplują go z poprzednimi wierszami"subject:"
i"issuer:"
wierszami przed każdym certyfikatem. Jeśli twój PEM jest już sformatowany w ten sposób, wszystko czego potrzebujesz to ostatnieawk
polecenie.źródło1 , źródło2
źródło
Warto również zauważyć, że pliki PEM są tylko zbiorem kluczy / certyfikatów wewnątrz
BEGIN
/END
bloków, więc dość łatwo jest wyciąć / wkleić, jeśli jest to pojedynczy plik z jednym lub dwoma interesującymi elementami ...źródło
Jeśli masz do czynienia z certyfikatami pełnego łańcucha (tj. Wygenerowanymi przez letsencrypt / certbot itp.), Które są połączeniem certyfikatu i łańcucha urzędu certyfikacji, możesz użyć manipulacji ciągiem bash.
Na przykład:
Aby wyodrębnić certyfikat i łańcuch urzędu certyfikacji do zmiennych:
Wyjaśnienie:
Zamiast używać awk lub openssl (które są potężnymi narzędziami, ale nie zawsze dostępne, tj. W obrazach Docker Alpine), możesz użyć manipulacji ciągiem bash.
"${FULLCHAIN%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----"
: od końca zawartości FULLCHAIN, zwróć najdłuższe dopasowanie podłańcucha, a następnie konkat,-----END CERTIFICATE-----
gdy zostanie usunięte. Te*
wszystkie mecze znaki po-----END CERTIFICATE-----
.$(echo -e "${FULLCHAIN#*-----END CERTIFICATE-----}" | sed '/./,$!d')
: od początku zawartości FULLCHAIN, zwróć najkrótsze dopasowanie podłańcucha, a następnie usuń wiodące nowe wiersze. Podobnie,*
pasuje do wszystkich wcześniejszych postaci-----END CERTIFICATE-----
.Dla szybkiego odniesienia (chociaż można znaleźć więcej na temat manipulacji ciągami w bash tutaj ):
${VAR#substring}
= najkrótszy podciąg od początku zawartości VAR${VAR%substring}
= najkrótszy podciąg od końca zawartości VAR${VAR##substring}
= najdłuższy podciąg od początku zawartości VAR${VAR%%substring}
= najdłuższy podciąg od końca zawartości VARźródło
Hmmm ... prawie w ten sam sposób, w jaki przygotowałem rozwiązanie (zgodnie z sugestią @Cerber), nie zdając sobie sprawy z tego, że wiele osób ma taką sytuację. Moje rozwiązanie działa zgodnie z tą samą logiką, ale używa bardziej podstawowych poleceń:
Moje wszystkie certyfikaty są w pliku:
certin.pem
Zasadniczo kontynuuj pisanie w pliku, aż napotka „END”, a następnie zacznij pisać do innego pliku w sposób przyrostowy. W ten sposób będziesz mieć liczbę „N” plików wyjściowych ( certout0.pem, certout1.pem itd.) W zależności od liczby certyfikatów w wejściowym pliku pem ( certin.pem ).
źródło