Como corrigir curl: (60) certificado SSL: cadeia de certificados inválida ao usar o sudo

12

Portanto, como a atualização do Mavericks tem mais problemas com os certificados.

Ao tentar enrolar um arquivo do meu servidor da web com seu certificado autoassinado, estava recebendo o erro "Certificado SSL: cadeia de certificados inválida".

Isso foi corrigido adicionando o certificado ao meu chaveiro do sistema e configurando-o para sempre permitir SSL, informações que encontrei aqui e aqui .

Isso funciona bem e quando enrolado um arquivo, ele é baixado corretamente.

No entanto, se eu rodar curl com sudo antes (por exemplo, eu tenho um script que precisa ser rodado com sudo e faz uma curvatura nele), volto à mesma mensagem de erro.

Eu estou supondo que a raiz não lê o chaveiro do sistema, talvez?

Alguém sabe uma maneira de consertar isso?

Jacob Tomlinson
fonte

Respostas:

17

Se você armazenar seus certificados CA no sistema de arquivos (no formato PEM), poderá solicitar ao curl para usá-los com

sudo curl --cacert /path/to/cacert.pem ...

Você também pode desativar a verificação do certificado com

sudo curl --insecure ...

Editar: atualizado em relação ao feedback

Se você deseja definir isso permanentemente, crie um .curlrcarquivo e coloque-o em seu diretório pessoal. sudocomandos podem precisar desse arquivo em /var/rootO arquivo tem as mesmas opções da linha de comando, mas sem os hífens. Uma opção por linha:

cacert=/path/to/my/certs.pem
Dan
fonte
Obrigado pela sua resposta, o script que está sendo executado com o sudo é de terceiros e, portanto, não posso modificar o próprio comando curl. Inseguro não é realmente uma opção. Isso pode ser feito globalmente?
Jacob Tomlinson
Você pode criar um arquivo .curlrc e armazená-lo em sua pasta pessoal, embora, usando o sudo, seja necessário /var/root/.curlrc. O arquivo deve conter opções sem traços, um por linha. Assim, "cacert = / path / to / my / certs.pem"
Dan
1
+1 para configurar um rootdisponível em .curlrcvez de --insecure. O que é exatamente o que diz: para um invasor na posição de rede, seria trivial ao MITM e injetar código.
zigg
Obrigado por isso, parece o que estou procurando. Vou tentar amanhã e conceder recompensa, se funcionar.
Jacob Tomlinson
6

A raiz não lê as configurações atuais de confiança do usuário, mas existem configurações de confiança de administrador e configurações de confiança específicas do usuário raiz. (Elas também são distintas das configurações de confiança do sistema .) Observe também que as configurações de confiança do certificado são um pouco diferentes da adição de um certificado a um chaveiro; você pode marcar um certificado como confiável sem adicioná-lo totalmente. (A situação exata aqui não está clara para mim e os documentos que vi são vagos.)

Você pode marcar um certificado como confiável para o usuário atual como

$ security add-trusted-cert /path/to/cert.pem

mas isso não ajuda na raiz. A solução, como você pode adivinhar agora, é sudoa anterior, que a marca como confiável para o usuário root:

$ sudo security add-trusted-cert /path/to/cert.pem

ou use o -dsinalizador para adicioná-lo às configurações de confiança do administrador:

$ security add-trusted-cert -d /path/to/cert.pem

(O OS X abrirá uma caixa de diálogo de senha para confirmar esta.)

Qualquer um dos dois últimos parece ser suficiente sudo curl.

Referência: https://developer.apple.com/library/mac/Documentation/Darwin/Reference/ManPages/man1/security.1.html

Wes Campaigne
fonte
Como eu disse na pergunta, eu os adicionei ao chaveiro do sistema e ao chaveiro de login já.
Jacob Tomlinson
Você realmente tentou o que eu sugeri? Eu testei exatamente na situação que você descreve e funcionou. Não tenho certeza de todos os detalhes - a documentação é vaga -, mas você deve saber que as configurações de confiança do certificado NÃO são sinônimo de apenas adicionar o certificado a um conjunto de chaves e que as configurações de confiança do certificado do administrador existem separadamente dos sistemas e configurações do usuário / chaveiros. (Também parece haver um conjunto de configurações de usuário específicas do usuário root na mistura.) Editei minha resposta para ficar mais claro sobre esse ponto. Por favor, tente esta solução.
Wes Campaigne
Sim, eu tentei esta solução quando você a postou. Os certificados estão no chaveiro do sistema e configurados como confiáveis. Ainda sem sorte.
Jacob Tomlinson
5

Isso está realmente na dica de saída:

echo insecure >> ~/.curlrc

A vantagem de usar a solução acima é que ela funciona para todos os curlcomandos, mas não é recomendada, pois pode introduzir ataques MITM conectando-se a hosts não seguros e não confiáveis.

zinking
fonte
2

Se você usa MacPorts (e o script de terceiros que você mencionou não o remove $PATHou chama /usr/bin/curl), você pode instalar as portas certsynce curlnesta ordem.

certsyncé uma ferramenta e uma lista de inicialização correspondente que exportará o chaveiro do sistema para $prefix/etc/openssl/cert.peme instalará um link simbólico $prefix/share/curl/curl-ca-bundle.crt -> $prefix/etc/openssl/cert.pempara que o MacPorts curl retire automaticamente os certificados. certsynctambém atualizará automaticamente os arquivos gerados quando você alterar o chaveiro do sistema.

nunca latino
fonte
Obrigado por isso, eu gostaria de evitar o uso do MacPorts, se possível.
Jacob Tomlinson
-1

Para fazer o sudo curltrabalho (no OSX Sierra), tivemos que importar o certificado System.keychaine confiar nele. Isso pode ser feito manualmente no aplicativo Keychain ou usando este comando:

sudo security add-trusted-cert -d -k /Library/Keychains/System.keychain /path/to/cert.pem

Era importante especificar -de definir manualmente o caminho para o chaveiro do sistema via -kpara garantir que o certificado realmente seja importado para lá, se ainda não o for.

O comando funciona sem sudo, mas solicita a senha por meio de um diálogo da interface do usuário, o que pode ser um obstáculo para os scripts.

Alexander Klimetschek
fonte
Eu recebo o erroSecCertificateCreateFromData: Unknown format in import.
rraallvv 20/09/18
Quem votou mal, saiba que eu escrevi claramente "no OSX Sierra" e essa foi uma solução funcional para nós. Se não funcionar nas versões mais recentes do OSX, isso pode ser porque o suporte ou as ferramentas do OSX foram alterados. Ou um problema como o comentarista anterior, em que o arquivo de entrada não está em um formato suportado (a pergunta não especifica isso).
Alexander Klimetschek