Configurar SQUID com SSL_BUMP em modo explicito.

Preparação do Ambiente (SQUID Specific)

Desabilitar SELINUX e FIREWALLD

# yum clean all
# yum -y update
# yum -y install squid
# systemctl start squid
# systemctl enable squid
# cd /etc/squid/
# mkdir ssl_cert
# chown squid:squid ssl_cert/
# chmod 700 ssl_cert
# cd ssl_cert
# openssl req -new -newkey rsa:2048 -sha256 -days 365 -nodes -x509 -extensions v3_ca -keyout myCA.pem -out myCA.pem
# openssl x509 -in myCA.pem -outform DER -out myCA.der (myCA.der – Ficheiro a instalar nos clientes)
# /usr/lib64/squid/ssl_crtd -c -s /var/lib/ssl_db
# chown squid:squid -R /var/lib/ssl_db

Configuração /etc/squid/squid.conf

  • Comentar a linha:

#http_port 3128

  • Adicionar as seguintes configurações:

http_port 0.0.0.0:3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=16MB cert=/etc/squid/ssl_cert/myCA.pem
sslcrtd_program /usr/lib64/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB
sslcrtd_children 10
sslproxy_options NO_SSLv2,NO_SSLv3,SINGLE_DH_USE
ssl_bump server-first
sslproxy_cert_error allow all

acl ssl_step1 at_step SslBump1
acl ssl_step2 at_step SslBump2
acl ssl_step3 at_step SslBump3
ssl_bump peek ssl_step1
ssl_bump splice all

Reiniciar o SQUID

# systemctl restart squid

Ficheiro de Log

/var/log/squid/access.log

Criar certificado auto-assinado para servidor Apache

De forma a criar um certificado auto-assinado para um virtualhost Apache deve optar-se pela utilização do OpenSSL. Uma vez que esteja assegurado que o OpenSSL está instalado deve correr-se o seguinte comando para gerar o certificado e chave privada:

# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mysitename.key -out mysitename.crt

Configurar Liferay para responder corretamente atrás de um Balaceador de SSL Offload

Recentemente tive a necessidade de configurar um servidor aplicacional Tomcat/Liferay, para tal depois de muitas voltas conclui que para se conseguir ter o servidor atrás de um balaceador que faz o offload de SSL. Recorrer ao mod_proxy do apache não satisfaz os resultados pretendidos uma vez que o post do formulário de login segue sempre em http, impedindo assim os utilizadores de fazer login.

Consegui um comportamento correto com recurso ao mod_jk com as seguintes configurações:

Ficheiro workers.properties (/etc/httpd/conf.d/):

#Name of the load balancer workers
worker.list=loadbalancer
#Worker configuration for liferay-node-01
#AJP Connector port of node-01 on liferay-node-01 server
worker.node-01.port=8009
worker.node-01.host={IP do servidor onde está o Liferay}
worker.node-01.type=ajp13
worker.node-01.lbfactor=1
#load balancer configuration properties
worker.loadbalancer.type=lb
#list of worker nodes that are part of the cluster
worker.loadbalancer.balance_workers=node-01
worker.loadbalancer.sticky_session=1

Ficheiro mod_jk.conf em (/etc/httpd/conf.d/):

LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.X.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkShmFile /var/log/httpd/mod_jk.shm
JkLogFile /var/log/httpd/mod_jk.log
JkLogLevel info
JkLogStampFormat “[%a %b %d %H:%M:%S %Y] “

No ficheiro server.xml do servidor Tomcat foi necessário mudar a tag:

<Engine name=”Catalina” defaultHost=”localhost”>

Para:

<Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”node-01″>

A configuração do Virtual host apache foi a seguinte (virtualhost.conf em /etc/httpd/conf.d/):

<VirtualHost *:443>
ServerName dominio.autilizar.com
ServerAdmin it@dominio.autilizar.com
ErrorLog “/var/log/httpd/error_log”
TransferLog “/var/log/httpd/access_log”
SSLEngine on
SSLCertificateFile /caminho/para/o/certificado/dominio.autilizar.com.crt
SSLCertificateKeyFile /caminho/para/a/chave/privada/dominio.autilizar.com.crt
JkMount /* loadbalancer
</VirtualHost>

Já havia tido a necessidade de utilizar o mod_jk com o tomcat anteriormente, mas devido a situações particulares em que os frontends Apache balanceavam pedidos para multiplos servidores aplicacionais. A prévia utilização deste método para situações especificas de balanceamento de aplicações facilitou a resolução deste desafio com que me deparei.

Comandos OpenSSL para converter certificados SSL

Por vezes a configuração de SSL requer que os certificados SSL estejam em determinados formatos, por exemplo um servidor Windows importa e exporta ficheiros .pfx enquanto um servidor apache utiliza ficheiros individuais em formato PEM.

Os comandos abaixo permitem converter certificados SSL em diferentes formatos:

OpenSSL Convert PEM
Convert PEM to DER

# openssl x509 -outform der -in certificate.pem -out certificate.der

Convert PEM to P7B

# openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CACert.cer

Convert PEM to PFX

# openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt

OpenSSL Convert DER
Convert DER to PEM

# openssl x509 -inform der -in certificate.cer -out certificate.pem

OpenSSL Convert P7B
Convert P7B to PEM

# openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

Convert P7B to PFX

# openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

# openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CACert.cer

OpenSSL Convert PFX
Convert PFX to PEM

# openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes

Extrair certificado e Chave Privada a partir de um PFX

Objetivo:

Por vezes existe a necessidade de exportar um certificado e a sua chave privada de um servidor Windows de forma a separar o par de chaves para que seja utilizado num outro servidor web que não o IIS.

Procedimento:

  1. Mover o ficheiro exportado (ex: file.pfx) para um servidor onde se encontre instalado o OpenSSL.
    Nota: O ficheiro pfx está em formato PKCS#12 e inclui o certificado e a chave privada.
    Para exportar a chave privada deve correr-se o seguinte comando:
    openssl pkcs12 -in certname.pfx -nocerts -out key.pem -nodes
  2. De forma a exportar o certificado o comando a executar é o seguinte:
    openssl pkcs12 -in certname.pfx -nokeys -out cert.pem
  3. O seguinte comando deve ser executado para remover a palavra passe da chave privada:
    openssl rsa -in key.pem -out server.key