Instalar certificado PFX en nginx

Nos habrá pasado muchas veces, que nos pasan un certificado web en formato PFX y nos rompemos la cabeza para poder instalarlo en un servidor web apache o nginx.

Pues con esta pequeña entrada explico como extraer la clave privada, intermedia y publica del certificado PFX para poder utilizarlo en un servidor web apache o nginx.

Lanzamos estos comandos openssl para extraer las claves.

# Extraemos la clave pública
openssl pkcs12 -in ./certificado.pfx -clcerts -nokeys -out publica.crt

# Extraemos la clave intermedia
openssl pkcs12 -in ./certificado.pfx -clcerts -nokeys -chain -out intermedia.crt

# Extraemos la clave privada
openssl pkcs12 -in ./certificado.pfx -nocerts -nodes -out privada.rsa


Juntamos la clave intermedia y publica en un fichero fullchain.crt

cat intermedia.crt >> fullchain.crt
cat publica.crt >> fullchain.crt

Y creamos el fichero ssl.conf para utilizar el certificado en un nginx

server {
  server_name example.org;
  listen 443 ssl;
  ssl_certificate /etc/nginx/ssl/fullchain.crt;
  ssl_certificate_key /etc/nginx/ssl/privado.rsa;
  ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers         HIGH:!aNULL:!MD5;
}

Como instalar navegador web Firefox en Windows XP en 2024

Es bastante común que necesites utilizar un software antiguo y solo funcione en windows XP al tratarse de un software demasiado antiguo y hayas tenido el problema de que después de instalar un windows XP no puedas navegar por internet.

Intentas entrar en google.com y te aparece el siguiente error:

Pues con esta pequeña entrada te digo como solucionarlo.

Desde el Internet explorer tienes que hacer clic en Herramientas y después en Opciones de Internet

En la nueva ventana tienes que hacer clic en Opciones Avanzadas y marcas Usar TLS 1.0

Con este cambio el Internet Explorer ya es algo mas usadle, no podrás hacer muchas cosas ya que TLS 1.0 casi ya no se usa, pero por lo menos podrás usar google.com

El siguiente paso es fuscar firefox en el buscador de google y abrir el enlace.

Firefox nos dejara descargarnos la versión extendida Firefox ESR


Y una vez descargado e instalada podremos navegar por cualquier web actual en el año 2024.

Instalar y configurar SNMP en centos 7

Puede que alguna vez os haya tocado pelearos con el protocolo SNMP para sacar información de algún router, switch, etc.

Pues con esta pequeña entrada voy a explicar como instalarl un servidor SNMP en un centos7.

Instalamos el servidor SNMP y las librerías necesarios.

yum install net-snmp net-snmp-utils -y

Habilitamos el servicio en el arranque y lo arrancamos

systemctl enable snmpd
systemctl start snmpd

Abrimos los puertos para acceder a la información del protocolo SNMP remotamente.

firewall-cmd --zone=public --add-port=161/udp --permanent
firewall-cmd --zone=public --add-port=161/tcp --permanent
firewall-cmd --zone=public --add-port=162/udp --permanent
firewall-cmd --zone=public --add-port=162/tcp --permanent
firewall-cmd --reload

Por ultimo remotamente hacemos consultar para ver que podemos obtener la información.

##Descripción sistema operativo
snmpwalk -v1 -c public <IP> .1.3.6.1.2.1.1.1

##Contacto
snmpwalk -v1 -c public <IP> .1.3.6.1.2.1.1.4

##Hostname
snmpwalk -v1 -c public <IP> .1.3.6.1.2.1.1.5

Instalar docker en centos 7

Antes de instalar docker en centos 7 necesitamos añadir el repositorio con los siguientes comandos.

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Ahora instalamos la ultima versión de docker.

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Una vez instalado arrancamos docker.

sudo systemctl start docker

Y verificamos el funcionamiento arrancando la imagen hello-world

sudo docker run hello-world

Ahora lo configuramos para usar docker sin usar el usuario root.

Creamos el grupo docker.

sudo groupadd docker

Añadimos nuestro usuario al grupo docker.

sudo usermod -aG docker $USER

Activamos los cambios.

newgrp docker

Verificamos el funcionamiento sin ser root

