Não é possível usar um certificado autoassinado. em localhost

2

Eu criei um certificado auto-assinado para localhost para testes da seguinte forma:

openssl genrsa -out key.pem 2048
openssl req -new -key key.pem -out certificate.csr
openssl x509 -req -in certificate.csr -signkey key.pem -out certificate.pem

Eu especifiquei "localhost" no FQDN. É isso, eu não fiz mais nada e não os copiei em qualquer lugar e todos os 3 arquivos estão no diretório do meu aplicativo.

Quando estou executando um servidor da Web que não é apache ou nginx no host local, recebo o seguinte erro:

$ curl -v https://localhost:3345
* Rebuilt URL to: https://localhost:3345/
*   Trying ::1...
* connect to ::1 port 3345 failed: Connection refused
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 3345 (#0)
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: none
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS alert, Server hello (2):
* SSL certificate problem: self signed certificate
* Closing connection 0
* TLSv1.2 (OUT), TLS alert, Client hello (1):
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

Se isso é importante, aqui está meu código:

startApp = do
  let port = 3345
  print $ "Listening the port " ++ (show port) ++ " ..."
  let tls = tlsSettings "certificate.pem" "key.pem"
  runTLS tls (setPort port defaultSettings) app

Então você vê que eu estou usando "pem" e "pem", não "csr" e a porta 3345.

Estou no Arch, mas também precisarei de uma solução para o Ubuntu.

Como posso corrigir o erro?

Note que em um navegador eu também tenho um erro. Em particular em FF:

The owner of localhost has configured their website improperly. To protect your information from being stolen, Firefox has not connected to this website.

    
por Jushiti 18.04.2016 / 11:11

1 resposta

2

O Curl usa o armazenamento confiável do seu sistema para verificar a confiança das cadeias de certificados por padrão. Esse armazenamento confiável contém uma lista de certificados de CA confiáveis. Como você se auto-assinou e não está usando uma cadeia que leva a um certificado de CA no truststore, o curl falhou em sua solicitação porque não confia em sua cadeia.

Ou:

  1. Obtenha seu CSR assinado por uma autoridade de certificação confiável em vez de assinar automaticamente ( Vamos criptografar é gratuito e confiável por quase todas as lojas confiáveis devido a o certificado raiz é vinculado a) ou
  2. Adicione seu certificado à sua loja de confiança do sistema ou
  3. Use --cacert <your cert> para confiar apenas neste certificado ou
  4. Use curl -k (não recomendado, pois nenhuma verificação é feita)
por 18.04.2016 / 11:17