Configurando SSL no servidor de desenvolvimento (Apache)

Configurando SSL

Você já deve ter se perguntado como funciona o protocolo HTTPS ou então como configurá-lo na sua máquina.

Antes de levar um sistema ao servidor de produção, é essencial testá-lo em um ambiente o mais semelhante possível ao servidor de produção. Muitas pessoas já perguntaram como é possível disponibilizar uma conexão HTTPS com o localhost do Apache.

Pois bem, hoje vou ensinar como configurar o HTTPS no Apache a partir de um certificado SSL auto-assinado.

Neste exemplo eu estou utilizando uma distro Linux chamada Crunchbang (Debian-based – assim como Ubuntu e Mint), mas deve funcionar em qualquer sistema Unix-like. Para os que usam Windows, infelizmente, vou ficar devendo…

Antes de começar, é importante ter um conhecimento básico do Terminal e o openssl instalado. Também usarei o gedit, mas você pode utilizar qualquer alternativa, como vimnanokate etc.

Gerando um certificado SSL auto-assinado

Abra o terminal e preste atenção em qual diretório você está. Se estiver com o usuário normal, provavelmente estará na sua home. Os comandos vão gerar os certificados no diretório corrente. Não há problema em gerá-los na sua home, já que esses arquivos servirão apenas para o servidor de testes. Se alguém tiver acesso a eles, nada extraordinariamente ruim deverá acontecer. Mas, enfim, você está avisado! :)

Todos os comandos neste tutorial assumem que você esteja autenticado como root. Para isso, basta utilizar o comando sudo su, ou apenas su (dependendo da sua distro).

Vamos começar gerando um certificado SSL de 1024 bits. A sua chave pública será X.509 (PKI). Meus nomes de arquivo serão todos phpit, para ficar mais fácil de visualizar. Você pode utilizar o nome que quiser, mas cuide para não se perder!

Utilize os seguintes comandos:

$ openssl genrsa -out phpit.key 1024
$ openssl req -new -key ssl.key -x509 -out phpit.crt

Guardando o certificado no diretório do Apache

Depois de gerar o certificado e a chave pública, precisamos guardar esses arquivos em um diretório do Apache.

Caso ainda não exista (o que é bastante provável), vamos criar esse diretório.

$ mkdir /etc/apache2/ssl/

Agora é só mover os dois arquivos para o novo diretório:

$ mv phpit.key phpit.crt /etc/apache2/ssl/

Por fim, precisamos gerar um arquivo pem para que nosso certificado seja compatível com todos os navegadores. A diferença entre o arquivo crt e o pem é apenas a extensão, o conteúdo é o mesmo. Vamos então, apenas copiar:

$ cd /etc/apache2/ssl/
$ cp phpit.crt phpit.pem

Configurando o certificado SSL para permitir o tráfego HTTPS na porta 443

Agora precisamos criar um VHost que aceite o tráfego via HTTPS. Para isso, precisaremos do certificado que foi criado.

A porta padrão do HTTP é a 80. Já a porta padrão do tráfego HTTPS é 443. O navegador irá automaticamente trafegar por essa porta quando o protocolo for definido para HTTPS. Caso o servidor não esteja escutando nessa porta, o servidor não receberá os dados.

É bastante provável que o Apache já esteja configurado para escutar na porta 443 mas, por via das dúvidas, vamos conferir o arquivo de portas.

$ cd /etc/apache2/ports.conf

Por padrão, o Apache já vem configurado para escutar na porta 443 caso o mod_ssl esteja habilitado. Você deve ver algo semelhante nesse arquivo:

<IfModule mod_ssl.c>
 Listen 443
</IfModule>

Se não houver nada semelhante, pode adicionar.

O próximo passo é configurar o caminho dos arquivos de SSL. Aqui vou usar o gedit, mas você pode utilizar o editor que preferir.

$ gedit /etc/apache2/sites-enabled/000-default

Ao acessar o arquivo, você deve ter algo parecido com isso:

