Eu tenho um arquivo SSL CRT no formato PEM. Existe uma maneira de extrair o nome comum (CN) do certificado da linha de comando?
Eu tenho um arquivo SSL CRT no formato PEM. Existe uma maneira de extrair o nome comum (CN) do certificado da linha de comando?
Respostas:
Se você openssl
instalou, você pode executar:
openssl x509 -noout -subject -in server.pem
openssl x509 -noout -subject -in server.pem | sed -n '/^subject/s/^.*CN=//p'
sed -e 's/^subject.*CN=\([a-zA-Z0-9\.\-]*\).*$/\1/'
para obter apenas o domínio, pois eu tinha detalhes adicionais após a CN. A sua não é super-estrita correspondência para um CN válido, mas na maioria dos casos ele funciona, você poderia ser mais folga e substituir [a-zA-Z0-9\.\-]
com [^/]
, mas não estou certo de que seria sempre funciona.
\*
ao que @flungo utilizados para apoiar domínios curinga: sed -e 's/^subject.*CN=\([a-zA-Z0-9\.\-\*]*\).*$/\1/'
( [^/]
funciona no meu caso, embora)
sed
comandos sugeridos acima não funcionarão se o certificado tiver RDNs (Nomes Relativos Distintos) especificados após o Nome Comum (CN), por exemplo, OU (Unidade Organizacional) ou C (País). Uma maneira de atender a esses casos seria um adicional sed
: openssl x509 -noout -subject -in server.pem | sed 's/^.*CN=//' | sed sed 's/\/.*$//'
.
openssl x509 -noout -subject -nameopt multiline | grep commonName
ou apenas para o valor| sed -n 's/ *commonName *= //p'
certtool -i < whatever.pem | egrep "^\s+Subject:"
Observe que está direcionando o arquivo para a entrada padrão via <
, não o usando como argumento. Sans egrep
isso imprimirá o certificado inteiro, mas o CN está no Subject:
campo próximo ao topo (cuidado, também há um valor CN no Issuer:
campo).
X.509 Certificate Information:
Version: 3
Serial Number (hex): 01
Issuer: [...] CN=unixandlinux.ex <- Not this one.
Validity: ...
Subject: CN=goldilocks
certtool
faz parte do gnutls, se não estiver instalado, procure por isso. O GnuTLS é um pouco melhor que o OpenSSL, IMO.
gnutls-certtool
que foi instalado via #brew install gnutls
gnutls-bin
Encontrei a resposta acima e achei muito útil, mas também achei que a certtool
sintaxe do comando (no Ubuntu Linux hoje) era visivelmente diferente da descrita por goldilocks, assim como a saída. Por isso, achei melhor atualizar essa excelente resposta com o que poderia ser a "versão de hoje".
A "i"
opção (agora?) Significa "importação", de acordo com man certtool
, portanto, o comando apropriado parece ser "d"
"exibição". Então, este comando:
certtool d myfoo.crt
(A extensão do arquivo no meu caso simplesmente .crt
não é .pem
... isso não é relevante.)
... produz resultados que, na parte relevante, se parecem com isso:
Common Name : Foobar
Inquestionavelmente, os goldilocks estavam certos: certtool
é muito mais fácil trabalhar com a saída do que openssl
neste caso.
certtool
opções que aceitasse os operadores usuais ( -
ou --
), e man certtool
para as versões 3.5.8 (debian), 3.5.16 (fedora, a única versão depois disso no ramo estável upstream) é 3.5.17. há um mês), a documentação online do GnuTLS e, de fato, a página de manual online do Ubuntu 17.10 (mesma versão do debian atual) se referem a: