Como confiar em um certificado autoassinado na linha de comando cURL?

2

Eu criei um certificado autoassinado para foo.localhost usando uma Vamos Criptografar uma recomendação usando este Makefile:

include ../.env

configuration = csr.cnf
certificate = self-signed.crt
key = self-signed.key

.PHONY: all
all: $(certificate)

$(certificate): $(configuration)
    openssl req -x509 -out $@ -keyout $(key) -newkey rsa:2048 -nodes -sha256 -subj '/CN=$(HOSTNAME)' -extensions EXT -config $(configuration)

$(configuration):
    printf "[dn]\nCN=$(HOSTNAME)\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:$(HOSTNAME)\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth" > $@

.PHONY: clean
clean:
    $(RM) $(configuration)

Eu então atribuí isso a um servidor web. Eu verifiquei que o servidor retorna o certificado relevante:

$ openssl s_client -showcerts -connect foo.localhost:8443 < /dev/null
CONNECTED(00000003)
depth=0 CN = foo.localhost
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = foo.localhost
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/CN=foo.localhost
   i:/CN=foo.localhost
-----BEGIN CERTIFICATE-----
[…]
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=foo.localhost
issuer=/CN=foo.localhost
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1330 bytes and written 269 bytes
Verification error: unable to verify the first certificate
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: […]
    Session-ID-ctx: 
    Master-Key: […]
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket:
    […]

    Start Time: 1529622990
    Timeout   : 7200 (sec)
    Verify return code: 21 (unable to verify the first certificate)
    Extended master secret: no
---
DONE

Como faço para cURL confiar em sem modificar nada em / etc? --cacert não funciona, presumivelmente porque não há CA:

$ curl --cacert tls/foo.localhost.crt 'https://foo.localhost:8443/'
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

O objetivo é ativar o HTTPS durante o desenvolvimento:

  • Eu não posso ter um certificado completamente semelhante à produção sem muito trabalho para habilitar a verificação de DNS em todos os ambientes de desenvolvimento. Portanto, eu tenho que usar um certificado auto-assinado.
  • Eu obviamente ainda quero tornar meu ambiente de desenvolvimento o mais semelhante possível à produção, por isso não posso simplesmente ignorar todos os problemas de certificado. curl -k é como catch (Exception e) {} neste caso - nada como um navegador conversando com um servidor da Web.

Em outras palavras, ao executar curl [something] https://project.local/api/foo , quero ter certeza de que

  1. se o TLS estiver configurado corretamente , exceto por ter um certificado autoassinado , o comando será bem-sucedido e
  2. se eu tiver algum problema com minha configuração de TLS , exceto por ter um certificado autoassinado , o comando falhará.

O uso de HTTP ou --insecure falha no segundo critério.

    
por l0b0 22.06.2018 / 01:20

3 respostas

0

Um guia geral sem a maioria dos pequenos detalhes.

  • O comando openssl s_client está mostrando dois erros:

    verify error:num=20:unable to get local issuer certificate
    verify error:num=21:unable to verify the first certificate
    

    Isso significa que o armazenamento de certificados padrão em sua máquina não possui os certificados necessários.

Etapas:

  1. Você poderia criar um novo diretório (em qualquer lugar), processá-lo com o script c_rehash e informar ao openssl para usá-lo para verificar os certificados com a opção -CApath Directory . Faça alterações até se livrar de ambos os erros ao usar a opção -CApath .

  2. Em seguida, informe o curl sobre o diretório do certificado com:

    curl --capath <dir>
    

    e todas as outras opções necessárias.

Se você for bloqueado em algum lugar, comente.

    
por 13.09.2018 / 08:35
-1

Seguir estes passos deve resolver o seu problema:

  1. Faça o download e salve o certificado autoassinado: echo quit | openssl s_client -showcerts -servername "${API_HOST}" -connect "${API_HOST}":443 > cacert.pem
  2. Diga ao cliente curl sobre ele: curl --cacert cacert.pem --location --silent https://${API_HOST}

Além disso, pode-se usar wget e ignorar certificados com: wget --no-check-certificate https://${API_HOST}

    
por 11.09.2018 / 21:19
-2

Experimente -k :

curl -k https://yourhost/

Deve "aceitar" certificados auto-assinados

    
por 17.10.2018 / 01:55

Tags