<VirtualHost *:80>
	ServerAdmin webmaster@localhost

	DocumentRoot /var/www
	<Directory />
		Options FollowSymLinks
		AllowOverride None
	</Directory>
	<Directory /var/www/>
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
	</Directory>

	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
	<Directory "/usr/lib/cgi-bin">
		AllowOverride None
		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
		Order allow,deny
		Allow from all
	</Directory>

	ErrorLog ${APACHE_LOG_DIR}/error.log

	# Possible values include: debug, info, notice, warn, error, crit,
	# alert, emerg.
	LogLevel warn

	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Essa é a configuração para porta 80. Precisamos configurar a porta 443. O que eu fiz foi duplicar o conteúdo do arquivo e apenas modificar a porta 80 para 443, ficando, assim, com VirtualHosts.

Agora precisamos configurar três diretivas (mas só no VHost 443):

SSLEngineSSLCertificateFile e SSLCertificateKeyFile.

Logo após o fechamento da última declaração de diretório, vamos adicionar as seguintes linhas:

SSLEngine on
SSLCertificateFile /etc/apache2/ssl/phpit.pem
SSLCertificateKeyFile /etc/apache2/ssl/phpit.key

Com essas três diretivos nós ativamos o SSL apenas para a porta 443 (visto que estamos editando o VHost dessa porta) e apontamos para os dois arquivos do certificado.

Ao final, o arquivo deve ficar mais ou menos assim:

<VirtualHost *:80>
	ServerAdmin webmaster@localhost

	DocumentRoot /var/www
	<Directory />
		Options FollowSymLinks
		AllowOverride None
	</Directory>
	<Directory /var/www/>
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
	</Directory>

	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
	<Directory "/usr/lib/cgi-bin">
		AllowOverride None
		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
		Order allow,deny
		Allow from all
	</Directory>

	ErrorLog ${APACHE_LOG_DIR}/error.log

	# Possible values include: debug, info, notice, warn, error, crit,
	# alert, emerg.
	LogLevel warn

	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:443>
	ServerAdmin webmaster@localhost

	DocumentRoot /var/www
	<Directory />
		Options FollowSymLinks
		AllowOverride None
	</Directory>
	<Directory /var/www/>
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
	</Directory>

	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
	<Directory "/usr/lib/cgi-bin">
		AllowOverride None
		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
		Order allow,deny
		Allow from all
	</Directory>

	SSLEngine on
	SSLCertificateFile /etc/apache2/ssl/ssl.pem
	SSLCertificateKeyFile /etc/apache2/ssl/ssl.key

	ErrorLog ${APACHE_LOG_DIR}/error.log

	# Possible values include: debug, info, notice, warn, error, crit,
	# alert, emerg.
	LogLevel warn

	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Salve o arquivo e estamos prontos.

Agora só resta ativar o módulo SSL no Apache:

a2enmod ssl

Só falta reiniciar o apache

/etc/init.d/apache2 restart

Para verificar que tudo está OK, você deve tentar acessar https://localhost/.

Pelo fato de o certificado ser auto-assinado, ele não pertence a nenhuma entidade certificadora confiável. Sendo assim, a primeira coisa que o navegador vai acusar é isso. Basta adicionar uma exceção e tudo estará OK para trafegar utilizando criptografia SSL.

Considerações finais

Caso não tenha conseguido fazer funcionar, tente refazer os passos e verificar se fez tudo certinho. Se, mesmo assim, não rolar, deixe um comentário e vamos tentar te ajudar.

Fazia tempo que eu queria escrever um artigo desse tipo, mas nunca tirei tempo para esmiuçar o processo. Espero que possa ajudar vocês a tornarem o ambiente local o mais parecido possível com o servidor de produção.

Um abraço a todos e até a próxima.
Fiquem com Deus.
Rafael Jaques

25 classes e bibliotecas PHP para desenvolvimento eficiente

PHP é uma das mais populares linguagens de programação na internet. Por conta disso, são desenvolvidas “toneladas” de aplicações, classes e bibliotecas na linguagem e para a linguagem.

Neste artigo, faço um levantamento de classes, bibliotecas, ferramentas e documentações que podem lhe auxiliar durante o desenvolvimento. Vamos lá!

Gráficos

pChart

Se você precisa de uma classe para gerar gráficos em PHP, pChart é uma das melhores opções.

pchart

Gantii

Gráficos de Gantt são muito importantes para detalhamento de processos em calendário. Essa classe gera esse tipo de gráfico.

