Skip to content

Instantly share code, notes, and snippets.

@Koratsuki
Last active March 26, 2020 23:41
Show Gist options
  • Save Koratsuki/da7d49a7ba917633921833aaef496821 to your computer and use it in GitHub Desktop.
Save Koratsuki/da7d49a7ba917633921833aaef496821 to your computer and use it in GitHub Desktop.
HTTP+TLS+ECC

Instalamos lo requerido:

apt install -y nginx openssl php php-{pear,common,curl,mbstring,gd,gettext,bcmath,json,xml,fpm,zip}

systemctl enable nginx

Listamos mediante openssl y revisamos los cifrados, en este caso, ECC para seguridad usa prime256v1, secp384r1 o secp521r1:

openssl ecparam -list_curves | grep -E "prime256v1|secp384r1|secp521r1"

Para ver los demás certificados soportados por OpenSSL: openssl ciphers -s -v

Ahora pasamos a crear los certificados:

openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

openssl ecparam -out /etc/nginx/ssl/nginx.key -name prime256v1 -genkey
openssl req -new -key /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/csr.pem
openssl req -x509 -nodes -days 3650 -key /etc/nginx/ssl/nginx.key -in /etc/nginx/ssl/csr.pem -out /etc/nginx/ssl/nginx.crt

Y ahora creamos el virtualhosting con la siguiente configuración:

server {
    listen 80;
    server_name web2.inutil.cu;
    return 301 https://web2.inutil.cu$request_uri;
}

server {
    listen 443 http2 ssl;

    server_name web2.inutil.cu;
    ssl on;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    ssl_ecdh_curve secp521r1:secp384r1:prime256v1;
    ssl_session_cache shared:SSL:20m;
    ssl_session_timeout 180m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;

    resolver 192.168.0.4 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    access_log /var/log/nginx/web2-access.log;
    error_log /var/log/nginx/web2-error.log;

    root /srv/web;
    index index.php index.html;

    location / {
        try_files $uri $uri/ index.php;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.3-fpm.sock;.
    }
}

Acá en nginx el error con el OCSP Stapling es el siguiente:

nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/nginx/ssl/nginx.crt"

Ahora, para probar que esto funciona haremos lo mismo que con Apache2. Conectarnos al sitio y pedir el certificado:

openssl s_client -connect web2.inutil.cu:443 -tls1_2
openssl s_client -connect web2.inutil.cu:443 -tls1_3

O también con curl:

curl -I -v --tlsv1.2 --tls-max 1.2 https://web2.inutil.cu/
curl -I -v --tlsv1.3 --tls-max 1.3 https://web2.inutil.cu/

Donde las opciones de curl son las siguientes:

    -I : Show document header info only
    -v : Verbose outputs
    --tlsv1, --tlsv1.0, --tlsv1.1, --tlsv1.2, --tlsv1.3: Use given TLS version
    --tls-max VERSION : Set maximum allowed TLS version

Y debería ponernos toda la comunicación y la obtención de los certificados. Ahora probemos pedir TLSv1.1 o TLSv1.0.

curl -I -v --tlsv1 --tls-max 1.0 https://web2.inutil.cu/
curl -I -v --tlsv1.1 --tls-max 1.1 https://web2.inutil.cu/

Nos dará el error siguiente:

error:141E70BF:SSL routines:tls_construct_client_hello:no protocols available

Es decir, que no tiene protocolo disponible para la petición, así que todo OK!

Si desea probar su certificado puede preguntar en el sitio:

https://www.ssllabs.com/ssltest/

Y se le dará un resumen del servidor y certificado. Nota importante acá: Si el certificado es autofirmado le bajará la calificación pues no se puede validar la entidad certificadora, así que quedan advertidos.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment