WildFly 14 / JBoss EAP 7.2

En WildFly, la implementación y la instalación no configuran automáticamente el servidor de aplicaciones. Configure el servidor de aplicaciones según las instrucciones de las siguientes secciones.

Para las partes específicas de Oracle en esta guía, asumimos que ha instalado Oracle XE versión 11g release 2 (se puede descargar desde Oracle Database ) en su máquina y la ha configurado para escuchar en el puerto 1521.

Se desaconseja encarecidamente ejecutar la aplicación con un usuario root debido al riesgo de escalada de privilegios. Ejecutar la instalación como root puede provocar que se otorguen privilegios root a archivos que WildFly no podrá leer posteriormente. En su lugar, se recomienda ejecutar la instalación con el mismo usuario que ejecuta el servidor de aplicaciones.

Agregar controlador de base de datos

Para MariaDB y PostgreSQL, el controlador de base de datos se puede agregar implementándolo en caliente en el directorio de implementación. WildFly lo recogerá y lo implementará para que podamos crear una fuente de datos inmediatamente. Puede usar un nombre genérico, sin número de versión, para obtener un "driver-name" genérico para el comando de la fuente de datos.

Comando de ejemplo para MariaDB:

$ cp mariadb-java-client-2.2.6.jar wildfly_home /standalone/deployments/mariadb-java-client .jar

Comando de ejemplo para PostgreSQL:

$ cp postgresql- . 42.2 / 5 .jar wildfly_home/standalone/deployments/postgresql.jar

Si utiliza otro tipo de base de datos, copie el controlador JDBC al directorio de implementación y anote la clase y el nombre del controlador que aparecen en el registro del servidor para usarlos posteriormente al agregar la fuente de datos. Por ejemplo:

... INFO [org.jboss.as.connector.deployers.jdbc] (...) WFLYJCA0005: Deploying non-JDBC-compliant driver class org.postgresql.Driver (version 42.2.5)
... INFO [org.jboss.as.connector.deployers.jdbc] (...) WFLYJCA0018: Started Driver service with driver-name = postgresql-jdbc3.jar

Aumentar el uso de memoria permitido

De forma predeterminada, el servidor de aplicaciones puede usar 1303 MB de memoria RAM. Esto es suficiente para una instalación pequeña/normal. Si prevé mucho tráfico, puede aumentar este límite de memoria editando wildfly_home/bin/standalone.conf para aumentarlo, por ejemplo:

JAVA_OPTS= "-Xms2048m -Xmx2048m -XX:MetaspaceSize=192M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true"

Agregar fuente de datos

Para agregar una fuente de datos para que la use EJBCA, inicie JBoss (con bin/standalone.sh ) y ejecute los comandos en JBoss CLI de acuerdo con los ejemplos de MariaDB , MySQL , Oracle XE o PostgreSQL a continuación.

Tenga en cuenta que "-driver-name" está vinculado al nombre del archivo jar que copió en el paso "Agregar controlador de base de datos" mencionado anteriormente. " -jindi-name" está vinculado al valor database.properties, y en el siguiente ejemplo se utiliza el valor predeterminado.

MariaDB

Para MariaDB, ejecute lo siguiente:

> wildfly_home/bin/jboss-cli.sh -c
> data-source add --name=ejbcads --driver-name="mariadb-java-client.jar" --connection-url="jdbc: mysql://127.0.0.1:3306/ejbca " --jndi-name="java:/EjbcaDS" --use-ccm=true --driver-class="org.mariadb.jdbc.Driver" --user-name="ejbca" --password="ejbca" --validate-on-match=true --background-validation=false --prepared-statements-cache-size=50 --share-prepared-statements=true --min-pool-size=5 --max-pool-size=150 --pool-prefill=true --transaction-isolation=TRANSACTION_READ_COMMITTED --check-valid-connection-sql="select 1;"
> :reload

MySQL

Para MySQL, ejecute lo siguiente.

Tenga en cuenta que MySQL impone mayores creaciones de contraseñas seguras y el siguiente ejemplo usa --password="Ejbca-2020" .

> data- source de datos add --name=ejbcads --driver-name= "com.mysql.jdbc.Driver" --connection-url= "jdbc:mysql://127.0.0.1:3306/ejbca" --jndi-name= "java:/EjbcaDS" --use-ccm= true --driver-class= "com.mysql.jdbc.Driver" --user-name= "ejbca" --password= "Ejbca-2020" --validate-on-match= true --background-validation= false --prepared-statements-cache-size=50 --share-prepared-statements= true --min-pool-size=5 --max-pool-size=150 --pool-prefill= true --transaction-isolation=TRANSACTION_READ_COMMITTED --check-valid-connection-sql= "select 1;"
> :reload

