Criando um certificado SSL * .local

5

Estou tentando configurar um único certificado SSL que fará com que qualquer site * .local funcione por meio de https. Eu tenho todos os domínios .local apontando para minha máquina local. Eu uso isso ao desenvolver sites. Um monte de novos recursos (localização geográfica, trabalhadores de serviços, etc.) exigem um SSL.

Acredito que, para versões recentes do Chrome / Firefox, um certificado auto-assinado da antiga escola não funciona mais.

Abaixo estão os passos que tomei após seguir uma combinação destes guias: link

link

link

Aqui está o meu arquivo de configuração:

#..................................
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /home/*****/Sites/root-ca
serial = $dir/serial
database = $dir/index.txt
new_certs_dir = $dir/certs
certificate = $dir/certs/cacert.pem
private_key = $dir/private/cakey.pem
default_days = 3000
default_md = sha256
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match
copy_extensions = copyall
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 2048 # Size of keys
default_keyfile = key.pem # name of generated keys
default_md = md5 # message digest algorithm
string_mask = nombstr # permitted characters
distinguished_name = req_distinguished_name
req_extensions = v3_req
[ req_distinguished_name ]
# Variable name Prompt string
#------------------------- ----------------------------------
0.organizationName = Organization Name (company)
organizationalUnitName = Organizational Unit Name (department, division)
emailAddress = Email Address
emailAddress_max = 40
localityName = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
commonName = Common Name (hostname, IP, or your name)
commonName_max = 64
# Default values for the above, for consistency and less typing.
# Variable name Value
#------------------------ ------------------------------
0.organizationName_default = *****
localityName_default = *****
stateOrProvinceName_default = *****
countryName_default = *****
emailAddress_default = *****
[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName       = @alternate_names
[ v3_req ]
subjectKeyIdentifier = hash
basicConstraints     = CA:FALSE
keyUsage             = digitalSignature, keyEncipherment
subjectAltName       = @alternate_names
nsComment            = "OpenSSL Generated Certificate"

[ alternate_names ]

DNS.1       = *.local

Primeiro, crie uma nova autoridade de certificação:

openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out certs/cacert.pem -days 3000 -config conf/caconfig.cnf

Eu dei o nome comum aqui como meu nome

Common Name (hostname, IP, or your name) []:Jonathan Hodgson

O arquivo certs/cacert.pem I então é importado para as autoridades do cromo que funcionam sem problemas.

Eu então crio um pedido de certificado:

openssl req -extensions v3_req -new -nodes -out local.req.pem -keyout private/local.key.pem -config conf/caconfig.cnf

Eu dei o nome comum aqui como * .local

Common Name (hostname, IP, or your name) []:*.local

Eu assino o pedido:

openssl ca -out certs/local.cert.pem  -config conf/caconfig.cnf -infiles local.req.pem

Eu adiciono os arquivos à minha configuração http:

<VirtualHost *:80>
    ServerName test.local
    ServerAlias *.local
    VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
    CustomLog /home/jonathan/Sites/access.log vhost_combined
    ErrorLog /home/jonathan/Sites/error.log
</VirtualHost>

<VirtualHost *:443>
    ServerName test.local
    ServerAlias *.local
    VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
    CustomLog /home/jonathan/Sites/access.log vhost_combined
    ErrorLog /home/jonathan/Sites/error.log
    SSLEngine On
    SSLCertificateFile /home/jonathan/Sites/root-ca/certs/local.cert.pem
    SSLCertificateKeyFile /home/jonathan/Sites/root-ca/private/local.key.pem
</VirtualHost>

Eu reiniciei o apache, mas ainda estou recebendo NET::ERR_CERT_COMMON_NAME_INVALID

Eu estava com a impressão de que isso era porque eu precisava adicionar o subjectAltName ao arquivo de configuração que fiz.

Por favor, deixe-me saber o que devo fazer de diferente.

Agradecemos antecipadamente por qualquer ajuda

Editar

Acho que o problema está relacionado ao curinga. Se eu definir o alternate_names como example.local e o nome comum da solicitação como example.local, example.local será exibido como seguro no Chrome e no Firefox.

Eu tentei definir o DNS.1 como local e DNS.2 como *.local , depois, recebi apenas ERR_SSL_SERVER_CERT_BAD_FORMAT no chrome e SEC_ERROR_REUSED_ISSUER_AND_SERIAL no firefox. Eu definitivamente restaurei meu arquivo serial e meu arquivo de índice antes de gerar os certificados.

    
por Jonathan Hodgson 19.06.2017 / 16:38

3 respostas

4

Você adicionou SAN ao CSR , mas não disse ca para incluir extensões do CSR no certificado. Vejo link ou a página do manual para ca < a href="https://www.openssl.org/docs/man1.1.0/apps/ca.html"> também na web em copy_extensions

EDIT: Você também precisa especificar x509_extensions no ca config, ou equivalente, mas menos conveniente na opção de linha de comando -extensions , em ambos os casos apontando para uma seção que existe, mas pode fique vazio se você não quiser nenhuma extensão necessária para a CA. Eu não percebi isso no começo porque eu nunca tinha tentado o caso de extensões do CSR somente e não a configuração, o que não é realista para a maioria das CAs. Se você especificar copy_extensions diferente de none (e o CSR tiver alguns), mas não especificar x509_extensions , então ca faz colocar as extensões no certificado, mas não defina a versão cert para v3 conforme exigido pelos padrões (como rfc5280) quando as extensões estiverem presentes.

É discutível se isso é um bug; a manpage diz que x509_extensions/extensions controla a configuração v3, e não dizendo que qualquer coisa semelhante sobre copy_extensions implica que não, mas IMHO é certamente uma característica muito abaixo do ideal. EDIT: é um bug e será corrigido, mas até então usar a solução alternativa, consulte link

NO ENTANTO: no meu teste, isso não resolveu o seu problema. Mesmo que o certificado tenha *.local em SAN e CN e seja (agora) válido, meu Firefox (53.0.2) e Chrome (59.0.3071.109) ainda o rejeitam com SSL_ERROR_CERT_DOMAIN_ERROR e ERR_CERT_COMMON_NAME_INVALID respectivamente. Eu acho que eles podem não estar excluindo local da lógica de nível 2 + normal e tentei *.example.local : o Chrome aceita isso, mas o Firefox não aceita. Eu também tentei *.example.org e o Chrome e o IE11 como isso mas ainda não o Firefox (e é claro atribuir nomes para você em TLDs reais como .org não é o modo como o DNS deve funcionar). / p>

Isso me deixa preso. Com algum trabalho OpenSSL pode ser feito para gerar um certificado contendo quase tudo o que você quiser, mas o que o Firefox eo Chrome aceitarão eu não sei. Vou tentar investigar e atualizar se encontrar algo.

Espero que você queira dizer que você forneceu *.local como o CommonName apenas para o CSR do servidor e NÃO para o certificado da CA (autoassinado). Se os nomes de assunto para CA e certs de folha forem os mesmos, nada funcionará de maneira confiável. EDIT: seu Q editado confirma que eles foram corretamente diferentes. Embora não mencione também a especificação de País, Estado e Organização, conforme exigido pela política ca que você usou.

Nota 'auto-assinado' é um termo de arte e significa assinado com a mesma chave . Seu certificado da CA é autoassinado. O certificado do servidor é assinado por você mesmo usando sua própria chave, mas não é <-> assinado . Tentar aplicar instruções para um certificado autoassinado a um certificado não auto-assinado fazia parte do seu problema.

E o ponto de Gilles sobre md5 para o algoritmo de assinatura também está correto.

EDIT: 'redefinir' serial (e índice) para uma configuração de openssl ca é uma má idéia, a menos que você descarte permanentemente o certificado da CA e o nome para o qual foram usados. Os padrões dizem que uma determinada CA não deve emitir mais de um certificado com o mesmo valor serial no certificado, e o arquivo serial é o caminho que o openssl ca (e também x509 -req ) implementa. CAs 'reais' (públicas) atualmente não usam mais um contador simples, mas incluem entropia para bloquear ataques de colisão no PKI - google hashclash - mas isso não é um problema para uma CA pessoal como a sua. Eu posso prontamente acreditar que um navegador (ou outro relier) está insatisfeito se ele vê vários certs com o mesmo nome de CA e serial, embora eu NÃO espere que um navegador armazene persistentemente um cert leaf - e, portanto, veja os antigos e os novos em um processo, a menos que seja de longa duração - a menos que você o importe para a loja aplicável, inclusive no Firefox, se você torná-lo uma "exceção" permanente.

    
por 21.06.2017 / 05:56
1

Os certificados curinga não são permitidos para um domínio de nível superior como .local ou .com e também não são aceitos pelo Firefox ou pelo IE. link .

    
por 26.06.2017 / 17:00
0

Pelo menos um problema óbvio é que você está criando um certificado assinado com o MD5 . O MD5 foi descontinuado por um tempo e quebrado em certificados especificamente desde 2012. Nenhum servidor respeitável o suportou há algum tempo.

Altere default_md md5 para default_md sha256 .

Se você está seguindo um tutorial que recomenda o MD5, jogue fora, é muito antigo para ser útil.

Observe que não analisei se há outros problemas. Os registros do servidor devem ser úteis.

    
por 21.06.2017 / 01:27