Como recuperar um URL HTTPS no Mac OS X sem avisos sobre uma autoridade não confiável?

7

O código a seguir deve, em princípio, retornar o conteúdo de https://badssl.com

(with-current-buffer
    (url-retrieve-synchronously "https://badssl.com")
  (buffer-string))

Mas com o meu GNU Emacs 25.0.50.1 (x86_64-apple-darwin13.4.0, NS appkit-1265.21 Version 10.9.5 (Build 13F1112)) of 2015-08-24no OS X 10.10.5, execute with -Q, ele me mostra esta mensagem:

Certificate information
Issued by:          COMODO RSA Domain Validation Secure Server CA
Issued to:          Domain Control Validated
Hostname:           *.badssl.com
Public key:         RSA, signature: RSA-SHA256
Protocol:           TLS1.2, key: ECDHE-RSA, cipher: AES-128-GCM, mac: AEAD
Security level:     Medium
Valid:              From 2015-04-09 to 2016-07-07


The TLS connection to badssl.com:443 is insecure for the following
reasons:

the certificate was signed by an unknown and therefore untrusted authority
certificate could not be verified

e pergunta se aceita o certificado - Não / Sessão / Sempre. Funciona se eu aceitar o certificado.

Eu não tenho o mesmo problema com, por exemplo, o wget. O Wget baixa corretamente (sem fazer a pergunta) https://badssl.com e rejeita https://self-signed.badssl.com .

Além disso, parece haver dois grupos de personalização separados - gnutls e tls. Eu compilei anteriormente o emacs com suporte para gnutls ( gnutls-available-pretornos t). Gnutls foi instalado com homebrew.

Se eu definir gnutls-verify-errorcomo t, em vez disso, recebo o erro

gnutls-negotiate: Certificate validation failed badssl.com, verification code 42

então presumivelmente gnutls não estava sendo usado no primeiro exemplo. No OS X, nenhum dos arquivos mencionados em gnutls-trustfiles(in /usr/ssle /etc/ssl) existe.

Então, como posso configurar o emacs para usar os certificados raiz confiáveis ​​padrão no OS X?

Editar: se eu instalar a libresslpartir do homebrew e adicionar /opt/brew/etc/libressl/cert.pema gnutls-trustfiles, o problema desaparece ao usar gnutls-verify-errordefinido como t.

Edit 2: Nos meus testes, parecia que o valor de tls-certtool-programrealmente não era usado, mas pode estar incorreto para o OS X de qualquer maneira: a certtool padrão no OS X não é a certnol GnuTLS exigida pelo tls.el e com os gnutls do homebrew Eu acho que deveria ser gnutls-certtool.

Kirill
fonte
Não consigo reproduzir esse comportamento com o tronco Emacs atual. O seu é bastante antigo, crie o tronco atual e tente novamente.
@ Lunaryorn Eu recebo o mesmo problema com o tronco atual.
22915 Kirill
Como você construiu o Emacs? Particularmente, quais bandeiras você usou?
@lunaryorn ../emacs/configure --with-ns CPPFLAGS=-I/opt/brew/include LDFLAGS=-L/opt/brew/lib( ../emacssendo um clone de git://git.savannah.gnu.org/emacs.git) então makee make install. A saída de configuração diz que usa -lgnutls.
Kirill
@lunaryorn Você recebeu um erro (conforme o esperado) ao se conectar a expired.badssl.com ou self-signed.badssl.com em vez de badssl.com no exemplo?
22915 Kirill

Respostas:

8

Adicionar /private/etc/ssl/cert.pema gnutls-trustfiles:

  1. M-x customizar-variável
  2. Customize variable: gnutls-trustfiles
  3. Selecione o último [INS]
  4. Bundle filename: /private/etc/ssl/cert.pem
  5. Selecione [ Apply and Save ]
Danielle
fonte
4

Para resolver esse problema, parece suficiente:

  • Defina gnutls-verify-errorcomo te
  • Adicione um arquivo de certificado raiz confiável apropriado a gnutls-trustfiles- a configuração padrão para essa lista não inclui nenhum arquivo existente no OS X e parece não usar o conjunto de chaves do sistema.

Isso pode ser feito, por exemplo, instalando a libresslpartir do homebrew e adicionando o arquivo $(brew --prefix)/etc/libressl/cert.pem- o homebrew diz que esse arquivo é criado a partir do chaveiro do sistema. Definir a variável gnutls-log-levelcomo um valor positivo mostra que ele realmente usa esse arquivo.

Nota: Com essas configurações, recebo uma mensagem não relacionada extra de gnutls dizendo

gnutls.c: [audit] Observe que o nível de segurança da troca de chaves Diffie-Hellman foi reduzido para 256 bits e isso pode permitir a descriptografia dos dados da sessão

Isso pode ser corrigido configurando- gnutls-min-prime-bitsse um valor maior que o padrão emacs (256) e maior que o que o gnutls considera inseguro (768) como o 3072, consulte http://gnutls.org/manual/html_node/Selecting-cryptographic-key- size.html e http://www.keylength.com/en/3/ - define o tamanho mínimo do grupo para a troca de chaves Diffie-Hellman.

Kirill
fonte
2
Existe algum plano para que o Emacs funcione corretamente por padrão? Parece muito trabalho.
Radon Rosborough
0

Adicionar /private/etc/ssl/cert.pemparece fazer o trabalho.

Canatella
fonte
5
Por favor, esclareça como / onde adicioná-lo, e esclareça o que é "(você quer dizer um arquivo ou um nome de arquivo?)",
Stefan Stefan