Nota: Esta no es realmente una pregunta porque ya encontré la respuesta, pero como no la encontré fácilmente aquí, la publicaré para que pueda beneficiar a otros.
Pregunta: ¿Cómo leer un archivo PEM concatenado como el utilizado por la directiva apache / mod_ssl SSLCACertificateFile ?
Respuesta (original) ( fuente ):
cat $file|awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}'
Esto puede dejar un archivo vacío si hay una línea en blanco al final, como con openssl pkcs7 -outform PEM -in my-chain-file -print_certs
. Para evitar eso, verifique la longitud de la línea antes de imprimir:
cat $file|awk 'split_after==1{n++;split_after=0}
/-----END CERTIFICATE-----/ {split_after=1}
{if(length($0) > 0) print > "cert" n ".pem"}'
Respuesta 29/03/2016 :
Siguiendo la respuesta de @slugchewer , csplit
podría ser una opción más clara con:
csplit -f cert- $file '/-----BEGIN CERTIFICATE-----/' '{*}'
openssl
tomar un certificado para analizar.Respuestas:
El fragmento awk funciona para extraer las diferentes partes, pero aún necesita saber qué sección es la clave / certificado / cadena. Necesitaba extraer una sección específica, y encontré esto en la lista de correo de OpenSSL: http://openssl.6102.n7.nabble.com/Convert-pem-to-crt-and-key-files-tp47681p47697.html
fuente
Esto fue respondido previamente en StackOverflow :
Editar 29/03/2016 : Ver respuesta @slugchewer
fuente
El
split
comando está disponible en la mayoría de los sistemas, y es probable que su invocación sea más fácil de recordar.Si tiene un archivo
collection.pem
que desea dividir enindividual-*
archivos, use:Si no tienes
split
, puedes probarcsplit
:fuente
-p
opción (ni las páginas de manual que leí ) en split. Tal vez esté utilizando un paquete / binario especialcsplit
lugar ... (ver edición anterior)csplit
!csplit: *}: bad repetition count
(pero la división parece funcionar)Si desea obtener un solo certificado de un paquete PEM de múltiples certificados, intente:
openssl
comandos procesarán un archivo PEM y lo volverán a escupir con líneas"subject:"
y"issuer:"
líneas antes de cada certificado. Si su PEM ya está formateado de esta manera, todo lo que necesita es elawk
comando final .Source1 , source2
fuente
También vale la pena señalar que los archivos PEM son solo una colección de claves / certificados dentro
BEGIN
/END
bloques, por lo que es bastante fácil simplemente cortar / pegar si se trata de un solo archivo con una o dos entidades interesantes ...fuente
Si está manejando certificados de cadena completa (es decir, los generados por letsencrypt / certbot, etc.), que son una concatenación del certificado y la cadena de autoridad de certificación, puede utilizar la manipulación de cadenas bash.
Por ejemplo:
Para extraer el certificado y la cadena de autoridad de certificación en variables:
Explicación:
En lugar de usar awk o openssl (que son herramientas poderosas pero no siempre disponibles, es decir, en las imágenes de Docker Alpine), puede usar la manipulación de cadenas bash.
"${FULLCHAIN%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----"
: desde el final del contenido de FULLCHAIN, devuelve la coincidencia de subcadena más larga, luego concat a-----END CERTIFICATE-----
medida que se elimina. El*
coincide con todos los personajes después-----END CERTIFICATE-----
.$(echo -e "${FULLCHAIN#*-----END CERTIFICATE-----}" | sed '/./,$!d')
: desde el comienzo del contenido de FULLCHAIN, devuelva la coincidencia de subcadena más corta y luego elimine las líneas nuevas. Del mismo modo,*
coincide con todos los personajes anteriores-----END CERTIFICATE-----
.Para una referencia rápida (mientras puede encontrar más sobre manipulación de cadenas en bash aquí ):
${VAR#substring}
= la subcadena más corta desde el principio del contenido de VAR${VAR%substring}
= la subcadena más corta desde el final del contenido de VAR${VAR##substring}
= la subcadena más larga desde el comienzo del contenido de VAR${VAR%%substring}
= la subcadena más larga desde el final del contenido de VARfuente
Hmmm ... casi de la misma manera que preparé la solución (como se sugirió y @Cerber) sin darme cuenta de que esta situación parece que mucha gente lo ha hecho. Mi solución sigue casi la misma lógica pero uso algunos comandos más básicos:
Mis todos los certificados están en el archivo:
certin.pem
Básicamente, esto sigue escribiendo en un archivo hasta que se encuentra "FIN" y luego comienza a escribir en otro archivo de manera incremental. De esta manera, tendrá un número "N" de archivos de salida ( certout0.pem, certout1.pem, etc.), dependiendo de cuántos certificados haya en su archivo pem de entrada ( certin.pem ).
fuente