docker run hello-world

Y por ultimo configuramos docker para arrancar al inicio como un servicio del sistema.

sudo systemctl enable docker.service
sudo systemctl enable containerd.service

Integrating Amazon SES with Postfix

This entry is the official aws documentation that was available at url: https://docs.aws.amazon.com/ses/latest/dg/postfix.html until it was removed.

Postfix is an alternative to the widely used Sendmail Message Transfer Agent (MTA). For information about Postfix, go to http://www.postfix.org. The procedures in this topic will work with Linux, macOS, or Unix.

Note

Postfix is a third-party application, and isn’t developed or supported by Amazon Web Services. The procedures in this section are provided for informational purposes only, and are subject to change without notice.

Prerequisites

Before you complete the procedures in this section, you have to perform the following tasks:

  • Uninstall Sendmail, if it’s already installed on your system. The procedure for completing this step varies depending on the operating system you use.
  • Install Postfix. The procedure for completing this step varies depending on the operating system you use.
  • Install a SASL authentication package. The procedure for completing this step varies depending on the operating system you use. For example, if you use a RedHat-based system, you should install the cyrus-sasl-plain package. If you use a Debian- or Ubuntu-based system, you should install the libsasl2-modules package.
  • Verify an email address or domain to use for sending email. For more information, see Creating an email address identity.
  • If your account is still in the sandbox, you can only send email to verified email addresses. For more information, see Moving out of the Amazon SES sandbox.

Configuring Postfix

Complete the following procedures to configure your mail server to send email through Amazon SES using Postfix.

To configure Postfix

  • At the command line, type the following command:
sudo postconf -e "relayhost = [email-smtp.us-west-2.amazonaws.com]:587" \
"smtp_sasl_auth_enable = yes" \
"smtp_sasl_security_options = noanonymous" \
"smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd" \
"smtp_use_tls = yes" \
"smtp_tls_security_level = encrypt" \
"smtp_tls_note_starttls_offer = yes"

Note

If you use Amazon SES in an AWS Region other than US West (Oregon), replace email-smtp.us-west-2.amazonaws.com in the preceding command with the SMTP endpoint of the appropriate Region. For more information, see Regions and Amazon SES.

  • In a text editor, open the file /etc/postfix/master.cf. Search for the following entry:
-o smtp_fallback_relay=

If you find this entry, comment it out by placing a # (hash) character at the beginning of the line. Save and close the file.

Otherwise, if this entry isn’t present, continue to the next step.

  • In a text editor, open the file /etc/postfix/sasl_passwd. If the file doesn’t already exist, create it.
  • Add the following line to /etc/postfix/sasl_passwd:
[email-smtp.us-west-2.amazonaws.com]:587 SMTPUSERNAME:SMTPPASSWORD

Note

Replace SMTPUSERNAME and SMTPPASSWORD with your SMTP user name and password, respectively. Your SMTP user name and password aren’t the same as your AWS access key ID and secret access key. For more information about credentials, see Obtaining Amazon SES SMTP credentials.

If you use Amazon SES in an AWS Region other than US West (Oregon), replace email-smtp.us-west-2.amazonaws.com in the preceding example with the SMTP endpoint of the appropriate Region. For more information, see Regions and Amazon SES.

Save and close sasl_passwd.

  • At a command prompt, type the following command to create a hashmap database file containing your SMTP credentials:
sudo postmap hash:/etc/postfix/sasl_passwd
  • (Optional) The /etc/postfix/sasl_passwd and /etc/postfix/sasl_passwd.db files you created in the previous steps aren’t encrypted. Because these files contain your SMTP credentials, we recommend that you modify the files’ ownership and permissions in order to restrict access to them. To restrict access to these files:

At a command prompt, type the following command to change the ownership of the files:

sudo chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

At a command prompt, type the following command to change the permissions of the files so that only the root user can read or write to them:

sudo chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
  • Tell Postfix where to find the CA certificate (needed to verify the Amazon SES server certificate). The command you use in this step varies based on your operating system.

If you use Amazon Linux, Red Hat Enterprise Linux, or a related distribution, type the following command:

sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt'

If you use Ubuntu or a related distribution, type the following command:

sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt'

If you use macOS, you can generate the certificate from your system keychain. To generate the certificate, type the following command at the command line:

sudo security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain > /etc/ssl/certs/ca-bundle.crt

After you generate the certificate, type the following command:

sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt'
  • Type the following command to start the Postfix server (or to reload the configuration settings if the server is already running):
sudo postfix start; sudo postfix reload
  • Send a test email by typing the following at a command line, pressing Enter after each line. Replace sender@example.com with your From email address. The From address has to be verified for use with Amazon SES. Replace recipient@example.com with the destination address. If your account is still in the sandbox, the recipient address also has to be verified. Finally, the final line of the message has to contain a single period (.) with no other content.
sendmail -f sender@example.com recipient@example.com From: Sender Name <sender@example.com> Subject: Amazon SES Test This message was sent using Amazon SES. .
  • Check the mailbox associated with the recipient address. If the email doesn’t arrive, check your junk mail folder. If you still can’t locate the email, check the mail log on the system that you used to send the email (typically located at /var/log/maillog) for more information.

Advanced usage example

This example shows how to send an email that uses a configuration set, and that uses MIME-multipart encoding to send both a plain text and an HTML version of the message, along with an attachment. It also includes a link tag, which can be used for categorizing click events. The content of the email is specified in an external file, so that you do not have to manually type the commands in the Postfix session.

To send a multipart MIME email using Postfix

  • In a text editor, create a new file called mime-email.txt.
  • In the text file, paste the following content, replacing the values in red with the appropriate values for your account:
X-SES-CONFIGURATION-SET: ConfigSet
From:Sender Name <sender@example.com>
Subject:Amazon SES Test
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="YWVhZDFlY2QzMGQ2N2U0YTZmODU"

--YWVhZDFlY2QzMGQ2N2U0YTZmODU
Content-Type: multipart/alternative; boundary="3NjM0N2QwMTE4MWQ0ZTg2NTYxZQ"

--3NjM0N2QwMTE4MWQ0ZTg2NTYxZQ
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Amazon SES Test

This message was sent from Amazon SES using the SMTP interface.

For more information, see:
http://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-email-smtp.html

--3NjM0N2QwMTE4MWQ0ZTg2NTYxZQ
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<html>
  <head>
</head>
  <body>
    <h1>Amazon SES Test</h1>
      <p>This message was sent from Amazon SES using the SMTP interface.</p>
      <p>For more information, see
      <a ses:tags="samplekey0:samplevalue0;samplekey1:samplevalue1;" 
      href="http://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-email-smtp.html">
      Using the Amazon SES SMTP Interface to Send Email</a> in the <em>Amazon SES
      Developer Guide</em>.</p>
  </body>
</html>
--3NjM0N2QwMTE4MWQ0ZTg2NTYxZQ--
--YWVhZDFlY2QzMGQ2N2U0YTZmODU
Content-Type: application/octet-stream
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="customers.txt"

SUQsRmlyc3ROYW1lLExhc3ROYW1lLENvdW50cnkKMzQ4LEpvaG4sU3RpbGVzLENh
bmFkYQo5MjM4OSxKaWUsTGl1LENoaW5hCjczNCxTaGlybGV5LFJvZHJpZ3VleixV
bml0ZWQgU3RhdGVzCjI4OTMsQW5heWEsSXllbmdhcixJbmRpYQ==
--YWVhZDFlY2QzMGQ2N2U0YTZmODU--

Save and close the file.

  • At the command line, type the following command. Replace sender@example.com with your email address, and replace recipient@example.com with the recipient’s email address.
sendmail -f sender@example.com recipient@example.com < mime-email.txt

If the command runs successfully, it exits without providing any output.

  • Check your inbox for the email. If the message wasn’t delivered, check your system’s mail log.

Crear un certificado SSL wildcard autofirmado con OpenSSL

Alguna vez nos ha tocado crear certificados autofirmados y es una tarea un poco odiosa, pues con esta entrada voy a explicar como crear un certificado autofirmado comodín o wildcard para poder utilizar en cada web del mismo dominio.

Creamos la clave privada del certificado intermedio.

 openssl genrsa -des3 -out CAPrivate.key 2048


Generamos el certificado intermedio.

 openssl req -x509 -new -nodes -key CAPrivate.key -sha256 -days 365 -out CAPrivate.pem

Creamos clave privada.

 openssl genrsa -out MyPrivate.key 2048

Generamos el CSR

 openssl req -new -key MyPrivate.key -extensions v3_ca -out MyRequest.csr

Creamos el fichero openssl.ss.cnf para crear la entrada de dominio wildcard a utilizar.

basicConstraints=CA:FALSE
subjectAltName=DNS:*.mydomain.tld
extendedKeyUsage=serverAuth

Creamos el certificado utilizando el CSR creado.

 openssl x509 -req -in MyRequest.csr -CA CAPrivate.pem -CAkey CAPrivate.key -CAcreateserial -extfile openssl.ss.cnf -out MyCert.crt -days 365 -sha256

Y ya tendríamos el certificado creado, teniendo los siguientes ficheros:

Clave privada: MyPrivate.key
Certificado intermedio: CAPrivate.pem
Certificado wildcard: MyCert.crt

Si quisiéramos utilizar el navegador en un servidor web tipo nginx pues solo tendríamos que crear un fichero bundle fusionando el certificado intermedio y el wildcard.

cat MyCert.crt CAPrivate.pem > MyCert.bundle.crt 

Actualizar curl en centos 7

A todos los sistemas nos encanta centos 7, es estable, irrompible y fácil de administrar, pero es conocido el problema de actualizar librerías ya que desde hace años no se actualizan las oficiales.

Eso nos genera muchos problemas ya que no pasan muchas auditorias de seguridad, uno de los casos mas comunes se trata de curl, ya que es usado por entornos web como apache+php y la ultima versión de curl es la 7.29.0.

Con esta pequeña entrada voy a explicar como actualizar curl en centos 7 de una manera rápida y sencilla.

Lo primero que haremos es añadir el repositorio de terceros con la librería de curl actualizada.

rpm -Uvh http://www.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-3-7.rhel7.noarch.rpm

Este repositorio se actualiza constantemente, de no estar disponible la url solo tenemos que acceder a http://www.city-fan.org/ftp/contrib/yum-repo/ y coger la mas reciente.

El siguiente paso es habilitar el repositorio e instalar / actualizar curl.

yum --enablerepo=city-fan.org install libcurl libcurl-devel curl -y

Y ya tendríamos actualizado curl en el sistema y con un “curl -V” podemos ver la versión actualizada.

Si en el servidor tenemos un apache+php y queremos que se actualice la versión de curl, solo tendríamos que reiniciar el servidor.

systemctl restart httpd.service

Y desde la función phpinfo() podemos ver como el curl se ha actualizado.

Solucionar error: “Failed to download metadata for repo ‘appstream’: Cannot prepare internal mirrorlist: No URLs in mirrorlist” en centos 8.

Seguimos con los errores recurrentes, puede que nos haya pasado que al instalar algún paquete con yum en centos 8 nos haya salido el siguiente error: “Failed to download metadata for repo ‘appstream’: Cannot prepare internal mirrorlist: No URLs in mirrorlist”

Este error es debido a que centos ha cambiado las urls de descarga de los paquetes de los repositorios.

Pues con estos dos pequeños comandos te explico como solucionarlo.

Con el primer comando modificaremos la linea que contiene la variable mirrorlist de todos los ficheros de la carpeta /etc/yum.repos.d que empiecen por CentOS, y la dejaremos comentada #mirrorlist.

sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*

Y con el segundo comando descomentaremos la variable comentada #baseurl y añadiremos la nueva url de los repositorios de centos, baseurl=http://vault.centos.org/$contentdir/$releasever/AppStream/$basearch/os/

sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*

Como paso final actualizamos con “yum clean all” los cambios y ya podremos instalar paquetes por repositorio con yum.

yum clean all

Como convertir certificado Let’s encrypt en keystore java para tomcat (jks)

Todos conocemos Let’s encrypt, en un servicio muy comido que nos permite instalar certificados SSL seguros de manera cómoda y gratuita.

Pero desgraciadamente no los crea en formato jks y no podemos utilizarlos en servidores de aplicaciones tomcat.

