Obter nome comum (CN) do certificado SSL?

64

Eu tenho um arquivo SSL CRT no formato PEM. Existe uma maneira de extrair o nome comum (CN) do certificado da linha de comando?

Naftuli Kay
fonte
3
Observe, no entanto, que nos certificados de vários domínios, o CN não contém todos eles.
Torsten Bronger

Respostas:

90

Se você opensslinstalou, você pode executar:

openssl x509 -noout -subject -in server.pem
Jeff Smith
fonte
5
Você pode extrair a CN do assunto com:openssl x509 -noout -subject -in server.pem | sed -n '/^subject/s/^.*CN=//p'
Matthew Buckett
11
Modifiquei o que o @MatthewBuckett disse e usei 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.
Flungo
11
Adicionar \*ao que @flungo utilizados para apoiar domínios curinga: sed -e 's/^subject.*CN=\([a-zA-Z0-9\.\-\*]*\).*$/\1/' ( [^/]funciona no meu caso, embora)
Bryn
11
Os sedcomandos 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/\/.*$//'.
Ohad Schneider
6
Maneira mais fácil de separar CN de outros RDN / ATVs no nome do assunto: openssl x509 -noout -subject -nameopt multiline | grep commonNameou apenas para o valor| sed -n 's/ *commonName *= //p'
dave_thompson_085
7
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 egrepisso 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

certtoolfaz parte do gnutls, se não estiver instalado, procure por isso. O GnuTLS é um pouco melhor que o OpenSSL, IMO.

Cachinhos Dourados
fonte
2
Boa resposta, +1. Para o Mac OS X, tive que usar o gnutls-certtoolque foi instalado via #brew install gnutls
Mike D
na instalação debiangnutls-bin
rubo77 7/10
1

Encontrei a resposta acima e achei muito útil, mas também achei que a certtoolsintaxe 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 .crtnã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 opensslneste caso.

Mike Robinson
fonte
11
Suspeito que estamos falando de softwares completamente diferentes. Eu nunca vi uma versão dessas certtoolopções que aceitasse os operadores usuais ( -ou --), e man certtoolpara 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:
goldilocks
"-i, --certificate-info: imprime informações no certificado fornecido", enquanto "-d" é "--debug". Muito estranho. O_o?
Goldilocks
-1

Eu usei: openssl x509 -noout -subject -in mycert.crt | awk -F= '{print $NF}'add | sed -e 's/^[ \t]*//'Se você não pode viver com o espaço em branco

djieno
fonte