Gantti

Manipulação de imagens

PHP Image Cache

Classe para compressão instantânea e cache de imagens em PHP.

Php-Image-Cache

Wideimage

Biblioteca para manipulação de imagens.

Wideimage

Imagine

Biblioteca para manipulação de imagens, escrita em PHP 5.3.

Imagine

ImageWorkshop

Utiliza a GD para auxiliar na manipulação de imagens. É possível até criar layers como no GIMP e no Photoshop.

Php-Image-Workshop

Phpthumb

Biblioteca que utiliza a GD para aplicar diversos filtros, recortar e redimensionar imagens em tempo real.

Phpthumb

Gerenciamento de erros

Whoops

É um framework de gerenciamento de erros para PHP. É simples de usar e auxilia no processo de debug.

Whoops

PHP Error

Ferramenta para auxiliar na depuração de código. Possui mensagens de erro melhoradas, syntax highlight, snippets de código e funciona com AJAX.

PHP-Error

Detecção de usuário/navegador

Detector

Classe para detecção de navegador e as características disponíveis em cada um.

Detector

MobileDetect

Esta classe utiliza o User-agent para detectar se a sua página está rodando em um computador ou em um dispositivo móvel.

Mobile-Detect

Country from IP

Utilize essa classe para identificar o país de origem do acesso a partir do IP.

Country-From-IP

Pacote Office

PHPWord

Ferramenta para ler, escrever e criar arquivos em formato Word.

phpword

PHPExcel

Ferramenta para ler, escrever e criar arquivos em formato Excel.

Php-Excel

PHPPowerPoint

Ferramenta para ler, escrever e criar arquivos em formato PowerPoint.

Php-powerpoint

Diversas

Ratchet

Biblioteca no PHP para criação de sockets de comunicação em tempo real entre servidor e cliente, utilizando WebSockets. Torna o processo bem mais simples.

Ratchet-Websocket-For-Php

Munee

É uma biblioteca para compilação instantânea de LESS, SCSS, CoffeeScript e redimensionamento de imagens.

Munee

Opauth

Biblioteca para autenticação em diversos provedores de serviço na web.

Opauth

Swift Mailer

Ferramenta excelente para envio de e-mail no PHP. Permite ajustar propriedades, opções e cabeçalhos com facilidade e é bastante fácil de aprender.

Swift-Mailer

Htmlpurifier

Ferramenta para filtrar HTML, removendo códigos maliciosos que possam estar presentes.

Htmlpurifier

FPDF

Excelente classe para gerar PDF. Não precisa de nenhuma biblioteca extra instalada.

Fpdf

Requests

Uma classe para enviar requisições HTTP e interagir com outras páginas e sistemas.

Requests

Gaufrette

Biblioteca de camada de abstração para o sistema de arquivos.

Gaufrette

GeSHi

Biblioteca para colorização de código-fonte.

Highlighter

PHPUnit

Framework PHP para testes unitários.

Phpunit

 

Adaptado do original: http://inspiretrends.com/35-useful-php-classes-libraries-for-efficient-development/

PHP em Bento Gonçalves

Flyer_PHP_Bento

Dos dias 6 a 8 de novembro de 2014, Bento Gonçalves receberá dois eventos. Dias 6 e 7 haverá a Jornada Acadêmica do Curso de Análise e Desenvolvimento de Sistemas do IFRS e, dia 8, o Seminário de Software Livre TcheLinux.

Haverá MUITO PHP nesses dias, além, claro, de muitas outras palestras sobre tecnologia.

Gostaria de convidá-los a participarem dos eventos, que são gratuitos, e aproveitarem todos os mestres que estarão apresentando palestras de altíssimo nível.

Para informações sobre a Jornada Acadêmica, acesse: http://ads.bento.ifrs.edu.br/noticias/view/id/118

Sobre o TcheLinux na cidade de Bento Gonçalves, você pode encontra informações aqui: http://bento.tchelinux.org/

Desejo um bom evento a todos e nos encontramos lá!

Um abraço a todos e fiquem com Deus.
Rafael Jaques

 

Primeiras impressões do Atom – Editor do GitHub

Primeiras impressões do Atom

 