Oracle XE versión 11g Release 2

Para Oracle XE, ejecute lo siguiente:

> wildfly_home /bin/jboss-cli .sh -c
> data- source de datos add --name=ejbcads --driver-name= "ojdbc8.jar" --connection-url= "jdbc:oracle:thin:@127.0.0.1:1521:XE" --jndi-name= "java:/EjbcaDS" --use-ccm= true --driver-class= "oracle.jdbc.driver.OracleDriver" --user-name= "ejbca" --password= "ejbca" --validate-on-match= true --background-validation= false --prepared-statements-cache-size=50 --share-prepared-statements= true --min-pool-size=5 --max-pool-size=150 --pool-prefill= true --transaction-isolation=TRANSACTION_READ_COMMITTED --check-valid-connection-sql= "select 1 from dual"
> :reload

PostgreSQL

Para PostgreSQL, ejecute lo siguiente:

> wildfly_home /bin/jboss-cli .sh -c
> data- source de datos add --name=ejbcads --driver-name= "org.postgresql.Driver" --connection-url= "jdbc:postgresql://127.0.0.1/ejbca" --jndi-name= "java:/EjbcaDS" --use-ccm= true --driver-name= "postgresql.jar" --driver-class= "org.postgresql.Driver" --user-name= "ejbca_user" --password= "foo123" --validate-on-match= true --background-validation= false --prepared-statements-cache-size=50 --share-prepared-statements= true --min-pool-size=5 --max-pool-size=150 --pool-prefill= true --transaction-isolation=TRANSACTION_READ_COMMITTED --check-valid-connection-sql= "select 1;"
> :reload

Si está utilizando otro tipo de base de datos, adapte la declaración anterior con el driver-name , connection-url, driver-class y check-valid-connection-sql correctos.

imágenes/s/-2y7bau/8703/189cb2l/_/imagenes/iconos/emoticonos/advertencia.svg Espere a que se complete la recarga verificando el registro del servidor o el resultado de :read-attribute(name=server-state) antes de continuar.

Configurar WildFly Remoting

EJBCA necesita usar JBoss Remoting para que la CLI de EJBCA funcione. Configúrelo para usar un puerto 4447 independiente y elimine cualquier otra dependencia de la comunicación remota, excepto la que EJBCA necesita.

/subsystem =remoting /http-connector =http-remoting-connector:write-attribute(name=connector-ref,value=remoting)
/socket-binding-group =standard-sockets /socket-binding =remoting:add(port=4447,interface=management)
/subsystem =undertow /server =default-server /http-listener =remoting:add(socket-binding=remoting, enable -http2= true )
/subsystem =infinispan /cache-container =ejb:remove()
/subsystem =infinispan /cache-container =server:remove()
/subsystem =infinispan /cache-container =web:remove()
/subsystem =ejb3 /cache =distributable:remove()
/subsystem =ejb3 /passivation-store =infinispan:remove()
:reload

imágenes/s/-2y7bau/8703/189cb2l/_/imagenes/iconos/emoticonos/advertencia.svg Espere a que se complete la recarga verificando el registro del servidor o el resultado de :read-attribute(name=server-state) antes de continuar.

Configurar el registro

Configure el registro en JBoss para poder cambiarlo dinámicamente. Para sistemas de producción, se recomienda el nivel de registro INFO:

/subsystem =logging /logger =org.ejbca:add(level=INFO)
/subsystem =logging /logger =org.cesecore:add(level=INFO)
>Para habilitar posteriormente el nivel de registro DEBUG, si es necesario, utilice lo siguiente:

/subsystem =org.ejbca:write-attribute(name=level, value=DEBUG) /logger =logging
/subsystem =org.cesecore:write-attribute(name=level, value=DEBUG) /logger =logging

Configuración del receptor HTTP(S) con separación de 3 puertos

A continuación se describe la configuración del escucha HTTP(S) con separación de 3 puertos.

Eliminar la configuración TLS y HTTP existente

Ejecute los siguientes comandos en JBoss CLI para eliminar la configuración TLS y HTTP existente (solo para estar seguro):

$ wildfly_home /bin/jboss-cli .sh --connect
/subsystem =undertow /server =default-server /http-listener =default:remove()
/subsystem =undertow /server =default-server /https-listener =https:remove()
/socket-binding-group =standard-sockets /socket-binding =http:remove()
/socket-binding-group =standard-sockets /socket-binding =https:remove()
:reload