Pero esto lo podemos solucionar de una manera muy fácil utilizando las herramientas openssl y keytool que nos permiten convertirlo en formato jks.

Lo primero que haremos es con openssl exportar la clave privada (privkey1.pem) y el certificado (fullchain1.pem) y guardarlo en un fichero p12 (fichero.p12) con el siguiente comando:

openssl pkcs12 -export -out fichero.p12 -inkey privkey1.pem -in fullchain1.pem -name "tomcat-cert"

A continuación con keytool generaremos el llavero jks (llavero.jks) con el siguiente comando:

keytool -importkeystore -srckeystore fichero.p12 -srcstoretype pkcs12 -destkeystore llavero.jks

Y ya tendríamos el certificado keystore creado.

Lo ultimo que tendríamos que haces es configurar el server.xml de tomcat para que utiliza el llavero creado, añadiendo la password que usamos para su creación (en el ejemplo “secreta”).

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true" URIEncoding="UTF-8"
        keystoreFile="llavero.jks"
keystorePass="secreta" keyAlias="tomcat-cert"
clientAuth="false" sslProtocol="TLS" />

Poner certificado https en nginx con Let’s encrypt y Docker

Poner certificados https muchas veces nos da verdaderos dolores de cabeza, pero para solucionarnos este problema se crearon los certificados Let’s encrypt que de una manera sencilla nos permite utilizar certificados gratuitos y renovarlos periódicamente.

En esta entrada voy a explicar a poner el certificado en entornos con docker y lo primero que vamos a hacer es crear el docker-compose.yml donde crearemos el contenedor para el nginx.

version: '3'

services:
  nginx:
    image: nginx:latest
    ports:
      - 80:80
      - 443:443
    restart: always
    volumes:
      - ./nginx/conf.d/:/etc/nginx/conf.d/:ro

A continuación creamos el fichero de configuración del nginx ( ./nginx/conf.d/default.conf ) cambiando example.org pro nuestro dominio.

server {
    listen 80;
    listen [::]:80;

    server_name example.org www.example.org;
    server_tokens off;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://example.org$request_uri;
    }
}

Ahora arrancamos el contenedor y vemos como el nginx es accesible.

docker-compose up -d

El siguiente paso es crear el servicio certbot que se encargara de crear nuestro certificado editando el fichero docker-compose.yml.

version: '3'

services:

  webserver:
    image: nginx:latest
    ports:
      - 80:80
      - 443:443
    restart: always
    volumes:
      - ./nginx/conf.d/:/etc/nginx/conf.d/:ro
      - ./certbot/www/:/var/www/certbot/:ro
      - ./certbot/conf.d/:/etc/nginx/ssl/:ro

  certbot:
    image: certbot/certbot:latest
    volumes:
      - ./certbot/www/:/var/www/certbot/:rw
      - ./certbot/conf.d/:/etc/letsencrypt/:rw

Volvemos a lanzar el docker-compose para crear los directorios que utilizara certbot

docker-compose up -d

Una vez cambiado el docker-compose.yml lanzamos el comando para crear los certificados, cambiando el dominio example.org por el nuestro.

docker-compose run --rm  certbot certonly --webroot --webroot-path /var/www/certbot/ -d example.org

Una vez que ya tengamos los certificados creados editamos el fichero de configuración del nginx (./nginx/conf.d/default.conf) cambiando el dominio example.org por el nuestro.

En el ejemplo uso el nginx como proxy para servir un tomcat.

server {
    listen 80;
    listen [::]:80;

    server_name example.org www.example.org;
    server_tokens off;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://example.org$request_uri;
    }
}

server {
    listen 443 default_server ssl http2;
    listen [::]:443 ssl http2;

    server_name example.org;

    ssl_certificate /etc/nginx/ssl/live/example.org/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/example.org/privkey.pem;
    
    location / {
      proxy_pass      http://127.0.0.1:8080;
    }
}

Ya por ultimo paramos el contenedor del nginx y recreamos los contenedores.

docker stop nginx

docker-compose up -d

Y ya tendriamos nuestra web accesible con https y certificado seguro.

Como ultimo paso añado el comando que tenemos que utilizar cuando queramos renovar el certificado.

docker-compose run --rm certbot renew