Fala, meu povo! Tudo certo?

Hoje estou aqui para falar sobre o Atom, o editor de texto do GitHub. Vou apresentar um apanhado geral sobre algumas de suas features – que vão lembrar muito o Sublime Text e o TextMate – e algumas considerações sobre a experiência com alguns poucos dias de uso.

O que é o Atom?

No site do Atom (https://atom.io/) ele está descrito como o editor hackeável para o século XXI. Trata-se de um editor de texto simples e adaptável, já que o foco é construir um núcleo leve que possa ser estendido para servir aos propósitos de qualquer um.

Ele é open-source (licença MIT) e seu código está no GitHub no repositório atom/atom.
Também é multi-plataforma, mas as versões pré-compiladas só estão disponíveis, atualmente, para Windows 7 e 8, Mac OS 10.8 ou superior e Debian/Ubuntu 64bits, no link de latest releases. Contudo, é possível compilar o editor em qualquer distro Linux e no FreeBSD.
O editor foi desenvolvido em Node.js. Atualmente as estatísticas do GitHub apontam 83% CoffeeScript e 14% JavaScript.

Primeiras impressões

Atom01

À primeira vista ele lembra o Sublime Text e o Brackets. Instalei já alguns pacotes e ele ficou, literalmente, a cara do Sublime.

A escrita e a fluidez são bastante semelhantes aos outros novos editores que têm surgido.

Comecei instalando alguns pacotes como o Seti (UI e tema) e o Minimap. O tema tratou de dar um ícone diferente a cada tipo de arquivo.Atom02

Até aqui, nada de diferente. Vamos avançar, então, e dar uma olhada nas features que mais chamaram a atenção.

Command Palette

Ideia importada do Sublime, a paleta de comandos reúne todos os comandos do editor. Ao pressionar o atalho (Cmd+Shift+P no Mac), surge uma janela na qual você pode buscar todos os comandos e atalhos do programa.

Atom03Alternar entre arquivos

No Atom, é possível navegar por arquivos da mesma forma que no Sublime Text. Você pode usar Cmd+T ou o atalho do próprio Sublime (Cmd+P). Existe também um atalho para navegar apenas por arquivos abertos, o Cmd+B.

Atom04Integração com o Git

A integração com o Git ficou muito bacana. O editor avisa os arquivos que foram adicionados ou modificados.

Também é possível verificar na barra de status o branch utilizado e o diff. Existe, também, a opção de navegar pelo diff.

Com o Cmd+Shift+B você pode fazer um browse pelos arquivos que não estão atualizados.

Atom05

Live Preview de Markdown

Uma opção muito legal é um live preview de documentos Markdown.

Conforme você vai escrevendo, ele vai te mostrando como o seu md está ficando.

Atom06

Divisão de Painéis

Você pode trabalhar em diversas partes do mesmo código por meio da divisão de painéis.

É possível dividir um painel em qualquer sentido (cima, baixo, esquerda e direita). Cada painel pode ser dividido novamente.

Atom09

Temas e Syntax Highlight

Por ser um software desenvolvido em linguagem web, é possível fazer grandes coisas sem muito esforço.

Os temas, por exemplo, podem ser modificados via CSS. No exemplo abaixo eu troquei a cor da tree-view para azul.

Atom07Pacotes

Um dos pontos fortes do editor. A facilidade com que se pode adicionar pacotes é incrível.

A maneira como os itens são apresentados lembra a loja de aplicativos do Ubuntu. É possível pesquisar no, já vasto, banco de pacotes e temas direto de dentro do editor. Com um clique você instala e já está tudo pronto para uso.

Todos os pacotes ficam hospedados no GitHub e você pode acessar o repositório.

Atom08

Atualização em 4/11

Resolvi adicionar dois detalhes importantes, agora que tenho usado o editor por mais tempo.

  • Ele não abre o último projeto trabalhado. Senti muita falta disso quando migrei do TextMate, mas felizmente existe uma extensão para isso: Open Last Project.
  • Também senti falta de um menu que mostrasse os arquivos utilizados recentemente. Para isso, utilizei a extensão: Recent Files.

Considerações finais

Depois de tudo que apresentei, espero que tenha conseguido demonstrar algumas das features que mais me empolgaram durante a utilização.

Certamente não é possível transmitir a experiência que tive ao utilizá-lo, por isso convido você a fazer download do editor e verificar por você mesmo.

Ele é bastante personalizável e extensível. Se você não achar nenhum pacote que lhe agrade, pode criar o seu próprio e enviar para o GitHub para que outras pessoas possam utilizá-lo.

Agora nos resta aguardar e ver para onde vai evoluir esse software, mas até o momento parece ter um futuro promissor!

Um forte abraço e fiquem com Deus.
Rafael Jaques

Inscrições abertas para o TDC Porto Alegre

TDC 2013

Salve, galera!

Estão abertas as inscrições para o The Developer’s Conference (TDC) que ocorre em Porto Alegre dos dias 16 a 18/10/2014. Os descontos da fase 1 vão até dia 16 de setembro.

O PHPRS já está trabalhando na montagem da grade para a trilha PHP.

Então, não perca tempo! Corre antes que o desconto acabe! Mais informações e inscrição no TDC, neste link.

Um abraço a todos e fiquem com Deus.
Rafael Jaques

PHP 5.6.0 lançado! Quais as novidades?

PHP Logo

No dia 28 de agosto de 2014 foi lançada a versão 5.6.0 do PHP.

Escrevo este rápido artigo apenas para listar algumas das novas funcionalidades dessa versão. Caso você queira mais detalhes sobre as novidades e sobre como migrar, visite a página oficial PHP 5.6 new features.

Expressões com constantes escalares

Agora é possível fornecer uma expressão escalar envolvendo números e strings e/ou constantes em contextos que anteriormente o PHP esperava um valor estático, como em declaração de constantes e propriedades e na definição de argumentos padrão para funções.

<?php
const UM = 1;
const DOIS = UM * 2;

class C {
    const TRES = DOIS + 1;
    const UM_TERCO = UM / self::TRES;
    const SENTENCA = 'O valor de TRES e '.self::TRES;

    public function f($a = UM + self::TRES) {
        return $a;
    }
}

echo (new C)->f()."\n";
echo C::SENTENCA;
?>

O exemplo acima retornará:

4
O valor de TRES e 3

__debuginfo()

Foi uma das novidades que mais gostei. Agora e possível utilizar o método mágico __debuginfo() para modificar as propriedades e valores que são mostrados quando o objeto é chamado por um var_dump().

<?php
class A {
    private $prop;

    public function __construct($valor) {
        $this->prop = $valor;
    }

    public function __debugInfo() {
        return [
            'propQuadrado' => $this->prop ** 2,
        ];
    }
}
var_dump(new A(42));
?>

O exemplo acima retornará:

object(A)#1 (1) {
["propQuadrado"]=>
int(1764)
}

