¿Automatización de clave de compilación de OpenVPN easy-rsa?

18

Tengo muchas claves para generar para el servidor VPN de mis clientes. Cada vez que uso easy-rsa para generar las claves de esta manera:

./build-key client1

Hay algunos resultados con una serie de preguntas. Todas las preguntas tienen respuestas predeterminadas que se definen en el varsarchivo.

Generating a 1024 bit RSA private key
............................................++++++
.......................++++++
writing new private key to 'client1.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:
State or Province Name (full name) [CO]:
Locality Name (eg, city) [Denver]:
Organization Name (eg, company) [mycompany]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [client1]:
Email Address [[email protected]]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'US'
stateOrProvinceName   :PRINTABLE:'CO'
localityName          :PRINTABLE:'Denver'
organizationName      :PRINTABLE:'mycompany'
commonName            :PRINTABLE:'client1'
emailAddress          :IA5STRING:'[email protected]'
Certificate is to be certified until Jan  3 20:16:04 2038 GMT (9999 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

En general, tengo que presionar manualmente las siguientes teclas:

ENTER
ENTER
ENTER
ENTER
ENTER
ENTER
ENTER
ENTER
y
ENTER
y
ENTER

Básicamente solo estoy aceptando todas las respuestas predeterminadas y diciendo 'sí' a las dos preguntas finales. ¿Hay alguna -forceo -quietbanderas o algo con lo que pueda usar build-key? Si no, ¿hay trucos de scripting o bash que pueda usar para hacer esto siempre? No puedo encontrar nada en ninguna página de manual al respecto.

Jake Wilson
fuente

Respuestas:

14

Si observa la fuente de build-key, encontrará que está llamando pkitool. Escribí un contenedor para agrupar las claves del cliente y los archivos de configuración de openvpn apropiados en un tarball que luego podría dar a mis usuarios:

#!/bin/bash

client=$1

if [ x$client = x ]; then
    echo "Usage: $0 clientname"
    exit 1
fi

if [ ! -e keys/$client.key ]; then
    echo "Generating keys..."
    . vars
    ./pkitool $client
    echo "...keys generated." 
fi

tarball=./keys/$client.tgz

if [ ! -e $tarball ]; then
    echo "Creating tarball..."
    tmpdir=/tmp/client-tar.$$
    mkdir $tmpdir
    cp company.ovpn $tmpdir/company.ovpn
    cp keys/ca.crt $tmpdir 
    cp keys/$client.key $tmpdir/client.key
    cp keys/$client.crt $tmpdir/client.crt
    tar -C $tmpdir -czvf $tarball .
    rm -rf $tmpdir
    echo "...tarball created" 
else
    echo "Nothing to do, so nothing done. (keys/$client.tgz already exists)" 
fi
pjz
fuente
19

prueba la bandera de lote

./build-key --batch client1
Tomot
fuente
Intenté esto, pero el nombre común era la dirección del servidor, no el nombre de ellos que quería generar, como es el comportamiento sin la bandera de lote
David Poxon
Para mí esta es la respuesta a la pregunta planteada. Así es como automatizar la producción clave para la mayoría de las configuraciones estándar y sugerir aceptar esto como la respuesta.
James Firth
2

Lo que me viene a la mente más rápido es expect; le permite automatizar este tipo de interacciones de línea de comandos.

Christian Paredes
fuente
3
esperar es demasiado exagerado para esto; easy-rsa es todos los scripts de shell, por lo que es fácil de hackear.
pjz
2

La nueva versión de EasyRSA viene como un solo binario en este momento. Para automatizar la creación de una clave de cliente, ahora puede usar el archivo "vars" (simplemente colóquelo en el mismo directorio que easyrsa binary):

if [ -z "$EASYRSA_CALLER" ]; then
    echo "You appear to be sourcing an Easy-RSA 'vars' file." >&2
    echo "This is no longer necessary and is disallowed. See the section called" >&2
    echo "'How to use this file' near the top comments for more details." >&2
    return 1
fi

set_var EASYRSA        "$PWD"
set_var EASYRSA_OPENSSL        "openssl"
set_var EASYRSA_PKI            "$EASYRSA/pki"
set_var EASYRSA_DN     "org"

set_var EASYRSA_REQ_COUNTRY    "Country"
set_var EASYRSA_REQ_PROVINCE   "Province"
set_var EASYRSA_REQ_CITY       "City"
set_var EASYRSA_REQ_ORG        "Org Ltd"
set_var EASYRSA_REQ_EMAIL      "[email protected]"
set_var EASYRSA_REQ_OU         "Infrastructure"

set_var EASYRSA_KEY_SIZE       2048

set_var EASYRSA_ALGO           rsa

set_var EASYRSA_CA_EXPIRE      3650
set_var EASYRSA_CERT_EXPIRE    365
set_var EASYRSA_CRL_DAYS       180

set_var EASYRSA_TEMP_FILE      "$EASYRSA_PKI/extensions.temp"

y usa el binario de EasyRSA:

./easyrsa build-client-full client1 nopass
usuario394252
fuente
1

Yo tuve el mismo problema.

La solución que encontré fue:

echo -en "\ n \ n \ n \ n \ n \ n \ n \ ny \ ny \ n" | ./build-key client1

Cristiano Felipe
fuente
Esto funcionó para mí. Me gusta más porque no requiere que el usuario entienda el guión.
AFP_555
1

Esto es similar a lo que uso. Espero que esto ayude a alguien, me tomó horas resolver esto. Asegúrese de estar ejecutando en el directorio easy-rsa, y no se olvide de la fuente ./vars

(echo -en "\n\n\n\n\n\n\n\n"; sleep 1; echo -en "\n"; sleep 1; echo -en "\n"; sleep 3; echo -en "yes"; echo -en "\n"; sleep 3; echo -en "yes"; echo -en "\n") | ./build-key $key_id 
Kevin Knowlen
fuente
0

Hice un contenedor como pjz, pero al agrupar todos los archivos necesarios en un solo archivo .ovpn, que se puede usar directamente

#! / bin / bash
cd /etc/openvpn/easy-rsa/2.0
cliente = $ 1

si [x $ cliente = x]; luego
    echo "Uso: $ 0 nombre de cliente"
    salida 1
fi

Si [ ! -e claves / $ client.key]; luego
    echo "Generando claves ..."
    . vars
    ./pkitool $ client
    echo "... claves generadas".
fi

paquete =. / keys / $ client.ovpn

Si [ ! -e $ paquete]; luego
    echo "Creando paquete ..."
    cat keys / template.ovpn >> $ paquete
    echo '' >> $ paquete
    cat keys / ca.crt >> $ paquete
    echo '' >> $ paquete
    echo '' >> $ paquete
    echo '' >> $ paquete
    awk '/ BEGIN CERTIFICATE /, 0' keys / $ client.crt >> $ bundle
    echo '' >> $ paquete
    echo '' >> $ paquete
    echo '' >> $ paquete
    llaves del gato / $ client.key >> $ bundle
    echo '' >> $ paquete
    echo '' >> $ paquete
    echo "... paquete creado"
más
    echo "Nada que hacer, así que nada hecho. (keys / $ client.ovpn ya existe)"
fi
rattkin
fuente
0

Acabo de intentar hacer lo mismo, generando silenciosamente a los usuarios de openvpn en el cuadro freeBSD.

Esto resultó en un nuevo archivo, llamado acertadamente ./build-key-quiet

#!/bin/sh

# Make a certificate/private key pair using a locally generated
# root certificate.
# JP - automating my time away

cd /root/openvpn

client=$1

if [ x$client = x ];
    then
    echo "Usage: $0 clientname"
    exit 1
fi

if [ ! -e keys/$client.key ];
  then
    echo "Generating keys..."
    . ./vars
    ./pkitool $client
    echo "Great Success ...keys generated."
fi

echo 'Generating ovpn Files'
cd /root/clients
./make-client-config.sh $client
rm -rf /tmp/*.ovpn
cp /root/clients/files/$client.ovpn /tmp/
chmod 777 /root/clients/files/*.ovpn

echo "cleaning up /tmp/ of old ovpn files..."
echo "OVPN file generated and copied into /tmp/$client.ovpn"
Jaroslav Pantsjoha
fuente
0
(echo -en "\n\n\n\n\n\n\n\n"; sleep 1; echo -en "\n"; sleep 1; echo -en "\n"; sleep 3; echo -en "yes"; echo -en "\n"; sleep 3; echo -en "yes"; echo -en "\n") | ./build-key $key_id
Sitesh Behera
fuente
-2

simplemente edite el archivo de clave de compilación y elimine la --interactopción método más fácil que conozco

Allan Swanepoel
fuente