ayuda a comprender la verificación del certificado del cliente

17

Estoy creando una API a la que solo ciertas computadoras deberían tener acceso. La comunicación será vía SSL entre el servidor y los clientes. Para verificar que un cliente tenga acceso, me gustaría crear un certificado para cada cliente, que esté firmado por el servidor. A todos los clientes que no proporcionen el certificado firmado por el servidor, se les debe denegar el acceso.

Tengo un certificado SSL y una clave de GoDaddy. Pensé que debería poder crear certificados de clientes con esta información, pero en todas partes, parece que necesito el certificado de CA (de GoDaddy) para firmar el certificado de cliente y no el certificado / clave de mi servidor específico.

Esto no tiene sentido para mí, porque me parece extraño que deba ir a GoDaddy y obtener un nuevo certificado para cada cliente. Me imagino que este no es el caso y que estoy haciendo algo mal o no entiendo completamente.

Entonces, ¿cómo puedo crear un certificado de cliente firmado por mi certificado / contraseña del servidor?

Si pudiera proporcionar comandos (estoy usando openssl) para generar el certificado de cliente a partir de mi certificado de servidor, también sería muy apreciado.

¡Gracias!

    
pregunta zsalzbank 17.12.2012 - 17:51
fuente

3 respuestas

17

Para firmar certificados de clientes, necesitará un certificado de CA que controle. En la mayoría de los casos, pagar por uno es imposible, ya que los certificados de CA de confianza global son un peligro para la seguridad del resto de Internet. Por lo tanto, en estos casos, debe crear su propia CA y crear sus propios certificados de servidor y cliente.

Comencemos con un archivo básico openssl.conf que usaremos para la generación de todos estos certificados:

[ ca ]
default_ca  = CA_default                # The default ca section

[ CA_default ]
certs          = certs                  # Where the issued certs are kept
crl_dir        = crl                    # Where the issued crl are kept
database       = database.txt           # database index file.
new_certs_dir  = certs                  # default place for new certs.
certificate    = cacert.pem             # The CA certificate
serial         = serial.txt             # The current serial number
crl            = crl.pem                # The current CRL
private_key    = private\cakey.pem      # The private key
RANDFILE       = private\private.rnd    # private random number file

x509_extensions  = v3_usr               # The extentions to add to the cert
default_days     = 365
default_crl_days = 30                   # how long before next CRL
default_md       = sha256               # which md to use.
preserve         = no                   # keep passed DN ordering
policy           = policy_match
email_in_dn      = 

[ policy_match ]
commonName      = supplied

[ req ]
default_bits        = 2048
default_keyfile     = privkey.pem
distinguished_name  = req_distinguished_name
x509_extensions     = v3_ca

[ v3_ca ]
basicConstraints     = CA:TRUE
subjectKeyIdentifier = hash

[ v3_usr ]
basicConstraints     = CA:FALSE
subjectKeyIdentifier = hash

[ server ]
basicConstraints       = CA:FALSE
nsCertType             = server
nsComment              = "Server Certificate"
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer:always
extendedKeyUsage       = serverAuth
keyUsage               = digitalSignature, keyEncipherment

[ client ]
basicConstraints       = CA:FALSE
nsCertType             = client
nsComment              = "Client Certificate"
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer:always
extendedKeyUsage       = clientAuth
keyUsage               = digitalSignature

[ req_distinguished_name ]

Este archivo de configuración se crea para la generación automática de certificados a partir de un script por lotes. Si necesita más opciones de control o nombre, debe adaptarlo a su situación.

Entonces, para generar una CA, vaya al directorio donde desea hacer su CA, coloque openssl.conf allí y:

PASSWORD="PUT_YOUR_CA_PASSWORD_HERE"

# Make the config CA specific
cat openssl.conf > use.conf
echo "CN=PUT_CA_NAME_HERE" >> use.conf

# Create the necessary files
mkdir keys requests certs 
touch database.txt
echo 01 > serial.txt

# Generate your CA key (Use appropriate bit size here for your situation)
openssl genrsa -aes256 -out keys/ca.key -passout pass:$PASSWORD 2048

# Generate your CA req
openssl req -config use.conf -new -key keys/ca.key -out requests/ca.req -passin pass:$PASSWORD

# Make your self-signed CA certificate
openssl ca  -config use.conf -selfsign -keyfile keys/ca.key -out certs/ca.crt -in requests/ca.req -extensions v3_ca -passin pass:$PASSWORD -batch

# Cleanup
rm requests/ca.req use.conf

Ahora, para generar un certificado de servidor (por ejemplo, para su servidor web):