imágenes/s/-2y7bau/8703/189cb2l/_/imagenes/iconos/emoticonos/advertencia.svg Espere a que se complete la recarga verificando el registro del servidor o el resultado de :read-attribute(name=server-state) antes de continuar.

Agregar nuevas interfaces y sockets

Para agregar nuevas interfaces y sockets, utilice lo siguiente:

/interface =http:add(inet-address= "0.0.0.0" )
/interface =httpspub:add(inet-address= "0.0.0.0" )
/interface =httpspriv:add(inet-address= "0.0.0.0" )
/socket-binding-group =standard-sockets /socket-binding =http:add(port= "8080" ,interface= "http" )
/socket-binding-group =standard-sockets /socket-binding =httpspub:add(port= "8442" ,interface= "httpspub" )
/socket-binding-group =standard-sockets /socket-binding =httpspriv:add(port= "8443" ,interface= "httpspriv" )

Configurar TLS

Configure TLS según las siguientes instrucciones.

Asegúrese de que las contraseñas de esta sección sean correctas para que los comandos no fallen. En producción, las contraseñas deben cambiarse a contraseñas "reales".

Actualice la contraseña del almacén de claves para keystore.jks para que coincida con httpsserver.password y la contraseña del almacén de claves para truststore.jks para que coincida con java.truststore en web.properties:

/subsystem =elytron /key-store =httpsKS:add(path= "keystore/keystore.jks" ,relative-to=jboss.server.config. dir ,credential-reference={ -text= clear = "serverpwd" }, type =JKS)
/subsystem =elytron /key-store =httpsTS:add(path= "keystore/truststore.jks" ,relative-to=jboss.server.config. dir ,credential-reference={ -text= clear = "changeit" }, type =JKS)
/subsystem =elytron /key-manager =httpsKM:add(key-store=httpsKS,algorithm= "SunX509" ,credential-reference={ clear -text= "serverpwd" })
/subsystem =elytron /trust-manager =httpsTM:add(key-store=httpsTS)
/subsystem =elytron /server-ssl-context =httpspub:add(key-manager=httpsKM,protocols=[ "TLSv1.2" ])
/subsystem =elytron /server-ssl-context =httpspriv:add(key-manager=httpsKM,protocols=[ "TLSv1.2" ],trust-manager=httpsTM,need-client-auth= true ,authentication-optional= false ,want-client-auth= true )

Opcionalmente, el contexto "httpspriv" se puede configurar con autenticación de certificado de cliente opcional utilizando "need-client-auth=false,authentication-optional=true" en su lugar.

Agregar oyentes HTTP(S)

Para agregar oyentes HTTP(S):

/subsystem =undertow /server =default-server /http-listener =http:add(socket-binding= "http" , redirect-socket= "httpspriv" )
/subsystem =undertow /server =default-server /https-listener =httpspub:add(socket-binding= "httpspub" , ssl-context= "httpspub" , max-parameters=2048)
/subsystem =undertow /server =default-server /https-listener =httpspriv:add(socket-binding= "httpspriv" , ssl-context= "httpspriv" , max-parameters=2048)
:reload

imágenes/s/-2y7bau/8703/189cb2l/_/imagenes/iconos/emoticonos/advertencia.svg Espere a que se complete la recarga verificando el registro del servidor o el resultado de :read-attribute(name=server-state) antes de continuar.

Configuración del comportamiento del protocolo HTTP

A continuación se muestra un ejemplo de configuración del comportamiento del protocolo HTTP.

/system-property =org.apache.catalina.connector.URI_ENCODING:add(value= "UTF-8" )
/system-property =org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING:add(value= true )
/system-property =org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH:add(value= true )
/system-property =org.apache.tomcat.util.http.Parameters.MAX_COUNT:add(value=2048)
/system-property =org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH:add(value= true )
/subsystem =webservices:write-attribute(name=wsdl-host, value=jbossws.undefined.host)
/subsystem =webservices:write-attribute(name=modify-wsdl-address, value= true )
:reload

Si está utilizando solicitudes GET de OCSP, es necesario configurar la codificación de URI y permitir la codificación para la consulta y la barra invertida mencionadas anteriormente.

Esto también garantizará que la dirección en el WSDL EJBCA WS coincida con el nombre de host y el puerto que el cliente utilizó para acceder al servidor.

imágenes/s/-2y7bau/8703/189cb2l/_/imagenes/iconos/emoticonos/advertencia.svg Espere a que se complete la recarga verificando el registro del servidor o el resultado de :read-attribute(name=server-state) antes de continuar.

Eliminar RESTEasy-Crypto

El servidor de aplicaciones a veces puede cargar su propia versión de Bouncy Castle, lo que genera problemas de incompatibilidad y/o conflictos.

Un error típico que ocurre como consecuencia de la carga de un castillo inflable incorrecto en EJBCA es:

ClassCastException setting BagAttributes, can not set friendly name: : java.lang.ClassCastException: org.bouncycastle.jcajce.provider.asymmetric.x509.X509CertificateObject cannot be cast to org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier

Para evitar problemas y evitar que Wildfly/JBoss cargue la biblioteca Bouncy Castle incluida en el módulo RESTEasy-Crypto en lugar de la biblioteca incluida en EJBCA, ejecute lo siguiente:

$ cd /opt/wildfly
$ sed -i 's|.*org.jboss.resteasy.resteasy-crypto.*||' modules /system/layers/base/org/jboss/as/jaxrs/main/module .xml
$ rm -rf modules /system/layers/base/org/jboss/resteasy/resteasy-crypto

A continuación se muestra un ejemplo de mensaje de registro de errores en caso de conflicto:

