Skip to content

xXDavisitoXx/WireGuard_CertMaker_Debian

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

WireGuard Cert Maker Script

Portada de CertMaker

📖 Contenido

✅ Requisitos

  • Una maquina Debian
  • Tener instalado WireGuard
  • Conocimiento basico de redes

:atom: Caracteristicas

Este script nos permite:

  • Crear certificados del servidor y cliente
  • Comprbar correspondencia entre los certificados del servidor y cliente
  • Borrar certificados del servidor y cliente
#!/bin/bash

while true; do
        clear
        echo ""
        echo "=============================================="
        echo "    MENU ADMINISTRACION CERTIFICADOS WIREGUARD     "
        echo "=============================================="
        echo "1) Crear par de claves para cliente VPN"
        echo "2) Comprobar ficheros de cliente VPN"
        echo "3) Borrar par de claves del cliente VPN"
        echo "4) Comprobar par de claves del servidor VPN"
        echo "5) Crear par de claves del servidor VPN"
        echo "6) Eliminar par de claves del servidor VPN"
        echo "0|q|exit) Salir"
        echo "=============================================="
        echo ""
        read -p "Elige una opcion: " OPCION

        case "$OPCION" in
                1)
                        echo ""
                        echo "Opcion seleccionada crear ficheros de cliente VPN"
                        echo "Si no tiene nombre poner [user] "
                        read -p "Ingrese el nombre del cliente VPN: " USUARIO

                        if [ -z "$USUARIO" ]; then
                                echo "El nombre del cliente no puede estar vacío."
                                read -n1 -r -p "Presione [Enter] para continuar..."
                                continue
                        fi

                        RUTA="/etc/wireguard/clients/${USUARIO}"
                        CLIENT_KEY="${RUTA}/${USUARIO}.key"
                        CLIENT_PUB="${RUTA}/${USUARIO}.pub"

                # Comprobar si el directorio o certificados ya existen
                        if [ -d "$RUTA" ]; then
                                echo ""
                                echo "ADVERTENCIA: El directorio para el cliente '${USUARIO}' ya existe."

                                if [ -f "$CLIENT_KEY" ] || [ -f "$CLIENT_PUB" ]; then
                                        echo "Se han encontrado certificados existentes:"
                                        [ -f "$CLIENT_KEY" ] && echo "- ${CLIENT_KEY}"
                                        [ -f "$CLIENT_PUB" ] && echo "- ${CLIENT_PUB}"

                                        read -p "¿Desea sobrescribir los certificados existentes? [y/N]: " CONFIRM
                                        if [[ ! "$CONFIRM" =~ [yYsS] ]]; then
                                                echo "Operación cancelada. No se modificaron los certificados."
                                                read -n1 -r -p "Presione [Enter] para continuar..."
                                                continue
                                        fi
                                fi
                        fi

                # Crear directorio (o continuar si ya existe)
                        mkdir -p "$RUTA"
                        echo "Generando pares de claves..."
                        wg genkey | tee "${CLIENT_KEY}" > /dev/null
                        cat "${CLIENT_KEY}" | wg pubkey | tee "${CLIENT_PUB}" > /dev/null

                        echo ""
                        echo "Se han creado los certificados para el cliente '${USUARIO}' en:"
                        echo "- Clave privada: ${CLIENT_KEY}"
                        echo "- Clave pública: ${CLIENT_PUB}"

                        read -n1 -r -p "Presione [Enter] para continuar..."
                ;;

                2)
                        read -p "Ingrese el nombre del cliente a comprobar: " USUARIO
                        echo""

                        if [ -z "$USUARIO" ]; then
                                echo "El nombre del cliente no puede estar vacío."
                                read -n1 -r -p "Presione [Enter] para continuar..."
                                continue
                        fi

                        RUTA="/etc/wireguard/clients/${USUARIO}"

                        if [ ! -d "$RUTA" ]; then
                                echo "No existe ningún dato con ese nombre del cliente '${USUARIO}'."
                        else
                        CLIENT_KEY="${RUTA}/${USUARIO}.key"
                        CLIENT_PUB="${RUTA}/${USUARIO}.pub"

                        if [ -f "$CLIENT_KEY" ] && [ -f "$CLIENT_PUB" ]; then
                                echo "El cliente '${USUARIO}' ya tiene ficheros creados."
                                echo ""

                        # Verificar formato de la clave privada
                                if grep -qE '^[A-Za-z0-9+/]{42,44}={0,2}$' "$CLIENT_KEY" && [ $(wc -c < "$CLIENT_KEY") -eq 45 ]; then
                                        echo " - OK: La clave PRIVADA tiene el formato correcto."
                                else
                                        echo " - WARNING:  La clave PRIVADA tiene un formato INCORRECTO."
                                fi

                        # Verificar formato de la clave publica
                                if grep -qE '^[A-Za-z0-9+/]{42,44}={0,2}$' "$CLIENT_PUB" && [ $(wc -c < "$CLIENT_PUB") -eq 45 ]; then
                                        echo " - OK: La clave PUBLICA tiene el formato correcto."
                                        echo ""
                                else
                                        echo " - WARNING: La clave PUBLICA tiene un formato INCORRECTO."
                                        echo ""
                                fi

                        # Verificar que la clave publica corresponde a la privada
                                echo "TOTAL:"
                                if [ "$(cat "$CLIENT_KEY" | wg pubkey)" == "$(cat "$CLIENT_PUB")" ]; then
                                        echo " - OK: Las claves son CORRESPONDIENTES (la publica corresponde con la privada)."
                                else
                                        echo " - WARNING: Las claves NO SE CORRESPONDEN."
                                        echo ""
                                fi
                                else
                                        echo "Ficheros incorrectos para el cliente '${USUARIO}':"
                                        [ ! -f "$CLIENT_KEY" ] && echo "- Falta el fichero .key"
                                        [ ! -f "$CLIENT_PUB" ] && echo "- Falta el fichero .pub"
                                fi
                        fi

                        read -n1 -r -p "Presione [Enter] para continuar..."
                ;;

                3)
                        read -p "Ingrese el nombre del cliente a borrar: " USUARIO

                        if [ -z "$USUARIO" ]; then
                                echo "El nombre del cliente no puede estar vacío."
                                read -n1 -r -p "Presione [Enter] para continuar..."
                                continue
                        fi

                        RUTA="/etc/wireguard/clients/${USUARIO}"
                        CLIENT_KEY="${RUTA}/${USUARIO}.key"
                        CLIENT_PUB="${RUTA}/${USUARIO}.pub"

                # Comprobar si existe el directorio
                        if [ ! -d "$RUTA" ]; then
                                echo "El directorio del cliente '${USUARIO}' no existe."
                                read -n1 -r -p "Presione [Enter] para continuar..."
                                continue
                        fi

                # Comprobar si existen los ficheros de certificado
                        if [ ! -f "$CLIENT_KEY" ] || [ ! -f "$CLIENT_PUB" ]; then
                                echo "Advertencia: El directorio del cliente '${USUARIO}' no contiene ficheros de certificado válidos."
                                echo "Pero el directorio existe y puede contener otros archivos."
                                read -p "¿Desea borrar TODO el contenido del directorio '${USUARIO}'? [y/N]: " CONFIRM
                                if [[ "$CONFIRM" =~ [yYsS] ]]; then
                                        rm -rf "$RUTA"
                                        if [ $? -eq 0 ]; then
                                                echo "Directorio del cliente '${USUARIO}' borrado completamente."
                                        else
                                        echo "Error al borrar el directorio."
                                        fi
                                else
                                        echo "Operacion cancelada."
                                fi
                                read -n1 -r -p "Presione [Enter] para continuar..."
                                continue
                        fi

                # Si existen los certificados, pedir confirmacion para borrar
                                read -p "¿Está seguro que desea borrar los certificados y el directorio del cliente '${USUARIO}'? [y/N]: " CONFIRM
                                if [[ "$CONFIRM" =~ [yYsS] ]]; then
                                        rm -rf "$RUTA"
                                if [ $? -eq 0 ]; then
                                        echo "Ficheros y directorio del cliente '${USUARIO}' borrados correctamente."
                                else
                                        echo "Error al borrar los ficheros."
                                fi
                                else
                                        echo "Operacion cancelada."
                                fi

                                read -n1 -r -p "Presione [Enter] para continuar..."
                ;;

                4)
                        echo ""
                        echo "Comprobando par de claves del servidor..."
                        echo ""

                # Preguntar por los nombres de los ficheros con valores por defecto
                        read -p "Escribe el nombre del fichero .key (sin la extension) alojado en la ruta /etc/wireguard/ [por defecto: server]: " KEY_NAME
                        read -p "Escribe el nombre del fichero .pub (sin la extension) alojado en la ruta /etc/wireguard/ [por defecto: server]: " PUB_NAME
                        read -p "Escribe el nombre del fichero .conf (sin la extension) alojado en la ruta /etc/wireguard/ [por defecto: wg0]: " WG_CONF_NAME

                # Establecer valores por defecto si el usuario no introduce nada
                        KEY_NAME=${KEY_NAME:-server}
                        PUB_NAME=${PUB_NAME:-server}
                        WG_CONF_NAME=${WG_CONF_NAME:-wg0}
                        SERVER_KEY="/etc/wireguard/${KEY_NAME}.key"
                        SERVER_PUB="/etc/wireguard/${PUB_NAME}.pub"
                        WG_CONF="/etc/wireguard/${WG_CONF_NAME}.conf"

                        if [ -f "$SERVER_KEY" ] && [ -f "$SERVER_PUB" ]; then
                                echo ""
                                echo "Los ficheros de claves del servidor existen:"
                                echo "- Clave privada: $SERVER_KEY"
                                echo "- Clave pública: $SERVER_PUB"
                                echo ""

                # Verificar formato de la clave privada
                        if grep -qE '^[A-Za-z0-9+/]{42,44}={0,2}$' "$SERVER_KEY" && [ $(wc -c < "$SERVER_KEY") -eq 45 ]; then
                                echo " - OK: La clave PRIVADA tiene el formato correcto."
                        else
                                echo " - ALERTA: La clave PRIVADA tiene un formato INCORRECTO."
                        fi

                # Verificar formato de la clave pública
                        if grep -qE '^[A-Za-z0-9+/]{42,44}={0,2}$' "$SERVER_PUB" && [ $(wc -c < "$SERVER_PUB") -eq 45 ]; then
                                echo " - OK: La clave PUBLICA tiene el formato correcto."
                                echo ""
                        else
                                echo " - ALERTA: La clave PUBLICA tiene un formato INCORRECTO."
                                echo ""
                        fi

                # Verificar que la clave publica corresponde a la privada
                        echo " TOTAL: "
                        if [ "$(cat "$SERVER_KEY" | wg pubkey)" == "$(cat "$SERVER_PUB")" ]; then
                                echo " - OK: Las claves son PARES (la publica pertenece a la privada)."
                        else
                                echo " - ALERTA: Las claves NO SON PARES (la pública NO pertenece a la privada)."
                                echo ""
                        fi

                # Comprobar que existe el fichero de configuración
                        if [ ! -f "$WG_CONF" ]; then
                                echo " - ALERTA: El fichero de configuración $WG_CONF no existe."
                        else

                # Comprobar que la clave privada encontrada fichero de configuracion esta correcta
                        if grep -q "^PrivateKey = $(cat "$SERVER_KEY")" "$WG_CONF"; then
                                echo " - OK: Los pares de claves están correctos y la clave está instalada en el fichero de configuración VPN ($WG_CONF_NAME)."
                        else
                                echo " - ALERTA: La clave privada del servidor ${KEY_NAME}.key no está instalada en el fichero ${WG_CONF_NAME}.conf"
                        fi
                fi
                else
                        echo ""
                        echo "Ficheros de certificados del servidor no encontrados:"
                        [ ! -f "$SERVER_KEY" ] && echo "- No existe: $SERVER_KEY"
                        [ ! -f "$SERVER_PUB" ] && echo "- No existe: $SERVER_PUB"
                                echo "Por favor, verifica los nombres introducidos."
                fi

                read -n1 -r -p "Presione [Enter] para continuar..."
        ;;

        5)
                        echo ""
                        echo "Creando par de claves del servidor..."
                        echo ""

                # Preguntar por los nombres de los ficheros (con valores por defecto)
                        read -p "Escribe el nombre para el fichero .key (sin extension) [por defecto: server]: " KEY_NAME
                        read -p "Escribe el nombre para el fichero .pub (sin extension) [por defecto: server]: " PUB_NAME

                # Establecer valores por defecto si el usuario no introduce nada
                        KEY_NAME=${KEY_NAME:-server}
                        PUB_NAME=${PUB_NAME:-server}
                        SERVER_KEY="/etc/wireguard/${KEY_NAME}.key"
                        SERVER_PUB="/etc/wireguard/${PUB_NAME}.pub"

                # Comprobar si ya existen los ficheros con formato correcto
                        if [ -f "$SERVER_KEY" ] && [ -f "$SERVER_PUB" ]; then
                                echo "Los ficheros de claves del servidor ya existen:"
                                echo "- Clave privada: $SERVER_KEY"
                                echo "- Clave publica: $SERVER_PUB"

                # Verificar si tienen el formato correcto
                                KEY_VALID=$(grep -qE '^[A-Za-z0-9+/]{42,44}={0,2}$' "$SERVER_KEY" && [ $(wc -c < "$SERVER_KEY") -eq 45 ] && echo "true")
                                PUB_VALID=$(grep -qE '^[A-Za-z0-9+/]{42,44}={0,2}$' "$SERVER_PUB" && [ $(wc -c < "$SERVER_PUB") -eq 45 ] && echo "true")

                                if [ "$KEY_VALID" = "true" ] && [ "$PUB_VALID" = "true" ]; then
                                        echo " - Las claves existentes tienen el formato correcto."
                                        echo " - No se realizara ninguna accion para evitar sobrescribirlas."
                                        echo " - NOTA: Elimine primero los ficheros $SERVER_KEY y $SERVER_PUB "
                                else
                                        echo " - ALERTA: Las claves existentes tienen formato incorrecto."
                                        read -p "¿Desea sobrescribirlas? [y/N]: " CONFIRM
                                        if [[ "$CONFIRM" =~ [yY] ]]; then
                # Continuar con la creacion
                                                echo " - Sobrescribiendo claves existentes..."
                                                else
                                                echo " - Operacion cancelada."
                                                read -n1 -r -p "Presione [Enter] para continuar..."
                                                continue
                                        fi
                                fi
                        else
                # Crear directorio si no existe
                                mkdir -p "/etc/wireguard/"
                                echo "Creando nuevas claves para el servidor en:"
                                echo "- Clave privada: $SERVER_KEY"
                                echo "- Clave publica: $SERVER_PUB"

                # Generar claves
                                wg genkey | tee "$SERVER_KEY" > /dev/null
                                cat "$SERVER_KEY" | wg pubkey | tee "$SERVER_PUB" > /dev/null

                # Verificar que se crearon correctamente
                                if [ -f "$SERVER_KEY" ] && [ -f "$SERVER_PUB" ]; then
                                        echo " - Las claves del servidor se han creado correctamente."

                # Verificar formato
                                        if grep -qE '^[A-Za-z0-9+/]{42,44}={0,2}$' "$SERVER_KEY" && [ $(wc -c < "$SERVER_KEY") -eq 45 ]; then
                                                echo " - OK: La clave PRIVADA del servidor tiene el formato correcto."
                                        else
                                                echo " - ALERTA: La clave PRIVADA del servidor tiene un formato INCORRECTO."
                                        fi

                                        if grep -qE '^[A-Za-z0-9+/]{42,44}={0,2}$' "$SERVER_PUB" && [ $(wc -c < "$SERVER_PUB") -eq 45 ]; then
                                                echo " - OK: La clave PUBLICA del servidor tiene el formato correcto."
                                        else
                                                echo " - ALERTA: La clave PUBLICA del servidor tiene un formato INCORRECTO."
                                        fi

                # Verificar correspondencia
                                        if [ "$(cat "$SERVER_KEY" | wg pubkey)" == "$(cat "$SERVER_PUB")" ]; then
                                                echo " - OK: Las claves son PARES entre si."
                                        else
                                                echo " - ALERTA: Las claves NO son PARES entre si."
                                        fi
                                        else
                                                echo " - ERROR: No se pudieron crear las claves del servidor."
                                        fi
                                fi

                read -n1 -r -p "Presione [Enter] para continuar..."
        ;;

        6)
                echo ""
                echo "Borrando par de claves del servidor..."
                echo ""

                # Preguntar por los nombres de los ficheros con valores por defecto
                        read -p "Escribe el nombre del fichero .key (sin la extensión) alojado en la ruta /etc/wireguard/ [por defecto: server.key]: " KEY_NAME
                        read -p "Escribe el nombre del fichero .pub (sin la extensión) alojado en la ruta /etc/wireguard/ [por defecto: server.pub]: " PUB_NAME

                # Establecer valores por defecto si el usuario no introduce nada
                        KEY_NAME=${KEY_NAME:-server}
                        PUB_NAME=${PUB_NAME:-server}
                        SERVER_KEY="/etc/wireguard/${KEY_NAME}.key"
                        SERVER_PUB="/etc/wireguard/${PUB_NAME}.pub"

                        if [ -f "$SERVER_KEY" ] && [ -f "$SERVER_PUB" ]; then
                                echo ""
                                echo "Los ficheros de claves del servidor existen:"
                                echo "- Clave privada: $SERVER_KEY"
                                echo "- Clave pública: $SERVER_PUB"
                                echo ""

                # Verificar formato de la clave privada
                        if grep -qE '^[A-Za-z0-9+/]{42,44}={0,2}$' "$SERVER_KEY" && [ $(wc -c < "$SERVER_KEY") -eq 45 ]; then
                                echo " - OK: La clave PRIVADA tiene el formato correcto."
                        else
                                echo " - ALERTA: La clave PRIVADA tiene un formato INCORRECTO."
                        fi

                # Verificar formato de la clave publica
                        if grep -qE '^[A-Za-z0-9+/]{42,44}={0,2}$' "$SERVER_PUB" && [ $(wc -c < "$SERVER_PUB") -eq 45 ]; then
                                echo " - OK: La clave PUBLICA tiene el formato correcto."
                                echo ""
                        else
                                echo " - ALERTA: La clave PUBLICA tiene un formato INCORRECTO."
                                echo ""
                        fi

                # Verificar que la clave publica corresponde a la privada
                        echo "TOTAL:"
                        if [ "$(cat "$SERVER_KEY" | wg pubkey)" == "$(cat "$SERVER_PUB")" ]; then
                                echo " - OK: Las claves son CORRESPONDIENTES (la publica deriva de la privada)."
                        else
                                echo " - ALERTA: Las claves NO CORRESPONDEN entre sí."
                                echo ""
                        fi

                # Pedir confirmación especial para borrar
                        echo ""
                        echo "ADVERTENCIA: Si borras estas claves:"
                        echo "- Los clientes vinculados no podrán volver a conectarse"
                        echo "- La configuración actual del servidor dejará de funcionar"
                        echo "- Necesitarás generar nuevas claves y reconfigurar todos los clientes"
                        echo ""
                        read -p "¿Está ABSOLUTAMENTE seguro de que desea borrar estos pares de claves? Escriba DELETE y presione Enter para confirmar: " CONFIRM

                        if [ "$CONFIRM" == "DELETE" ]; then
                                echo "Editando permisos para poder eliminar..."
                                chmod 777 "$SERVER_KEY" "$SERVER_PUB"
                                echo "Eliminando $SERVER_KEY y $SERVER_PUB"
                                rm -f "$SERVER_KEY" "$SERVER_PUB"
                                if [ $? -eq 0 ]; then
                                        echo ""
                                        echo "Las claves han sido eliminadas permanentemente:"
                                        echo "- $SERVER_KEY"
                                        echo "- $SERVER_PUB"
                                        echo ""
                                        echo "ADVERTENCIA: Ahora necesitarás:"
                                        echo "1. Generar nuevas claves (opción 5)"
                                        echo "2. Actualizar la configuración de WireGuard"
                                        echo "3. Reconfigurar TODOS los clientes con las nuevas claves"
                                else
                                        echo "Error al intentar borrar las claves. Verifica los permisos."
                                fi
                                else
                                        echo "Operación cancelada. Las claves no se han borrado."
                                fi
                        else
                                echo ""
                               echo "Ficheros de certificados del servidor no encontrados:"
                                [ ! -f "$SERVER_KEY" ] && echo "- No existe: $SERVER_KEY"
                                [ ! -f "$SERVER_PUB" ] && echo "- No existe: $SERVER_PUB"
                                        echo "Por favor, verifica los nombres introducidos."
                                fi

                read -n1 -r -p "Presione [Enter] para continuar..."
        ;;

        0|q|exit)
                        echo ""
                        echo "Saliendo del script..."
                        exit 0
        ;;

        *)
            echo "Opcion no valida. Intente nuevamente."
            read -n1 -r -p "Presione [Enter] para continuar..."
        ;;
    esac
done

About

Easy script to manage user certificates for WireGuardVPN on debian13

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Sponsor this project

Packages

 
 
 

Contributors

Languages