É possível obter certificados de letsencrypt com um script de shell?

2

Gostaria de criar um script de shell para obtermos criptografia de certificados:

#!/bin/bash
sudo docker run -it --rm -p 443:443 -p 80:80 --name certbot \
    -v "/etc/letsencrypt:/etc/letsencrypt" \
    -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
    quay.io/letsencrypt/letsencrypt:latest certonly

Mas agora tenho que fornecer algumas informações manualmente:

  • endereço de e-mail
  • opção 2 (autônomo)
  • o domínio

É possível automatizar essas entradas?

    
por user3142695 18.01.2017 / 04:10

1 resposta

3

Não reinvente a roda se você também não tiver. Outra pessoa, na verdade, várias pessoas já criou um script para automatizar o processo de obtenção e renovação de certificados do letsencrypt usando um script de shell. O LetsEncrypt inclui uma lista de clientes de terceiros aqui .

Como o OP perguntou sobre um script de shell, trata-se de um em particular, GetSSL , que eu vi, experimentado com. É totalmente open-source e licenciado sob a licença GNU GPL3. Há também um wiki que cobre muito bem seu uso e um link para relatar problemas. Além disso, o criador também é muito ativo na comunidade LetsEncrypt fórum sob o nome "serverco", e responde a perguntas também.

Como é um script de shell, a instalação é simples. (Todos os caminhos usados aqui são exemplos que funcionam para mim, mas você pode alterá-los para atender às suas necessidades.) Faça o download do arquivo getssl do link acima em sua pasta bin. Outros lugares funcionam, é claro, mas na pasta bin simplifica as coisas. Torne isso executável. Então corra.

$ wget -O - https://raw.githubusercontent.com/srvrco/getssl/master/getssl > ~/bin/getssl
$ chmod 0700 ~/bin/getssl
$ getssl --create yourdomain.name

A opção --create cria o arquivo de configuração padrão ( getssl.cfg ) em ~/.getssl e ~/.getssl/yourdomain.name . O primeiro contém informações comuns a todos os domínios que você pode optar por registrar, e o segundo contém as informações exclusivas do domínio nomeado. Se você obtiver certificados para mais de um domínio, cada um terá seu próprio diretório em ~/.getssl , e você precisará executar o comando --create acima para cada um. Os arquivos de configuração padrão são muito bem comentados, e você provavelmente pode configurá-los sem nem mesmo revisar o wiki on-line, embora a leitura antecipada nunca dure (RTFM).

Uma das coisas que podem ser um pouco confusas é lidar com chaves. Para que o SSL funcione, o servidor deve ter um par de chaves (privado / público) para o processo de criptografia. Isso é chamado de Chave do Servidor . Para usar o LetsEncrypt você também precisa de um par de chaves para comunicações com o servidor cert. Isso é chamado de sua Chave da conta ou da sua chave LetsEncrypt.

Para o primeiro uso do GetSSL, para novas contas, não para as contas que já estão ativas, você pode criar uma chave facilmente com o openssl. Este comando irá gerar um e armazená-lo para você.

openssl genrsa 4096 > ~/.getssl/LE_account.key

Se, por outro lado, você já usou LetsEncrypt, em algum lugar você já tem a chave da conta. Em caso afirmativo, você deve continuar a usar a mesma chave para renovar os certificados ou revogar os certificados, se necessário. Não sei onde outros clientes mantêm sua cópia da chave da conta, mas encontrei um recurso que explica onde o certbot client o mantém. Embora escrito para acme-tiny, este guia explica como 'extrair' a chave da conta dos arquivos do certbot.

O cliente GetSSL espera que a chave da conta esteja no formato PEM padrão, mas o cliente certbot a armazena em outro formato, dentro de uma estrutura JSON, e isso deve ser extraído e convertido. Fazer isso usa outra ferramenta do JonLundy, que precisa de python, portanto, mesmo que o GetSSL não precise de python, você precisará disso. O processo dado, modificado para a estrutura do arquivo de amostra acima, é:

$ wget -O - "https://gist.githubusercontent.com/JonLundy/f25c99ee0770e19dc595/raw/6035c1c8938fae85810de6aad1ecf6e2db663e26/conv.py" > conv.py
$ cp /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/<id>/private_key.json private_key.json
$ openssl asn1parse -noout -out private_key.der -genconf <(python conv.py private_key.json)
$ openssl rsa -in private_key.der -inform der > ~/.gelssl/LE_account.key
$ rm conv.py private_key.json private_key.der

A linha final provavelmente deve ser substituída por algo um pouco mais seguro. Afinal de contas, esta é uma chave privada bastante importante envolvida. Talvez algo como shred -zun13 private_key.json; shred -zun13 private_key.der seja melhor.

Não sou especialista em segurança nem especialista em servidor, por isso não posso discutir os aspectos do GetSSL ou sua implementação. Eles podem ser melhor abordados em Falha do servidor . Nem posso responder a maioria das perguntas sobre o GetSSL. O local para obter respostas sobre o GetSSL mais rápido parece estar no site Comunidade do LetsEncrypt, onde o serverco pode ser visto com frequência. Muitos outros nesse fórum também lidam com questões do GetSSL, fornecendo um bom conjunto de respostas.

    
por 20.01.2017 / 09:54