Proyecto:
Ttulo:
Libreras SCSP
Revisin:
1.9
Fecha:
Octubre 2012
Revisin
Autor
Verificado por
Mayo 2011
1.0
Mayo 2011
1.1
Mayo 2011
1.2
Agosto 2011
1.3
Octubre 2011
1.4
Noviembre 2011
1.5
Diciembre 2011
1.6
Documentos relacionados
Fecha
Revisin
Titulo
Ruta
Nombre
Empresa
Telfono
Control de versiones
Fecha
Revisin
03/05/2011
1.1
05/05/2011
1.2
10/08/2011
1.3
Pgina 2 de 37
MySQL
27/10/2011
1.4
17/11/2011
1.5
09/12/2011
1.6
1.7
19/06/2012
1.8
08/10/2012
1.9
Pgina 3 de 37
Contenido
FICHA DEL DOCUMENTO
DOCUMENTOS RELACIONADOS
CONTROL DE VERSIONES
INTRODUCCIN
1.1
Propsito
1.2
Alcance
1.3
Resumen
2.1
Configuracin Tomcat / JBoss
2.1.1 Configuracin libreras APR
2.1.2 Configuracin JBOSS 5.1
6
6
8
9
2.2
12
2.3
20
3
3.1
23
Configuracin Tomcat.
23
3.2
Configuracin Apache
3.2.1 Configuracin httpd.conf
3.2.1.1
JK como mdulo
3.2.1.2
JK compilado
3.2.1.3
Configuracin archivos de configuracin
3.2.1.4
Configuracin SSL
3.2.2 Configuracin JK
3.2.3 Configuracin SSL
3.2.4 Configuracion worker.properties
23
23
23
24
24
24
24
25
26
26
4.1
Error accediendo por https.
4.1.1 Ssl_error_bad_cert_alert
4.1.1 ssl_error_renegotiation_not_allowed
26
26
32
4.2
Error con el encoding
4.2.1 Configuracin en el sistema operativo
4.2.2 Configuracin en tomcat
34
34
34
Pgina 4 de 37
4.2.2.1
4.2.2.2
5
5.1
6
6.1
7
7.1
Configuracin en el conector
Configuracin en el arranque
34
35
35
35
35
Oracle 9i
35
36
36
36
37
10
APNDICES
37
Pgina 5 de 37
1 Introduccin
Este documento describe los problemas comunes que suelen encontrarse los administradores
que instalan y configuran la aplicacin Web del cliente ligero correspondiente a las libreras
Java.
Junto al problema descrito se facilitan los pasos necesarios para solventarlo. En principio, los
problemas planteados en este documento no corresponden a ninguna versin en concreto de
las libreras ni cliente ligero sino que son problemas comunes. Tambin pueden encontrarse
referencias a alguna versin especfica de servidor de aplicaciones j2ee o gestor de base de
datos.
1.1
Propsito
1.2
Alcance
Para hacer este documento lo ms general posible se incluirn todos los problemas y
soluciones relacionados con los siguientes productos:
1.3
Resumen
Para acceder a la aplicacin Web /cliente-ligero hay que autenticarse mediante un certificado
personal X.509 ya que la aplicacin Web usa este certificado para extraer el NIF y comprobar si
el usuario est dado de alta en el sistema. Por ello es necesario que el servidor de aplicaciones
tenga configurado el conector para el protocolo seguro https.
Las libreras soportan varios servidores de aplicaciones. En este ejemplo se explica la
configuracin especfica para el servidor Tomcat 6 aunque tambin servira por ejemplo para
JBoss. Ms informacin sobre Tomcat puede ser encontrada en el siguiente link:
http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html
El conector https puede tener configurado varias propiedades. Para saber ms acerca de ellas
se puede consultar este link:
http://tomcat.apache.org/tomcat-6.0-doc/config/http.html#SSL_Support
Pgina 6 de 37
<!-<Connector
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="${user.home}/.keystore"
keystorePass="changeit"
clientAuth="false" sslProtocol="TLS"/>
-->
clientAuth=Puede recibir el valor true, false o want (por defecto es false). Cuando vale
true, la conexin de cliente necesita presentar un certificado vlido. Si bajo el mismo
servidor vamos a instalar dos aplicaciones, una uq encesite autenticacin de cliente
(Cliente Ligero) y otra que no lo necesita (Web Services SCSP) utilizaremos la opcin
want, esto har que si se presenta un certificado por parte del cliente, nos
Pgina 7 de 37
En este almacn se encuentra el certificado que usar el servidor para autenticarse, es decir,
ser el certificado que se enve al cliente para que este pueda comprobar sus credenciales y
verificar su validez.
Pgina 8 de 37
at org.apache.tomcat.util.net.AprEndpoint.start(AprEndpoint.java:756)
at org.apache.coyote.http11.Http11AprProtocol.start(Http11AprProtocol.java:137)
at org.apache.catalina.connector.Connector.start(Connector.java:1095)
at org.apache.catalina.core.StandardService.start(StandardService.java:540)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
09-may-2011 9:05:20 org.apache.catalina.core.StandardService start
Pgina 9 de 37
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:528)
at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:508)
at es.navarra.SVCD.services.SVCD.realizarPeticionSincrona(SVCD.java:240)
at es.navarra.SVCD.services.SVCD.ConsultaDatosIdentidad(SVCD.java:72)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.aop.joinpoint.MethodInvocation.invokeTarget(MethodInvocation.java:122)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:111)
at org.jboss.ejb3.EJBContainerInvocationWrapper.invokeNext(EJBContainerInvocationWrapper.java:69)
at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.invoke(InterceptorSequencer.java:73)
at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.aroundInvoke(InterceptorSequencer.java:59)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.aop.advice.PerJoinpointAdvice.invoke(PerJoinpointAdvice.java:174)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.fillMethod(InvocationContextInterceptor.java:72)
at
org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_fillMethod_23794987.invoke(Invoc
ationContextInterceptor_z_fillMethod_23794987.java)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.setup(InvocationContextInterceptor.java:88)
at
org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_setup_23794987.invoke(Invocatio
nContextInterceptor_z_setup_23794987.java)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:62)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at
org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.j
ava:56)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:68)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:190)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:306)
at org.jboss.ejb3.stateless.StatelessContainer.invokeEndpoint(StatelessContainer.java:662)
at org.jboss.wsf.container.jboss50.invocation.InvocationHandlerEJB3.invoke(InvocationHandlerEJB3.java:96)
at org.jboss.ws.core.server.ServiceEndpointInvoker.invoke(ServiceEndpointInvoker.java:222)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.processRequest(RequestHandlerImpl.java:474)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.handleRequest(RequestHandlerImpl.java:295)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.doPost(RequestHandlerImpl.java:205)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:131)
at org.jboss.wsf.common.servlet.AbstractEndpointServlet.service(AbstractEndpointServlet.java:85)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
Pgina 10 de 37
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
at
org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:12
6)
at
org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:595)
2011-11-25 14:03:39 [com.microsoft.sqlserver.jdbc.SQLServerConnection] FINE - ConnectionID:14
TransactionID:0x0000000000000000 Network packet size is 8000 bytes
2011-11-25 14:03:40 [org.jboss.ejb3.stateless.StatelessBeanContext] WARN - EJBTHREE-1337: do not get
WebServiceContext property from stateless bean context, it should already have been injected
2011-11-25 14:03:40 [org.jboss.ws.core.jaxws.handler.MessageContextJAXWS] DEBUG - Begin response processing
2011-11-25 14:03:40 [org.jboss.ws.core.soap.MessageContextAssociation] DEBUG - popMessageContext:
org.jboss.ws.core.jaxws.handler.SOAPMessageContextJAXWS@c5153e (Thread http-127.0.0.1-8080-3)
2011-11-25 14:03:40 [org.jboss.ws.core.soap.MessageContextAssociation] DEBUG - pushMessageContext:
org.jboss.ws.core.jaxws.handler.SOAPMessageContextJAXWS@118617f (Thread http-127.0.0.1-8080-3)
2011-11-25 14:03:40 [org.jboss.ws.core.jaxws.SOAPFaultHelperJAXWS] ERROR - SOAP request exception
javax.xml.soap.SOAPException: Error en el servicio Web: Se ha producido una excepcin al realizar la llamada al
servicio Web del MAP: -1
at es.navarra.SVCD.services.SVCD.ConsultaDatosIdentidad(SVCD.java:96)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.aop.joinpoint.MethodInvocation.invokeTarget(MethodInvocation.java:122)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:111)
at org.jboss.ejb3.EJBContainerInvocationWrapper.invokeNext(EJBContainerInvocationWrapper.java:69)
at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.invoke(InterceptorSequencer.java:73)
at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.aroundInvoke(InterceptorSequencer.java:59)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.aop.advice.PerJoinpointAdvice.invoke(PerJoinpointAdvice.java:174)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.fillMethod(InvocationContextInterceptor.java:72)
at
org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_fillMethod_23794987.invoke(Invoc
ationContextInterceptor_z_fillMethod_23794987.java)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.setup(InvocationContextInterceptor.java:88)
at
org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_setup_23794987.invoke(Invocatio
nContextInterceptor_z_setup_23794987.java)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:62)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at
org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.j
ava:56)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:68)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:190)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
Pgina 11 de 37
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:306)
at org.jboss.ejb3.stateless.StatelessContainer.invokeEndpoint(StatelessContainer.java:662)
at org.jboss.wsf.container.jboss50.invocation.InvocationHandlerEJB3.invoke(InvocationHandlerEJB3.java:96)
at org.jboss.ws.core.server.ServiceEndpointInvoker.invoke(ServiceEndpointInvoker.java:222)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.processRequest(RequestHandlerImpl.java:474)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.handleRequest(RequestHandlerImpl.java:295)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.doPost(RequestHandlerImpl.java:205)
at org.jboss.wsf.stack.jbws.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:131)
at org.jboss.wsf.common.servlet.AbstractEndpointServlet.service(AbstractEndpointServlet.java:85)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
at
org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:12
6)
at
org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:595)
El error, es debido a un bug con las libreras de Spring WS que utiliza el Recubrimiento WS
(https://jira.springsource.org/browse/SWS-517), este error est resuelto en la versin 1.5.8 de
las libreras, pero no est propagado hacia arriba, y debido a esto y a que el Recubrimiento usa
la versin 2.0.0 Milestone 1 ocurre este error.
Hay dos posibles soluciones
2.2
Con estas dos propiedades configuradas el servidor enva su certificado al cliente y el cliente
enva su certificado al servidor. El cliente puede validar el certificado del servidor a travs de
los certificados de entidades emisoras instalados en su navegador. An cuando el certificado
del servidor no sea de confianza siempre existe la posibilidad de aceptar este riesgo y
continuar con la conexin haca esa pgina Web.
Normalmente las aplicaciones Webs serias tienen configurados certificados cuya entidad
emisora es mundialmente conocida (Verisign, Thawte, etc). El navegador del cliente es el
encargado de verificar el certificado del servidor. Pongamos algunos ejemplos:
Pgina 12 de 37
Pgina 13 de 37
Tambin se puede comprobar que el CN corresponde con el nombre del dominio (*.060.gob.es
sirve para cambiodomicilio.060.gob.es). Su entidad certificadora es AC CAMERFIRMA que
tambin es una de las entidades de certificacin intermedias que estn incluidas en el
navegador.
Ejemplo de aviso de certificado de servidor: https://10.253.114.137/scsp
Pgina 14 de 37
En este caso el navegador nos avisa que el certificado del servidor no es vlido. La razn es
porque su CN no se corresponde con el nombre del dominio al que estamos accediendo. Este
ejemplo corresponde a siguiente configuracin en el servidor de la mquina:
<Connector
port="443"
protocol="HTTP/1.1"
SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
clientAuth="want"
sslProtocol="TLS"
keystoreFile="/usr/local/apache-tomcat6.0.29/certificados/DOMICILIO.REDSARA.ES.SERVIDOR.SSL.pfx"
keystoreType="pkcs12"
keystorePass="xxx"
truststoreFile="/usr/local/apache-tomcat6.0.29/certificados/truststoreWS.jks"
truststoreType="jks"
truststorePass="xxx"
/>
Pgina 15 de 37
Esto tambin lo podemos verificar obteniendo los detalles del certificado mediante la opcin I
Understand the Risks que aparece en el navegador. Si aadimos la excepcin podremos
entrar sin problemas a la Web indicada.
Pgina 16 de 37
Tambin puede darse el caso que la entidad emisora del certificado de servidor no sea una de
las que tenemos incluidas en nuestro navegador. Un ejemplo es la creacin de un certificado
autofirmado que hemos creado de prueba mediante la herramienta keytool.
C:\MPR\Certificados\Servidor>keytool -genkey -alias tomcat -keyalg RSA -keystore
server.jks
Escriba la contrasea del almacn de claves:
Volver a escribir la contrasea nueva:
+Cuales son su nombre y su apellido?
[Unknown]: localhost
+Cual es el nombre de su unidad de organizacin?
[Unknown]: Servidor Tomcat
+Cual es el nombre de su organizacin?
[Unknown]: MPTAP
+Cual es el nombre de su ciudad o localidad?
[Unknown]: Madrid
+Cual es el nombre de su estado o provincia?
[Unknown]: ES
+Cual es el codigo de pais de dos letras de la unidad?
[Unknown]: ES
+Es correcto CN=localhost, OU=Servidor Tomcat, O=MPTAP, L=Madrid, ST=ES, C=ES?
[no]: si
Escriba la contrasea clave para <tomcat>
(INTRO si es la misma contrasea que la del almacen de claves):
C:\MPR\Certificados\Servidor>
Podemos configurar el servidor para que el conector seguro use este certificado:
Pgina 17 de 37
Pgina 18 de 37
En realidad estos avisos no comprometen la seguridad de la conexin https, solo nos advierten
que el certificado de servidor no es vlido. En estos casos el cliente tiene la opcin de aceptar
este riesgo y establecer la conexin segura. Hay algunos ejemplos reales donde sucede esto y
tenemos que aadir el certificado dentro de las excepciones.
Pgina 19 de 37
2.3
Cuando el servidor enva su certificado al cliente, tambin enva una lista de entidades
certificadoras. El servidor espera que el certificado usado por el cliente tenga como emisor
alguna de las entidades aparecen en esa lista. Si usamos un analizador de paquetes podemos
ver un ejemplo de esto.
Las siguientes imgenes corresponden al handshake entre cliente-servidor de la aplicacin
https://10.253.114.137/scsp.
Pgina 20 de 37
El certificado que aparece sealado en azul corresponde con el certificado .PFX definido en la
propiedad keystoreFile del conector https:
keystoreFile="/usr/local/apache-tomcat6.0.29/certificados/DOMICILIO.REDSARA.ES.SERVIDOR.SSL.pfx"
Y tambin se pueden ver las entidades de certificacin emisoras que acepta el servidor.
Pgina 21 de 37
Esta lista de certificados corresponde con todos los certificados que estn en el almacn y que
fue configurado para el conector seguro. En el siguiente ejemplo correspondiente al almacn
trusstoreWS.jks sealado en azul.
<Connector
port="443"
protocol="HTTP/1.1"
SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
clientAuth="want"
sslProtocol="TLS"
keystoreFile="/usr/local/apache-tomcat6.0.29/certificados/DOMICILIO.REDSARA.ES.SERVIDOR.SSL.pfx"
keystoreType="pkcs12"
keystorePass="xxx"
truststoreFile="/usr/local/apache-tomcat6.0.29/certificados/truststoreWS.jks"
truststoreType="jks"
truststorePass="xxx"
/>
Pgina 22 de 37
3.1
Configuracin Tomcat.
En primer lugar se debe de aadir un conector nuevo que nos proporcionar la conexin
entre apache y tomcat.
Este conecto se especifica en el fichero server.xml de tomcat. Un ejemplo de
configuracin sera el siguiente.
<Connector
port="9009"
protocol="AJP/1.3"
maxThreads="300"
redirectPort="9443" />
Dnde:
9009 Es el puerto que comunicar apache con tomcat
9443 Es nuestro puerto dedicado a https en tomcat
Esta es la nica configuracin que debemso hacer en tomcat
3.2
Configuracin Apache
3.2.1.1
JK como mdulo
Pgina 23 de 37
3.2.1.2
JK compilado
3.2.1.3
3.2.1.4
Configuracin SSL
SSLProxyEngine on
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
SSLSessionCache none
</IfModule>
Vemos que se le indica que las sesiones no sean cacheadas, esto es debido a
que con el cliente ligero presenta incompatibilidades, y la visualizacin puede no
ser correcta.
3.2.2 Configuracin JK
Para la configuracin de el enlace entre apache y tomcat, utilizaremos el fichero
de configuracin anteriormente indicado en el fichero de configuracin global, en
este ejemplo mod-jk.conf
En este fichero deberemos configurar el fichero de configuracin
worker.properties que indicar los datos de tomcat con los que vamos a
conectarnos desde apache a el.
JkWorkersFile conf/workers.properties
Pgina 24 de 37
<VirtualHost *:443>
ServerName nombreServer
ServerSignature On
SSLEngine
on
SSLCertificateFile
/opt/certificados/cert_apache/ ssl.public.cer
SSLCertificateKeyFile /opt/certificados/cert_apache/ ssl.private.key
Pgina 25 de 37
Como vemos creamos un virtualhost para aplicar las propiedades a todo lo que
venga por el puerto 443 de apache.
Las priopiedades especficas de la configuracin vemos que son similares a lo
anteriormente configurado, se mapea la aplicacin, y posteriormente se aade
configuracin especifica con el tag <location> como ya habamos deshabilitado
la cache globalmente, no hara falta hacerlo aqu, de ah que lo veamos
comentado.
Tambin vemos como se especifica que al entrar a la aplicacin se solicite el
certificado.
SSLVerifyClient optional_no_ca
worker.list=nodo1scsp
#TOMCAT SCSP
worker.nodo1scsp.port=9009
worker.nodo1scsp.host=localhost
worker.nodo1scsp.type=ajp13
worker.nodo1scsp.lbfactor=1
worker.nodo1scsp.socket_keepalive=True
worker.nodo1scsp.connect_timeout=10000
worker.nodo1scsp.prepost_timeout=1000
Pgina 26 de 37
Al no especificar esta propiedad el servidor Tomcat usa el almacn de certificados del entorno
de ejecucin Java con el que ha arrancado el servidor. Normalmente este almacn se llama
cacerts y se encuentra en el directorio \ jre\lib\security del entorno Java.
Para acceder a la aplicacin cliente ligero es necesario autenticarse mediante un certificado
soportado por @firma, que son:
DNIe
FNMT Ceres
CATCERT
ACCV
IZENPE
ANF
CAMERFIRMA
ACA
ANCERT
FIRMAPROFESIONAL
BANESTO
SCR
Pgina 27 de 37
Ministerio de Defensa
HEALTHSIGN
EDICOM
BANCO SANTANDER
MTIN
GISS
Si se est usando el almacn cacerts, puede darse el caso que este almacn no haya sido
modificado (por ejemplo cuando se parte de un nuevo equipo y se le instala una versin de
Java). Aunque se haya importado un certificado personal admitido por @firma en el navegador
desde el cual queremos acceder a la aplicacin cliente-ligero no ser suficiente para establecer
la conexin https. Un ejemplo sera por ejemplo usando un certificado emitido por la FNMT y
que es usado ampliamente por los Espaoles.
Este certificado ha sido emitido por la FNMT por lo que el servidor Tomcat solo puede verificar
la validez del certificado personal si dispone de la parte pblica del certificado que ha emitido el
certificado personal
Pgina 28 de 37
Es por ello que cuando Tomcat enva su certificado de servidor tambin enva una lista de
entidades emisoras de certificados con las que puede validar el certificado que enva el cliente.
Esta lista de certificados corresponde a los certificados pblicos que estn en el almacn
configurado en la propiedad truststoreFile del conector https.
El almacn cacerts del entorno de ejecucin Java no trae por defecto el certificado pblico de la
FNMT por lo que si se usa este almacn como truststoreFile obtendremos este error. La
solucin es configurar la propiedad truststoreFile para que use un almacn con los certificados
pblicos que se quiera o bien aadir el certificado pblico de la FNMT (en este caso) para que
se pueda establecer la conexin https.
El ejemplo de configurar la propiedad truststoreFile se puede ver en el punto 2.1. Para aadir el
certificado pblico de la entidad emisora de nuestro certificado personal se hara de la siguiente
manera:
Pgina 29 de 37
Pgina 30 de 37
SubjectKeyIdentifier [
KeyIdentifier [
0000: 40 9A 76 44 97 74 07 C4 AC 14 CB 1E 8D 4F 3A 45 @.vD.t.......O:E
0010: 7C 30 D7 61
.0.a
]
]
#4: ObjectId: 1.2.840.113533.7.65.0 Criticality=false
#5: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
[DistributionPoint:
[CN=CRL1, OU=FNMT Clase 2 CA, O=FNMT, C=ES]
]]
#6: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
CA:true
PathLen:2147483647
]
#7: ObjectId: 2.16.840.1.113730.1.1 Criticality=false
NetscapeCertType [
SSL CA
S/MIME CA
Object Signing CA]
#8: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 40 9A 76 44 97 74 07 C4 AC 14 CB 1E 8D 4F 3A 45 @.vD.t.......O:E
0010: 7C 30 D7 61
.0.a
]
]
+Confiar en este certificado? [no]: si
Se ha aadido el certificado al almacen de claves
C:\Sun\jdk1.6.0_20\jre\lib\security>
Una vez realizado este cambio reiniciamos el servidor Tomcat. Cuando volvamos a acceder
veremos como ya s podemos seleccionar el certificado personal emitido por la FNMT.
NOTA: he tenido que limpiar la cache del navegador.
Pgina 31 de 37
4.1.1 ssl_error_renegotiation_not_allowed
En ciertas versiones de Firefox (4.x en adelante) en ciertas ocasiones se ha obtenido el
siguiente error al acceder a las aplicaciones de Cliente Ligero y Web de Administracin.
Pgina 32 de 37
Este error es debido a que el navegador no permite una renegociacin con el servidor,
los pasos para solucionar esto son los siguientes.
1. Entrar en la gestin de la configuracin de Firefox, esto lo realizaremos
poniendo en la barra de navegacin about:config.
security.ssl.allow_unrestricted_renego_everywhere__temporarily_available_pref
Pgina 33 de 37
4.2
Para que no existan problemas con caracteres especiales tales como tildes etc es
necesario configurar el enconding es_ES.ISO8859-1 Se puede configurar de diferentes
maneras.
4.2.2.1
Configuracin en el conector
Pgina 34 de 37
4.2.2.2
Configuracin en el arranque
Windows (catalina.bat)
set CATALINA_OPTS=-Dfile.encoding="es_ES.ISO8859-1"
set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding="es_ES.ISO8859-1"
Linux (catalina.sh)
export CATALINA_OPTS=-Dfile.encoding="es_ES.ISO8859-1"
export JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding="es_ES.ISO8859-1"
Se recomienda que el charset de la Base de Datos, de las tablas y de los campos sea
latin1, y que el collation de la misma sea latin1_swedish_ci, parmetros por defecto.
Se han comprobado errores en la creacin de las tablas cuando el charset es UTF-8
Oracle 9i
Se recomienda que el driver utilizado para conectar la aplicacin con la Base de datos,
sea el driver de la versin 10g si la Base de Datos es una 9i.
Esto es debido a un bug del driver de la 9i cuando se intenta insertar un BLOB mediante
hibrnate.
El error que nos mostrar la aplicacin es el siguiente.
011-11-08 16:22:01 [org.hibernate.util.JDBCExceptionReporter] WARN - SQL Error: 17090, SQLState: null
2011-11-08 16:22:01 [org.hibernate.util.JDBCExceptionReporter] ERROR - operation not allowed: streams type
cannot be used in batching
2011-11-08 16:22:02 [org.hibernate.event.def.AbstractFlushingEventListener] ERROR - Could not synchronize
database state with session
org.hibernate.exception.GenericJDBCException: could not insert: [es.scsp.common.domain.Token]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2262)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2655)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:60)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
at
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:
298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1001)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:339)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at es.scsp.common.dao.TokenDao.save(TokenDao.java:29)
at es.scsp.modules.AlmacenarMensajeSave.managePeticion(AlmacenarMensajeSave.java:182)
Pgina 35 de 37
Pgina 36 de 37
Aprobacin
Pgina 37 de 37