use function e use const

The use operator has been extended to support importing functions and constants in addition to classes. This is achieved via the use function and use const constructs, respectively.

O operador use agora suporta importação de funções e constantes, além de classes. Você pode fazer isso a partir de use function e use const.

<?php

namespace Name\Space {
    const FOO = 42;
    function f() { echo __FUNCTION__."\n"; }
}

namespace {
    use const Name\Space\FOO;
    use function Name\Space\f;

    echo FOO."\n";
    f();
}
?>

O exemplo acima retornará:

42
Name\Space\f

E mais

Além dessas funcionalidades que comentei, ainda está incluso no pacote:

  • Adicionado suporte a MIME type no CLI
  • São aceitos uploads maiores que 2GB
  • Suporte a funções variádicas e desempacotamento de argumentos (já falei sobre isso aqui)
  • PHPDBG embutido por padrão
  • Melhorias na extensão Zip
  • UTF-8 agora é padrão
  • Exponenciação via ** ($variavel = 3**2;)
  • O wrapper php://input agora pode ser aberto quantas vezes for necessário, o que levou a uma redução da memória utilizada pelo POST

 

E você? Já experimentou essa versão? Deixe uma mensagem com seus comentários sobre mais essa atualização do PHP rumo à versão 6!

Não se esqueça que todas as novas funcionalidades estão comentadas no blog oficial do PHP.

Um abraço a todos e fiquem com Deus.
Rafael Jaques