ERROR [StartupSingletonBean] BouncyCastle is not loaded by an EJBCA classloader, version conflict is likely:
org.bouncycastle.jcajce.provider.asymmetric.x509.X509CertificateObject: #012org.bouncycastle.jcajce.provider.asymmetric.x509.X509CertificateObject(4690542e).
ClassLoader=ModuleClassLoader for Module "org.bouncycastle" from local module loader @3fb6a447
(finder: local module finder @79b4d0f (roots: /opt/jboss/modules,/opt/jboss/modules/system/layers/base))#012++++CodeSource:
([jar:file:/opt/jboss/modules/system/layers/base/org/bouncycastle/main/bcprov-jdk15on-1.60.jar!/] [#012[#012 Version: V3#012 Subject:
CN=Legion of the Bouncy Castle Inc., OU=Java Software Code Signing, O=Sun Microsystems Inc#012 Signature Algorithm:
SHA1withDSA, OID = 1.2.840.10040.4.3#012#012 Key: Sun DSA Public Key#012 Parameters:DSA#012#011p:
fd7f5381 1d751229 52df4a9c 2eece4e7 f611b752 3cef4400 c31e3f80 b6512669#012 455d4022 51fb593d
8d58fabf c5f5ba30 f6cb9b55 6cd7813b 801d346f f26660b7#012

Configuración opcional

Las siguientes secciones cubren configuraciones opcionales.

Eliminar contenido de bienvenida

/subsystem =undertow /server =default-server /host =default-host /location = "\/" :remove()
/subsystem =undertow /configuration =handler /file =welcome-content:remove()
:reload

imágenes/s/-2y7bau/8703/189cb2l/_/imagenes/iconos/emoticonos/advertencia.svg Espere a que se complete la recarga verificando el registro del servidor o el resultado de :read-attribute(name=server-state) antes de continuar.

Redirigir a la aplicación para URL desconocidas

Las URL conocidas comienzan con /ejbca/, /crls, /certificates o /.well-known/ (EST) para EJBCA según el siguiente ejemplo:

/subsystem =undertow /configuration =filter /rewrite =redirect-to-app:add(redirect= true ,target= "/ejbca/" )
/subsystem =undertow /server =default-server /host =default-host /filter-ref =redirect-to-app:add(predicate= "method(GET) and not path-prefix('/ejbca/','/crls','/certificates','/.well-known/') and not equals({%{LOCAL_PORT}, 4447})" )
:reload

imágenes/s/-2y7bau/8703/189cb2l/_/imagenes/iconos/emoticonos/advertencia.svg Espere a que se complete la recarga verificando el registro del servidor o el resultado de :read-attribute(name=server-state) antes de continuar.

Reescritura de URL para el servlet CRL

Desde EJBCA 7.2, se ha eliminado la posibilidad de personalizar la URL del servlet del almacén de CRL. Para más información, consulte ECA-7059 y las Notas de actualización de EJBCA 7.2 .

Sin embargo, puede descargar CRL en una URL diferente agregando una regla de reescritura en Undertow . Por ejemplo, para permitir que un cliente descargue CRL desde la URL /ejbca/crls/ en lugar de /ejbca/publicweb/crls/ , agregue la siguiente configuración:

/subsystem =undertow /configuration =filter /rewrite =crl-rewrite:add(target= "/ejbca/publicweb/crls/$${1}" )
/subsystem =undertow /server =default-server /host =default-host /filter-ref =crl-rewrite:add(predicate= "method(GET) and regex('/crls/(.*)')" )
:reload

imágenes/s/-2y7bau/8703/189cb2l/_/imagenes/iconos/emoticonos/advertencia.svg Espere a que se complete la recarga verificando el registro del servidor o el resultado de :read-attribute(name=server-state) antes de continuar.

Eliminar la fuente de datos ExampleDS

Para eliminar opcionalmente la fuente de datos ExampleDS:

/subsystem=ee/service= default -bindings:remove()
data-source remove --name=ExampleDS
:reload

imágenes/s/-2y7bau/8703/189cb2l/_/imagenes/iconos/emoticonos/advertencia.svg Espere a que se complete la recarga verificando el registro del servidor o el resultado de :read-attribute(name=server-state) antes de continuar.

Eliminar subsistemas y extensiones innecesarios

Para eliminar opcionalmente los subsistemas y extensiones innecesarios:

/subsystem =jdr:remove()
/subsystem =sar:remove()
/subsystem =jmx:remove()
/subsystem =pojo:remove()
/subsystem =ee-security:remove()
/subsystem =microprofile-config-smallrye:remove()
/subsystem =microprofile-health-smallrye:remove()
/subsystem =microprofile-opentracing-smallrye:remove()
/extension =org.jboss.as.jdr:remove()
/extension =org.jboss.as.jmx:remove()
/extension =org.jboss.as.sar:remove()
/extension =org.jboss.as.pojo:remove()
/extension =org.wildfly.extension.ee-security:remove()
/extension =org.wildfly.extension.microprofile.config-smallrye:remove()
/extension =org.wildfly.extension.microprofile.health-smallrye:remove()
/extension =org.wildfly.extension.microprofile.opentracing-smallrye:remove()
:reload

imágenes/s/-2y7bau/8703/189cb2l/_/imagenes/iconos/emoticonos/advertencia.svg Espere a que se complete la recarga verificando el registro del servidor o el resultado de :read-attribute(name=server-state) antes de continuar.

Habilitar el conector AJP

Solo es necesario habilitar el conector AJP si ejecuta un front-end Apache delante de WildFly:

/subsystem =undertow /server =default-server /ajp-listener =ajp-listener:add(socket-binding=ajp, scheme=https, enabled= true )

Agregar compatibilidad con PKCS#11 (HSM)

WildFly aísla la mayoría de las clases sun por defecto. A partir de EJBCA 6.6.3, EJBCA configura JBoss/WildFly para exponer estas clases (sun/security/pkcs11/wrapper) mediante jboss-deployment-structure.xml . Esto elimina la necesidad de configurar modules/system/layers/base/sun/jdk/main/module.xml .

Agregar soporte para enviar correo electrónico

Para agregar soporte para enviar correo electrónico (smtp), configure EjbcaMail con:

/socket-binding-group =standard-sockets /remote-destination-outbound-socket-binding =ejbca-mail-smtp:add(port= "993" , host= "my.mail.server" )
/subsystem =mail /mail-session = "java:/EjbcaMail" :add(jndi-name=java: /EjbcaMail , from=noreply@mymail)
/subsystem =mail /mail-session = "java:/EjbcaMail" /server =smtp:add(outbound-socket-binding-ref=ejbca-mail-smtp, tls= true , username=smtpuser, password=smtppassword)
:reload

Solo implementación en caliente al inicio

Históricamente, los servidores de aplicaciones no suelen liberar memoria de implementaciones anteriores, por lo que se desaconseja la reimplementación en caliente en producción. Para evitar la implementación manual con la interfaz de administración, podemos especificar que el directorio de implementación se escanee una vez al iniciar el servidor de aplicaciones, estableciendo el intervalo de escaneo en 0.

/subsystem =deployment-scanner /scanner =default:write-attribute(name=scan-interval,value=0)


Deshabilitar la consola web de administración

Si de todos modos solo planeas usar la CLI de JBoss, hay pocos motivos para mantenerlo.

/core-service =management /management-interface =http-interface:write-attribute(name=console-enabled,value= false )
:reload

Próximo paso: Implementación de EJBCA

Para obtener instrucciones sobre cómo crear e implementar EJBCA, consulte Implementación de EJBCA.