Claves y firmas ECDSA

EJBCA admite claves de firma ECDSA además de RSA. Puede crear una CA con claves ECDSA tanto desde la interfaz gráfica de usuario (GUI) de administración como desde la CLI (bin/ejbca.sh ca init).

Esta sección proporciona información sobre las claves y firmas ECDSA en las siguientes secciones:

Claves y certificados generados

Al generar una CA en EJBCA, se generan hasta tres claves y certificados:

  • Un par de claves y un certificado de firma de CA

  • Un par de claves de cifrado, utilizado para cifrar la información de recuperación de claves

  • Un par de claves de firmante OCSP y un certificado

Al usar claves ECDSA, el par de claves de firma de la CA y el par de claves de firmante de OCSP serán del tipo de clave ECDSA que seleccione al crear la CA. El certificado de firma de la CA y el de OCSP se firmarán con el algoritmo de firma seleccionado. El par de claves de cifrado siempre será RSA, con una longitud de clave de 1024 o 2048 bits. Utiliza la longitud de clave establecida en la interfaz gráfica de usuario (GUI) o, por defecto, 2048 bits mediante la CLI.

Uso de ECDSA con un HSM

Tenga en cuenta que la clave keyEncryptKey no puede ser ECDSA, sino una clave RSA. Su HSM debe ser compatible con claves ECDSA y RSA. Puede usar PKCS11HSMKeyTool de clientToolBox para generar claves y solicitudes de certificado desde un HSM. Para obtener más información, consulte la sección sobre parámetros de propiedades de HSM.

Uso de curvas Brainpool con nombre en Java PKCS#11

Hasta hace poco, OracleJDK/OpenJDK no disponía de definiciones de curvas con nombre para las curvas de Brainpool. Esta funcionalidad está disponible en versiones posteriores de Java, como las versiones finales de Java 8 y Java 11. Para versiones anteriores, los usuarios de Enterprise pueden obtener un parche compilado junto con un script de instalación para sistemas operativos basados en Debian desde PrimeKey .

Brainpool debería funcionar en todos los HSM compatibles con curvas con nombre . Se ha probado en Thales TCT Luna SA y Utimaco CryptoServer. Thales ProtectServer es compatible con Brainpool, pero no utiliza curvas con nombre. Consulte a continuación la compatibilidad con Brainpool en ProtectServer mediante parámetros de dominio personalizados.

Puede crear y usar CA con curvas de Brainpool en el HSM. Ejemplos de comandos de clientToolBox para generar una clave:

./ejbcaClientToolBox.sh PKCS11HSMKeyTool generate /usr/lunasa/lib/libCryptoki2_64.so brainpoolP160r1 keyAliasBp160 1
./ejbcaClientToolBox.sh PKCS11HSMKeyTool test /usr/lunasa/lib/libCryptoki2_64.so 1
./ejbcaClientToolBox.sh PKCS11HSMKeyTool generate /etc/utimaco/libcs2_pkcs11.so brainpoolP160r1 keyAliasBp160 1
./ejbcaClientToolBox.sh PKCS11HSMKeyTool test /etc/utimaco/libcs2_pkcs11.so 1

Uso de SHA224WithECDSA en Java PKCS#11

Hasta hace poco, OracleJDK/OpenJDK no era compatible con SHA224WithECDSA en el proveedor PKCS#11. Esta funcionalidad está disponible en versiones posteriores de Java, como las versiones finales de Java 8 y Java 11. Para versiones anteriores, los usuarios de Enterprise pueden obtener un parche compilado junto con un script de instalación para sistemas operativos basados en Debian desde PrimeKey .

Debería funcionar en todos los HSM que tengan soporte para SHA224WithECDSA.

Problema con parámetros explícitos en Java

Para utilizar curvas elípticas con parámetros explícitos (a diferencia de las curvas con nombre estándar), debe aplicar un parche al archivo ECParameters.java.

  • Descargue el código fuente del JDK y localice el archivo sun/security/ec/ECParameters.java.

  • A partir de la línea 210, hay código para gestionar parámetros EC de curva sin nombre. Elimine la excepción lanzada en la línea 208 y habilite el código comentado.

  • Compila la clase ejecutando 'javac *.java' en el directorio donde se encuentra el archivo.

  • Reemplace el archivo sun/security/ec/ECParameters.class existente en jre/lib/rt.jar con su versión parcheada y compilada.

Uso de Brainpool ECC con Thales ProtectServer Gold HSM

Las siguientes instrucciones fueron aportadas por DGBK, Países Bajos, y son válidas para el uso de curvas Brainpool con el HSM Thales ProtectServer Gold. Tenga en cuenta que ProtectServer requiere parámetros explícitos para las curvas Brainpool. Además, al usar parámetros explícitos (y el proveedor Sun PKCS#11), no se pueden usar las herramientas EJBCA para generar claves, sino que se deben usar las herramientas de los proveedores del HSM.

Antes de generar parámetros y claves de dominio, primero aplique el parche para parámetros explícitos, como se describe arriba.

Tenga en cuenta que los siguientes comandos se aplican a la versión de software 3.33 y versión de firmware 2.07 de ProtectServer Gold .

  1. Cree el archivo de parámetros de dominio brainpoolP160r1.txt desde ptk_c_administration_manual_rev-c.pdf, Apéndice G, Ejemplos de archivos de parámetros de dominio de EC. Tenga en cuenta que debe agregar "cofactor=01" al final del archivo de parámetros; el cofactor siempre es uno (en el documento de especificaciones) para las curvas de Brainpool (cofactor=1 no funciona, debe ser 01).

  2. Configure el HSM para aceptar parámetros de dominio personalizados (bandera E):

    ./ctconf -fcE
  3. Importar los parámetros del dominio al HSM:

    /ctkmu idp -s 1 -t ec -n brainpoolP160r1 brainpoolP160r1.txt
  4. Generar claves y un certificado ficticio. El certificado ficticio es necesario para el proveedor PKCS#11 de Java; el DN no importa.

    ./ctcert c -k -l bpkey -tec -s1 -CbrainpoolP160r1 -d30y
  5. Pruebe las teclas con:

    ./ejbcaClientToolBox.sh PKCS11HSMKeyTool test /opt/PTK/lib/libcryptoki.so 1
  6. Inicie EJBCA y cree una nueva CA con propiedades CAToken:

    sharedLibrary=/opt/PTK/lib/libcryptoki.so
    defaultKey=bpkey
    slotLabelType=SLOT_NUMBER
    slotLabelValue=1

Curvas con nombre ECC frente a parámetros explícitos

Normalmente, se generan solicitudes y certificados utilizando curvas con nombre codificadas en certificados y solicitudes; esto es lo que recomienda el IETF. En algunos casos, es necesario generar la solicitud y el certificado con parámetros explícitos; por ejemplo, la OACI exige su uso en CSCA y DS para pasaportes electrónicos.

  • Al generar solicitudes con clientToolBox PKCS11HSMKeyTool certreq, puede especificar un indicador para usar parámetros explícitos en lugar de curvas con nombre. Las curvas con nombre son la opción predeterminada.

  • Al crear CA con ejbca.sh ca init, puede especificar un indicador para usar parámetros explícitos en lugar de curvas con nombre. Las curvas con nombre son la opción predeterminada.

  • Cuando EJBCA emite un certificado con claves públicas a partir de solicitudes de certificado (CSR), la clave del certificado será la misma que la de la CSR. Si la CSR utiliza parámetros explícitos, también los utilizará el certificado emitido.

Si genera una CA con parámetros ECC explícitos en el certificado de CA, no podrá ejecutar comandos como 'ejbca.sh ca listcas', ya que Java solo admite curvas con nombre al serializar certificados. Puede solucionar esto añadiendo el proveedor de BC como primer proveedor:

$ sudo vi /etc/java-7-openjdk/security/java.security
security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider
(renumber the ones below)

Después de editar esto (asegúrese de editar el archivo correcto) debe reiniciar JBoss.

Curvas con nombre

EJBCA admite las curvas compatibles con BouncyCastle, incluyendo curvas con nombre de NIST, SEC y X9.62. Es posible que se admitan nuevas curvas sin actualizar esta lista; pruébelo. Para más información sobre las curvas ECDSA, consulte la wiki de Bouncycastle .

Tenga en cuenta que EJBCA no admite claves EC de menos de 224 bits. Las curvas más cortas se indican a continuación solo como referencia.

Curvas X9.62

Curvas SEC

Curvas Nist

Curvas de teleconfianza

prime192v1

prime192v2

prime192v3

prime239v1

prime239v2

prime239v3

prime256v1

sect571r1

sect409r1

sect283r1

sect233r1

sect163r2

secp521r1

secp256r1

secp224r1

secp384r1

P-224

P-256

P-384

P-521

B-163

B-233

B-283

B-409

B-571

Brainpoolp160r1

Brainpoolp160t1

Brainpoolp192r1

Brainpoolp192t1

brainpoolp224r1

Brainpoolp224t1

brainpoolp256r1

brainpoolp256t1

Brainpool P320R1

Brainpoolp320t1

Brainpoolp384r1

grupo de cerebros p384t1

Brainpoolp512r1

Brainpoolp512t1

Curvas CA implícitas

X9.62 ofrece tres alternativas para los parámetros que se pueden encontrar en una clave pública EC. Una de ellas se denomina implicitlyCA e indica que los parámetros se definen en otro lugar, implícitamente en el nombre de la autoridad de certificación (CA) que emitió la clave. En este caso, los parámetros reales aparecen en la codificación ASN.1 de la clave como un valor NULL codificado en DER. Como indica la definición, al usar la clave, los parámetros deberán provenir de otro lugar. En EJBCA, los parámetros se configuran en conf/cesecore.properties .

Al crear una nueva CA utilizando la función implicitlyCA, primero configure los parámetros de curva en conf/cesecore.properties y emita los comandos:

  • limpieza de hormigas

  • despliegue de hormigas

Tras reiniciar el servidor de aplicaciones, puede crear una nueva CA con el nombre implicitlyCA en lugar de un nombre de curva como keyspec en la interfaz gráfica de usuario o la CLI de administración. El certificado de la CA se creará con la codificación NULL de la clave pública.

Al emitir certificados de cliente donde la clave pública del cliente usa implicitlyCA, debe permitir una longitud de clave 0 en el perfil del certificado, porque EJBCA no puede leer la longitud de clave, ya que los parámetros se definen en otro lugar.

Consulte la wiki de Bouncycastle para obtener más información sobre la función implicitlyCA.

Los parámetros de curva en conf/cesecore.parameters se configuran en Bouncycastle usando el siguiente código:

ECCurve curve = new ECCurve.Fp(
new BigInteger(ecdsa.implicitlyca.q), // q
new BigInteger(ecdsa.implicitlyca.a, 16), // a
new BigInteger(ecdsa.implicitlyca.b, 16)); // b
org.bouncycastle.jce.spec.ECParameterSpec implicitSpec = new org.bouncycastle.jce.spec.ECParameterSpec(
curve,
curve.decodePoint(Hex.decode(ecdsa.implicitlyca.g)), // G
new BigInteger(ecdsa.implicitlyca.n)); // n
ConfigurableProvider config = (ConfigurableProvider)Security.getProvider(BouncyCastleProvider.PROVIDER_NAME);
config.setParameter(ConfigurableProvider.EC_IMPLICITLY_CA, implicitSpec);

Creación de certificados de cliente

También puede emitir solicitudes normales de certificados de cliente utilizando claves ECDSA.

Todos los certificados firmados por una CA ECDSA utilizarán naturalmente firmas ECDSA, independientemente de si las claves del cliente son RSA o ECDSA.

Al generar claves de cliente por lotes mediante el comando de la CLI "bin/ejbca.sh batch", se configura el tipo de claves de cliente que se generarán en el archivo conf/batchtool.properties . Los parámetros posibles se explican allí. Si se utiliza la función implicitlyCA, se utilizan los mismos parámetros configurados para la CA en conf/cesecore.properties .

Limitaciones

Al usar el modo implicitlyCA, solo se puede establecer un conjunto de parámetros de curva para toda la instancia EJBCA. Esto significa que si varias CA usan ECDSA con implicitlyCA , todas usarán los mismos parámetros de curva. Puede combinar implicitlyCA con curvas con nombre según sus preferencias.