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.