AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 451207
Accepted
l0b0
l0b0
Asked: 2018-06-22 15:20:02 +0800 CST2018-06-22 15:20:02 +0800 CST 2018-06-22 15:20:02 +0800 CST

Como confiar no certificado autoassinado na linha de comando cURL?

  • 772

Criei um certificado autoassinado para foo.localhost usando uma recomendação do Let's Encrypt 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. 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 que o cURL confie nele sem modificar nada em /etc? --cacertnã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 é habilitar HTTPS durante o desenvolvimento:

  • 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, tenho que usar um certificado autoassinado.
  • Obviamente, ainda quero tornar meu ambiente de desenvolvimento o mais semelhante possível à produção, portanto, não posso simplesmente ignorar todos e quaisquer problemas de certificado. curl -ké como catch (Exception e) {}neste caso - nada como um navegador conversando com um servidor web.

Em outras palavras, ao correr 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á.

Usando HTTP ou --insecurefalha no segundo critério.

curl https
  • 7 7 respostas
  • 155357 Views

7 respostas

  • Voted
  1. V13
    2018-10-17T15:55:31+08:002018-10-17T15:55:31+08:00

    Experimente -k:

    curl -k https://yourhost/
    

    Deve "aceitar" certificados autoassinados

    • 41
  2. Robert Brisita
    2018-09-12T11:19:32+08:002018-09-12T11:19:32+08:00

    Seguir estas etapas deve resolver seu problema:

    1. Baixe e salve o certificado autoassinado:echo quit | openssl s_client -showcerts -servername "${API_HOST}" -connect "${API_HOST}":443 > cacert.pem
    2. Informe o curlcliente sobre isso: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}

    • 17
  3. Best Answer
    TrentP
    2020-04-25T12:12:26+08:002020-04-25T12:12:26+08:00

    Eu tive esse problema, exatamente o mesmo problema e mensagens de erro, mas usei o certtool do GNUTLS para gerar meu certificado em vez de openssl.

    Meu problema era que eu não tinha feito meu certificado auto-assinado uma CA. Ele foi configurado apenas para atuar como um certificado de servidor web. Que é tudo o que eu queria fazer com ele e não ia usá-lo como CA para assinar outros certificados.

    Mas quando você deseja adicionar um certificado à cadeia de confiança como emissor de outros certificados, esse certificado deve ser uma CA ou será rejeitado pelo openssl!

    Com certtool -i < mycert.crt, é preciso ver isso:

        Extensions:
                Basic Constraints (critical):
                        Certificate Authority (CA): TRUE
    

    Tente adicionar -addext basicConstraints=critical,CA:TRUE,pathlen:1ao seu comando openssl ou modificar seu arquivo cnf para o mesmo efeito.

    Ou use o certtool, é muito mais fácil para a geração única de certificados:

    certtool -p --outfile localhost.key
    certtool -s --load-privkey localhost.key --outfile localhost.crt
    

    E, em seguida, responda aos prompts para fornecer o CN do certificado e assim por diante. E diga sim quando perguntado se é para uma autoridade de certificação!

    • 9
  4. l0b0
    2021-10-19T18:46:55+08:002021-10-19T18:46:55+08:00

    trustme, usado por urllib3 , parece uma boa opção. Por seu leia-me:

    $ # ----- Creating certs -----
    $ python -m trustme
    Generated a certificate for 'localhost', '127.0.0.1', '::1'
    Configure your server to use the following files:
      cert=/tmp/server.pem
      key=/tmp/server.key
    Configure your client to use the following files:
      cert=/tmp/client.pem
    $ # ----- Using certs -----
    $ gunicorn --keyfile server.key --certfile server.pem app:app
    $ curl --cacert client.pem https://localhost:8000/
    Hello, world!
    
    • 3
  5. user232326
    2018-09-13T22:35:52+08:002018-09-13T22:35:52+08:00

    Não é válido ter uma cadeia de confiança que inclua um certificado autoassinado. Se fosse esse o caso, qualquer pessoa poderia fornecer uma cadeia de confiança válida (inventada). Se um certificado autoassinado aparecer em uma cadeia de confiança, ele deverá ser ignorado. Um certificado autoassinado só pode ser válido em um diretório local (controlado pelo proprietário do computador). O certificado fornecido a qualquer servidor deve ser encadeado ao certificado autoassinado.

    Um guia geral sem a maioria dos pequenos detalhes.

    • Sua saída do openssl s_clientcomando 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 um certificado que valida a cadeia fornecida no site que você usou. Você precisa de um diretório com um certificado autoassinado e um certificado encadeado para o servidor web.

    Passos:

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

    2. Gere um certificado encadeado para o servidor web.

    3. Em seguida, informe ao curl sobre o diretório de certificados com:

      curl --capath <dir>
      

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

    Isso limpará os dois erros.

    • 2
  6. Fagner Fonseca
    2022-02-05T08:42:55+08:002022-02-05T08:42:55+08:00

    A solução fornecida usando trustmefunciona perfeitamente, mas se alguém estiver interessado em criar os certificados para fins de aprendizado, estes são os passos que funcionaram para mim:

    1. Crie a CA raiz:

      openssl req -x509 -sha256 -days 1825 -newkey rsa:2048 -keyout rootCA.key -out rootCA.crt
      
    2. Crie a chave privada do servidor:

      openssl genrsa -out localhost.key 2048
      
    3. Crie a solicitação de assinatura de certificado:

      openssl req -key localhost.key -new -out localhost.csr
      
    4. Crie o localhost.extarquivo com o seguinte conteúdo:

      authorityKeyIdentifier=keyid,issuer
      basicConstraints=CA:FALSE
      subjectAltName = @alt_names
      [alt_names]
      DNS.1 = localhost
      

      Este arquivo tem a configuração de DNS para o certificado. Isso é importante, pois a verificação de TLS não será aprovada se o nome na URL não corresponder ao DNS no certificado.

    5. Assine o certificado do servidor com a CA raiz que foi criada antes:

      openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in localhost.csr -out localhost.crt -days 365 -CAcreateserial -extfile localhost.ext
      
    6. Converta os crtarquivos para o pemformato:

      openssl x509 -in localhost.crt -out localhost.pem
      openssl x509 -in rootCA.crt -out rootCA.pem
      

    Agora você deve ser capaz de usar o localhost.peme o localhost.keyno servidor. O cliente deve usar o rootCA.pempara se conectar ao servidor.

    No meu caso, tive que usar um jksarquivo. O pemarquivo pode ser convertido da jksseguinte forma:

    //first convert it to pkcs12
    openssl pkcs12 -export -in localhost.pem -inkey localhost.key -out serverCertificate.p12 -name "serverCertificate"
    
    //then convert it from pkcs12 to jks
    keytool -importkeystore -srckeystore serverCertificate.p12 -srcstoretype pkcs12 -destkeystore localhost.jks
    

    As entradas no keystore podem ser vistas usando este comando:

    keytool -keystore localhost.jks -list
    

    O localhost.jksdeve ser usado no servidor e a conexão pode ser testada usando:

    curl --cacert rootCA.pem https://localhost:<port>
    

    Referências:

    1. https://www.baeldung.com/openssl-self-signed-cert
    2. https://www.digicert.com/kb/ssl-support/openssl-quick-reference-guide.htm
    3. https://www.baeldung.com/convert-pem-to-jks
    • 2
  7. user2679859
    2020-05-05T12:58:09+08:002020-05-05T12:58:09+08:00

    Se você salvar o self-signed.crt do seu servidor, poderá passá-lo para o curl via "--cacert self-signed.crt" e o curl validará o certificado do seu servidor usando o certificado CA fornecido.

    • 0

relate perguntas

  • Não baixe o arquivo com curl se o arquivo já existir localmente

  • Como enrolar e descompactar para um determinado diretório? [duplicado]

  • Verificando um redirecionamento de URL do terminal

  • Obtendo o endereço URL do arquivo e verificando o código HTTP

  • Como baixar um arquivo no terminal cujo link redireciona e parece funcionar apenas na GUI?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve