Debian jessie nginx com o openssl 1.0.2 para usar ALPN em vez de NPN

13

Estou executando o debian jessie no meu servidor e recentemente atualizei para o novo servidor da Web nginx com suporte a http / 2 (nginx 1.10). Como hoje, ele funciona muito bem e o servidor web está fornecendo conteúdo com o protocolo http2.

Eu li que o chrome está descartando o suporte do NPN e só permite ALPN após 15.5.2016. ALPN é extension, que requer o openssl 1.0.2 instalado, mas no debian jessie é apenas o openssl 1.0.1 (também em backports do Debian e outros repositórios, não existe a versão do openssl 1.0.2 para este debian).

E existe o problema - eu atualizei do SPDY para o http2 e em alguns dias, eu terei que desativar o http2 e não posso usar o SPDY porque esta versão do nignx tem apenas http2. Eu também li, que esta versão do debian ficará com o openssl 1.0.1 e somente o debian stretch terá o openssl 1.0.2. Mas, para a data de lançamento, há quase um ano e o Chrome vai abandonar o suporte em breve, por isso não quero perder o benefício do protocolo http2.

Existe alguma solução, como instalar o openssl 1.0.2 neste sistema, sem construir construção própria (má manutenção) ou esperando por repositório de backports para tê-lo? Eu também não quero duas versões do openssl no meu sistema, se uma delas precisar ser vinculada e mantida manualmente.

Obrigado por qualquer ajuda.

    
por Juraj Nemec 06.05.2016 / 19:42

5 respostas

16

Atualização 2016/08/08: nginx in jessie-backports (a versão 1.9.10-1~bpo8+3 foi criada em relação a openssl >= 1.0.2~ . A obtenção de ALPN funcionando agora se a execução de jessie exigir apenas o pacotes de jessie-backports , não é mais necessário extrair pacotes de stretch .

-

Resposta original: Bem, aqui vai a minha resposta, de acordo com os comentários: Na minha opinião, não há muitas maneiras de resolver isso a partir de hoje, 2016/05/09. Basicamente você tem que tentar de alguma forma para obter um nginx moderno em seu sistema, compilado com >= openssl 1.0.2~ .

As duas únicas opções que vejo atualmente: você compila para si mesmo, o que não quer fazer, o que é bastante compreensível, ou você extrai pacotes modernos de Debian stretch para o seu sistema. Isso envolve alguns riscos, porque você está misturando um ambiente estável com outro, mas na minha opinião esses riscos são bem baixos, porque você está usando Debian .

Então, vamos experimentar o seguinte:

  • Adicione o repositório Debian stretch ao seu apt sources . Não use /etc/apt/sources.list para isso, mas use um arquivo dedicado dentro de /etc/apt/sources.list.d/ para mantê-lo limpo, pessoalmente estou usando stretch.list .

    Coloque essas linhas lá dentro:

    deb http://httpredir.debian.org/debian/ stretch main contrib non-free
    deb-src http://httpredir.debian.org/debian/ stretch main contrib non-free
    
    deb http://security.debian.org/ stretch/updates main contrib non-free
    deb-src http://security.debian.org/ stretch/updates main contrib non-free
    
    # stretch-updates, previously known as 'volatile'
    deb http://httpredir.debian.org/debian/ stretch-updates main contrib non-free
    deb-src http://httpredir.debian.org/debian/ stretch-updates main contrib non-free
    
  • Configure o apt pinning para garantir que você extraia apenas pacotes de Debian stretch que você está especificando. O arquivo a ser usado para isso é /etc/apt/preferences , lá dentro, coloque:

    Package: *
    Pin: release n=jessie
    Pin-Priority: 900
    
    Package: * 
    Pin: release a=jessie-backports
    Pin-Priority: 500
    
    Package: *
    Pin: release n=stretch
    Pin-Priority: 100
    

    (Você pode ter que alterar as suítes e as prioridades para adequá-lo ao seu ambiente.)

  • Execute apt-get update (via sudo / as root ) para atualizar o cache do pacote.

  • Instale nginx de Debian stretch : apt-get install -t stretch nginx (faça isso via sudo / as root ). Lucro!

  • Como descrevi em meus comentários, para diminuir ainda mais os riscos envolvidos, você pode usar algo como chroot ou uma solução container como LXC . Caso você queira ir pelo caminho chroot , você tem que configurar uma interface de rede lá dentro: Para fazer isso, dê uma olhada neste post de blog, por exemplo , que apresenta uma introdução a network namespaces .

  • Espero que isso ajude; Caso você tenha mais dúvidas, sinta-se à vontade para entrar em contato comigo. Eu apreciaria o feedback e estou interessado em saber como funciona.

por 09.05.2016 / 15:25
11

Outro método é instalar o OpenSSL 1.0.2 de jessie-backports e usar o Ubuntu 16.04 LTS do próprio repositório do nginx. Dessa forma, você está usando pelo menos um pacote OpenSSL criado para Jessie.

Adicione a /etc/apt/sources.list :

# jessie-backports, from stretch-level but with no dependencies
deb http://httpredir.debian.org/debian/ jessie-backports main contrib non-free
deb-src http://httpredir.debian.org/debian/ jessie-backports main contrib non-free

# Nginx repository - use Ubuntu 16.04 LTS Xenial to get packages compiled with OpenSSL 1.0.2
deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx

Em seguida, execute:

apt-get update
apt-get install -t jessie-backports openssl
apt-get install nginx

Isso obviamente coloca você em uma configuração sem suporte oficialmente , mas talvez seja melhor do que não ter um pacote - e funcionou para mim. Além disso, usar o repositório do nginx significa que você recebe atualizações novas.

    
por 13.07.2016 / 01:20
0

Outro método é usar o jessie-backports e depois reconstruir facilmente o nginx

adicione a /etc/apt/sources.list backports

deb http://ftp.debian.org/debian jessie-backports main

e depois rodar como root

apt-get update
apt-get install -t jessie-backports openssl

e, em seguida, reconstrua o nginx. Siga as instruções no link

    
por 26.07.2016 / 09:50
0

Para mim, a maneira mais fácil de corrigir isso foi usar uma imagem diferente do Nginx Docker, consulte a compilação oficial do Nginx no Docker Hub . A build padrão do Docker Nginx usa o Debian Jessie para que não corrija seu problema, mas eles também oferecem uma compilação alternativa baseada no Alpine Linux . Suas versões mais recentes usam o OpenSSL 1.0.2!

Esta solução, portanto, pressupõe que você instalou o Docker e está bem com a execução do Nginx em Alpine Linux em vez de Debian Jessie .

Para iniciar seu contêiner Nginx:

sudo docker run --name nginx-container -p 80:80 -p 443:443 -v /path/to/your/nginx/directory/:/etc/nginx/ /path/to/your/files/to/serve/:/usr/share/nginx/html/ -d nginx:1.11-alpine

Uma breve explicação para você começar com o Docker:

  • docker run : faz o download da imagem do Docker (nesse caso, nginx:1.11-alpine ) se você ainda não a possui e inicia um contêiner do Docker com base nessa imagem
  • --name nginx-container : fornece um nome ao contêiner do Docker (você pode visualizar todos os contêineres do Docker em execução usando sudo docker ps ou usar sudo docker ps -a para também visualizar contêineres interrompidos)
  • -p 80:80 -p 443:443 : liga as portas 80 e 443 em sua máquina host às portas 80 e 443 respectivamente no contêiner Docker
  • -v /path/to/your/nginx/directory/:/etc/nginx/ : monta o diretório em seu sistema host que contém sua configuração Nginx no diretório /etc/nginx/ no container Docker
  • /path/to/your/files/to/serve/:/usr/share/nginx/html/ : monta um diretório em seu sistema host que contém arquivos que você deseja que o Nginx exiba
  • -d : inicia o contêiner em segundo plano (você pode parar o contêiner usando docker stop nginx-container )
  • nginx:1.11-alpine : use esta imagem para iniciar seu contêiner (as imagens oficiais do Nginx Docker estão listadas aqui )

Também é útil:

  • use sudo docker exec nginx-container <command> para executar um comando no contêiner, por exemplo, sudo docker exec nginx-container nginx -s reload para recarregar o Nginx depois de alterar os arquivos de configuração no sistema host
  • Ou use sudo docker exec -it nginx-container bash para inserir um shell bash no contêiner para que você possa trabalhar lá diretamente (não recomendado, mas às vezes útil)
por 08.09.2016 / 16:41
0

Uma maneira alternativa é usar o BoringSSL, o que não prejudica o ambiente OpenSSL. Aqui estão os detalhes para se referir a link

    
por 23.02.2017 / 03:40