PASSWORD="PUT_YOUR_CA_PASSWORD_HERE"
NAME="PUT_THE_NAME_OF_SERVER_TO_GENERATE_HERE"

# Make the config Server specific
cat openssl.conf > use.conf
echo "CN=$NAME" >> use.conf

openssl req -new -nodes -extensions server -out "requests/$NAME.req" -keyout "$NAME.key" -config use.conf -passin pass:$PASSWORD )
openssl ca -batch -extensions server -keyfile keys/ca.key -cert certs/ca.crt -config use.conf -out "certs/$NAME.crt" -passin pass:$PASSWORD -infiles "requests/$NAME.req"

# Cleanup
rm "requests/$NAME.req" use.conf

Ahora para generar un certificado cliente :

PASSWORD="PUT_YOUR_CA_PASSWORD_HERE"
NAME="PUT_THE_NAME_OF_CLIENT_TO_GENERATE_HERE"

# Make the config Client specific
cat openssl.conf > use.conf
echo "CN=$NAME" >> use.conf

openssl req -new -nodes -extensions client -out "requests/$NAME.req" -keyout "$NAME.key" -config use.conf -passin pass:$PASSWORD )
openssl ca -batch -extensions client -keyfile keys/ca.key -cert certs/ca.crt -config use.conf -out "certs/$NAME.crt" -passin pass:$PASSWORD -infiles "requests/$NAME.req"

# Cleanup
rm "requests/$NAME.req" use.conf

La única diferencia entre generar claves y certificados para clientes y servidores es evitar que un certificado de cliente robado también se pueda usar para jugar a un servidor y engañar a otros clientes para que se conecten a él (esto solo funciona mientras sus aplicaciones admite la extensión de cliente y servidor en certificados).

    
respondido por el Paul 18.12.2012 - 12:05
fuente
10

Una autoridad de certificación es una entidad que emite certificados. Desea emitir certificados (a los clientes), por lo tanto, desea ser un CA.

Quienquiera que intente validar un certificado debe confiar en la clave de la CA (confianza a priori : piense en la clave pública de la CA que está codificada en el software o en el sistema operativo). En su caso, desea que su servidor valide los certificados, por lo que su servidor tendrá que guardar una copia de la clave pública de la CA.

Las CA existentes, como GoDaddy, lograron obtener una copia de su clave pública en todos los navegadores web: todos confían en su CA. Para lograrlo, tenían que demostrar a los proveedores del navegador (por ejemplo, Microsoft) que eran confiables y serios (la clave privada está en un bunker, tienen procedimientos para todo, tienen suficiente respaldo financiero para garantizar la continuidad de las operaciones ...) y era caro, por lo que no le darán energía sub-CA gratis (o incluso a bajo costo). Sin embargo, en su situación, no le importa si la clave de CA es conocida por todo el mundo: solo necesita una CA en la que confiará su servidor (que usted controla completamente). Una CA que usted se mantenga estará bien.

EJBCA es una implementación de CA de código abierto gratuita que debería ser fácil de usar. Alternativamente, puede juntar algunos scripts alrededor de OpenSSL .

Nota: los certificados son para autenticación , no para autorización . Están destinados a identificar a los usuarios. Le sugiero que separe los dos roles en su servidor:

  • Cuando emita un certificado al cliente X, ponga el nombre "X" en el certificado.
  • Mantenga en el servidor una tabla de "clientes permitidos" (por nombre).
  • Cuando un cliente se conecta, valide su certificado, luego extraiga el nombre del cliente del certificado y verifique el nombre en la tabla de clientes permitidos.

Esta separación será extremadamente útil el día que desee revocar los derechos de acceso de un cliente determinado.

    
respondido por el Thomas Pornin 27.12.2012 - 22:10
fuente
1

Por lo que sé, no puede crear un certificado de cliente válido con su SSL que compró de GoDaddy. La razón detrás de esto tiene que ver con la clave privada del certificado de CA de GoDaddy, que no entregarán por una buena razón.

Ahora, si tiene todas las computadoras bajo su control, lo más fácil y económico sería generar su propio certificado de CA y firmar a sus clientes. Agregue su CA a cada una de las tiendas Root de confianza en cada computadora individual.

Puede obtener una CA para firmar un certificado que le permite ser una CA, sin embargo, estos certificados no son baratos, como en "contáctenos para una cotización".

Si necesita una herramienta, creo que XCA es una GUI que lo hará más fácil para usted.

    
respondido por el Travis Pessetto 17.12.2012 - 18:32
fuente

Lea otras preguntas en las etiquetas