Bueno vamos a hablar un poco de las infraestructuras de clave publica, y ya que algunos alumnos las han instalado sin existo, en nuestro caso hablaremos sobre EJBCA que haciendo referencia a un post del blog de un amigo Software PKI Opensource. me parece a mi punto de vista la infraestructara de clave publica open source mas completa para algunas implementaciones .
Y como bien dijo nuestros amigos de Security By Default que algun dia subire fotos de la camisa, vamos a montar nuestro PKI de "Calvin klein".Para empezar desde 0 dejo la referencia a la Wikipedia sobre la explicación de los usos y deficion de PKI, para los que no tiene conocimiento puedan referirse .
Ademas de ello la instalacion de la guia rapida que siempre dejaba como trabajo la pueden encontrar en : http://www.ejbca.org/installation.html
Pero como se que algunos les gusta entrar en la jungla con machete y arco entonces vamos adelante. Ademas esta serie de post van para un amigo que queria montar su tesis de "tarjetitas" entonces espero que esta serie de post de infraestructuras de clave publica que terminaran con DNIe les sirva para sus "tarjetitas" :)..
Vamos a hacer la instalación con Ubuntu asi que entremos como root!. (recuerden tener mas de 2048MB de memoria ram en su Ubuntu Server o Desktop igual deberia funcionar para Debian)
Entonces empezemos..
$apt-get install unzip openjdk-6-jdk ant libmysql-java
instalaremos las utilidades de descompresion , el jdk de java el mysql JDBC conector y apache Ant.
Luego le podemos meter mano para agregar UTF8 a MySQL y quitarnos algunos dolores de cabeza mas adelante.
$ nano /etc/mysql/conf.d/utf-8.cnf
----BEGIN----
[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8
default-collation=utf8_unicode_ci
character-set-server=utf8
init-connect='SET NAMES utf8'
character-set-client = utf8
-----END-----
Despues de escribir ell archivo debemos reiniciar la BD's
$ service mysql restart
$/etc/init.d/mysql restart
Para gustos estan los sabores, cualquiera de los dos comandos anteriores les deberia servir, si no consulten a su cardiologo.
Ok ahora vamos a agregar unas cuentas de usuarios para darle un poco de seguridad a la instalación, una cuenta para correr la instancia de jboss por encima de ejbca y la segunda para restringir los accesos a la instalación y los archivos de instalación
$ adduser --system --shell /bin/bash --group ejbca
$ adduser --system --shell /bin/bash --group jboss
$ usermod -a -G jboss ejbca
Descargen y descompriman en un directorio de trabajo elegido por ustedes o para el proyecto. en mi caso /opt sera mi directorio..
$ wget http://sourceforge.net/projects/jboss/files/JBoss/JBoss-5.1.0.GA/jboss-5.1.0.GA-jdk6.zip
$ unzip ~/packages/bin/jboss-5.1.0.GA.zip -d /opt/
$ chown -R jboss.jboss /opt/jboss-5.1.0.GA
$ chmod -R o= /opt/jboss-5.1.0.GA
Luego creamos un link simbolico apuntando a la instalacion del jboss
$ cd /opt/
$ ln -s jboss-5.1.0.GA jboss
En la mayoria de intalaciones de PKI se requiere que la instalacion inicialice junto con el boteo del sistema operativo
$nano ejbca
_____________________________________________________________________________
#!/bin/bash . /lib/lsb/init-functions jbossInstance="$(basename $0 | sed -e 's/^[SK][[:digit:]]*//')" configFile="/etc/jboss/$jbossInstance.conf" daemonName="$jbossInstance" pidFile="/var/run/$jbossInstance.pid" function checkEnvironment() { local binaries=(env) for bin in "${binaries[@]}"; do if ! which "$bin" > /dev/null; then log_failure_msg "Binary '$bin' is not available. Please install \ package containing it." exit 5 fi done } function checkConfig() { if ! [[ -f $configFile ]]; then log_failure_msg "Please populate the configuration file '$configFile' \ before running." exit 6 fi local reqOptions=(user group javaHome javaOpts jbossHome jbossConf) for option in "${reqOptions[@]}"; do if ! grep -q -e "^[[:blank:]]*$option=" "$configFile"; then log_failure_msg "Mandatory option '$option' was not specified in \ '$configFile'" exit 6 fi done } function configure() { . "$configFile" env="$(which env)" java="$javaHome/bin/java" jbossEndorsedDirs="$jbossHome/lib/endorsed" if [[ -n $jbossClasspath ]]; then jbossClasspath="$jbossClasspath:$jbossHome/bin/run.jar" else jbossClasspath="$jbossHome/bin/run.jar" fi if [[ -n $javacJar && -f $javacJar ]]; then jbossClasspath="$jbossClasspath:$javacJar" elif [[ -f $javaHome/lib/tools.jar ]]; then jbossClasspath="$jbossClasspath:$javaHome/lib/tools.jar" fi javaOpts=("${javaOpts[@]}" '-Djava.net.preferIPv4Stack=true') if "$java" -version 2>&1 | grep 'HotSpot' > /dev/null; then javaOpts=("${javaOpts[@]}" '-server') fi if [[ -n $jbossNative ]]; then javaOpts=("-Djava.library.path=$jbossNative" "${javaOpts[@]}") fi if [[ -n $jbossNative && -z $LD_LIBRARY_PATH ]]; then LD_LIBRARY_PATH="$jbossNative" elif [[ -n $jbossNative ]]; then LD_LIBRARY_PATH="$jbossNative:$LD_LIBRARY_PATH" fi jbossOpts=("-c" "$jbossConf") if [[ -n "$jbossBind" ]]; then jbossOpts=("${jbossOpts[@]}" "-b" "$jbossBind") fi if [[ -n "$jbossPart" ]]; then jbossOpts=("${jbossOpts[@]}" "-g" "$jbossPart") fi if [[ -n "$jbossUdpIp" ]]; then jbossOpts=("${jbossOpts[@]}" "-u" "$jbossUdpIp") fi daemonExec="$env" daemonArgs=(-i $java "${javaOpts[@]}" -Djava.endorsed.dirs="$jbossEndorsedDirs" -classpath "$jbossClasspath" org.jboss.Main "${jbossOpts[@]}") } function start() { start-stop-daemon --start --quiet --oknodo --pidfile "$pidFile" \ --make-pidfile --chuid "$user:$group" -b --name java --startas \ "$daemonExec" -- "${daemonArgs[@]}" } function stop() { start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile "$pidFile" \ --chuid "$user:$group" --exec "$java" } function status() { status_of_proc -p "$pidFile" "$daemonExec" "$jbossInstance" } checkConfig configure checkEnvironment case "$1" in start) log_daemon_msg "Starting daemon" "$jbossInstance" start && log_end_msg 0 || log_end_msg $? ;; stop) log_daemon_msg "Stopping daemon" "$jbossInstance" stop && log_end_msg 0 || log_end_msg $? ;; restart) log_daemon_msg "Restarting daemon" "$jbossInstance" stop /bin/sleep 1 start && log_end_msg 0 || log_end_msg $? ;; force-reload) log_daemon_msg "Restarting daemon" "$jbossInstance" stop start && log_end_msg 0 || log_end_msg $? ;; status) status && exit 0 || exit $? ;; *) echo "jboss (start|stop|restart|force-reload|status|help)" ;; esac
______________________________________________________________________________
Copienlo y pegenlo en su archivo
Ahora le metemos los permisos para los archivos
$ chown root.root /etc/init.d/ejbca
$ chmod 755 /etc/init.d/ejbca
Change the init script so that it provides the EJBCA service:
# /etc/init.d/ejbca
----BEGIN----p
--- # Provides: jboss
+++ # Provides: ejbca
-----END-----p
----BEGIN----p
--- # Provides: jboss
+++ # Provides: ejbca
-----END-----p
$mkdir /etc/jboss
$chmod 750 /etc/jboss
Creamos el archivo de conifguración para el EJBCA dentro de la instancia de Jboss
# /etc/jboss/ejbca.conf
----BEGIN----
user=ejbca
group=ejbca
javaHome=/usr/lib/jvm/java-6-openjdk/
javaOpts=(-XX:PermSize=96m -XX:MaxPermSize=128m -Xms128m -Xmx512m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000)
jbossHome=/opt/jboss
jbossConf=ejbca
jbossBind=0.0.0.0
jbossClasspath=/usr/share/java/mysql.jar
-----END-----
----BEGIN----
user=ejbca
group=ejbca
javaHome=/usr/lib/jvm/java-6-openjdk/
javaOpts=(-XX:PermSize=96m -XX:MaxPermSize=128m -Xms128m -Xmx512m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000)
jbossHome=/opt/jboss
jbossConf=ejbca
jbossBind=0.0.0.0
jbossClasspath=/usr/share/java/mysql.jar
-----END-----
$ chmod 640 /etc/jboss/ejbca.conf
$ cd /opt/jboss/server/
$ cp -pr default ejbca
$ chown -R ejbca.ejbca ejbca
$ rm -rf /opt/jboss/server/ejbca/deploy/ROOT.war/
$ rm -rf /opt/jboss/server/ejbca/deploy/jmx-console.war/
$ rm -rf /opt/jboss/server/ejbca/deploy/management/
$ rm -rf /opt/jboss/server/ejbca/deploy/admin-console.war/
-t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
-t nat -A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8443
-t nat -A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8443
Ahora vamos a instalar nuestra Central de PKI
$ wget http://sourceforge.net/projects/ejbca/files/ejbca4/ejbca_4_0_10/ejbca_4_0_10.zip
$ unzip ~/packages/src/ejbca_4_0_10.zip -d /opt/
$ chown -R ejbca.ejbca /opt/ejbca_4_0_10/
$ chmod -R o= /opt/ejbca_4_0_10/
$ cd /opt
$ ln -s ejbca_4_0_10 ejbca
$ unzip ~/packages/src/ejbca_4_0_10.zip -d /opt/
$ chown -R ejbca.ejbca /opt/ejbca_4_0_10/
$ chmod -R o= /opt/ejbca_4_0_10/
$ cd /opt
$ ln -s ejbca_4_0_10 ejbca
Ahora vamos a configurar los archivos de configuración del EJBCA, dentro del directorio /opt/ejbca/conf donde se encuentran no solo los archivos de conifugracion de la instalacion sino ademas achivos para linkear un HSM o un Base de Datos a nuestra PKI en producción,
La mayoria de archivos de configuracion terminan con la palabra "sample" , pero para nuestra configuracion deberemos renonbrar el "ejbca.properties.sample" a "ejbca.properties " y tener encuenta las siguientes anotaciones que dejo del archivo, deben de coincidir dentro del archivo que hemos renombrado.
# /opt/ejbca/conf/ejbca.properties
----BEGIN----
# Specify the root directory of the application server that's being used.
appserver.home=/opt/jboss
# Explicitly specify the application server being used. Useful if the root
# (home) directory of the application server doesn't use a standard name.
appserver.type=jboss
# Force deployment only of CA part. OCSP will be deployed on a separate server.
ejbca.productionmode=ca
# Specify the password which will be used for protecting the keystore where the
# CA's private key and certificate will be stored.
ca.keystorepass={{PASSWORD}}
# Specify the configuration of JBoss AS that should be used.
jboss.config=ejbca
# Make the healthchecker a bit more strict than the default. It will trigger an
# alarm once this much of free memory is left (in megabytes).
healthcheck.amountfreemem=32
# Make the healthcheck actually perform signing operation to make sure it's
# working properly.
healthcheck.catokensigntest=true
-----END-----
----BEGIN----
# Specify the root directory of the application server that's being used.
appserver.home=/opt/jboss
# Explicitly specify the application server being used. Useful if the root
# (home) directory of the application server doesn't use a standard name.
appserver.type=jboss
# Force deployment only of CA part. OCSP will be deployed on a separate server.
ejbca.productionmode=ca
# Specify the password which will be used for protecting the keystore where the
# CA's private key and certificate will be stored.
ca.keystorepass={{PASSWORD}}
# Specify the configuration of JBoss AS that should be used.
jboss.config=ejbca
# Make the healthchecker a bit more strict than the default. It will trigger an
# alarm once this much of free memory is left (in megabytes).
healthcheck.amountfreemem=32
# Make the healthcheck actually perform signing operation to make sure it's
# working properly.
healthcheck.catokensigntest=true
-----END-----
No se olviden de modificar el campo de "ca.keystorepass" con el password que se necesite para la seguridad de la llave del certificado dentro de la autoridad de certificación, recuerden minimo de 8 caracteres.
Ahora configuraremos el archivo de base de datos, exactamente el mismo procedimiento lo renonmbramos el archivo y revisamos que los parametro esten como los necesitamos.
# /opt/ejbca/conf/database.properties
----BEGIN----
# Specify desired type of database server.
database.name=mysql
# Specify the database connection URL. This property should be set according to
# the JDBC connector used (in this case the MySQL connector). See the MySQL JDBC
# for details on other options.
database.url=jdbc:mysql://127.0.0.1:3306/ejbca?characterEncoding=UTF-8
# Specify the class which should be used for the communication with the
# database. This class should correspond to the select database, and its name is
# dependant on the JDBC implementation for the given database server.
database.driver=com.mysql.jdbc.Driver
# Login credentials for the database which should store the CA information.
database.username=ejbca
database.password={{password_ejbca_mysql}}
-----END-----
Recuerden en el parametro "database.password " debera ser el mismo password que elijieron en la creación del usuario ejbca dentro de la BD MySQL
----BEGIN----
# Specify desired type of database server.
database.name=mysql
# Specify the database connection URL. This property should be set according to
# the JDBC connector used (in this case the MySQL connector). See the MySQL JDBC
# for details on other options.
database.url=jdbc:mysql://127.0.0.1:3306/ejbca?characterEncoding=UTF-8
# Specify the class which should be used for the communication with the
# database. This class should correspond to the select database, and its name is
# dependant on the JDBC implementation for the given database server.
database.driver=com.mysql.jdbc.Driver
# Login credentials for the database which should store the CA information.
database.username=ejbca
database.password={{password_ejbca_mysql}}
-----END-----
Recuerden en el parametro "database.password " debera ser el mismo password que elijieron en la creación del usuario ejbca dentro de la BD MySQL
Otro Archivo importante que vamos a meterele mano es al "install,properties", el cual especifica mucha de la información para la autoridad de certificación. El archivo debemos verificar que contenga estas configuraciones.
# /opt/ejbca/conf/install.properties
----BEGIN----
# Name of the temporary CA used for initial configuration and access (before the
# proper CA hierarchy is in place).
ca.name=PKICyttek
# Distinguished name of the temporary admin CA
ca.dn=CN=PKICyttek,O=Cyttek Group.,C=RS
# Software tokens should have this set to null
ca.tokenpassword=null
# Type of the temporary admin CA private key. (default value listed)
ca.keytype=RSA
# RSA key size for the temporary admin CA.
ca.keyspec=4096
# Default signing algorithm for the temporary admin CA.
ca.signaturealgorithm=SHA256WithRSA
# Validity period for the temporary admin CA in days.
ca.validity=30
# Policy for the temporary admin CA.
ca.policy=null
-----END-----
----BEGIN----
# Name of the temporary CA used for initial configuration and access (before the
# proper CA hierarchy is in place).
ca.name=PKICyttek
# Distinguished name of the temporary admin CA
ca.dn=CN=PKICyttek,O=Cyttek Group.,C=RS
# Software tokens should have this set to null
ca.tokenpassword=null
# Type of the temporary admin CA private key. (default value listed)
ca.keytype=RSA
# RSA key size for the temporary admin CA.
ca.keyspec=4096
# Default signing algorithm for the temporary admin CA.
ca.signaturealgorithm=SHA256WithRSA
# Validity period for the temporary admin CA in days.
ca.validity=30
# Policy for the temporary admin CA.
ca.policy=null
-----END-----
Ademas de ello debemos de configurar las propiedades archivo para el servidore Web que servira la aplicacion, Entonces debemos de verificar que contenga lo siguiente:
# /opt/ejbca/conf/web.properties
----BEGIN----
# Password for the Java truststore used by EJBCA.
java.trustpassword={{ejbca_truststore_password}}
# Common and distinguished name for the temporary super-administrator.
superadmin.cn=TempSuperAdmin
superadmin.dn=CN=${superadmin.cn}
# Password for the temporary super-administrator's p12 keystore.
superadmin.password={{superadmin_password}}
# Specify that the temporary super-administrator's p12 keystore should be
# generated a part of a 'batch' operation. (otherwise it's useful for storing it
# on a smart-card through the EJBCA public web interface)
superadmin.batch=true
# Password for protecting the keystore containing the application server's
# private key and certificate.
httpsserver.password={{ejbca_https_password}}
# Hostname which will be used for accessing the CA (must be resolvable from
# client stations accessing the web interface).
httpsserver.hostname=ca.cyttek.com
# Distinguished name for the application server.
httpsserver.dn=CN=${httpsserver.hostname},O=Cyttek Group.,C=RS
# Specify external port visible to users of EJBCA.
httpserver.external.privhttps=443
# Specify desired language for the web frontend.
web.availablelanguages=EN
# Error message which should be shown to end users in case of an error.
web.errorpage.notification=An exceptions has occurred while trying to process your request. Please contact the administrators and provide the information presented within this page.
-----END-----
----BEGIN----
# Password for the Java truststore used by EJBCA.
java.trustpassword={{ejbca_truststore_password}}
# Common and distinguished name for the temporary super-administrator.
superadmin.cn=TempSuperAdmin
superadmin.dn=CN=${superadmin.cn}
# Password for the temporary super-administrator's p12 keystore.
superadmin.password={{superadmin_password}}
# Specify that the temporary super-administrator's p12 keystore should be
# generated a part of a 'batch' operation. (otherwise it's useful for storing it
# on a smart-card through the EJBCA public web interface)
superadmin.batch=true
# Password for protecting the keystore containing the application server's
# private key and certificate.
httpsserver.password={{ejbca_https_password}}
# Hostname which will be used for accessing the CA (must be resolvable from
# client stations accessing the web interface).
httpsserver.hostname=ca.cyttek.com
# Distinguished name for the application server.
httpsserver.dn=CN=${httpsserver.hostname},O=Cyttek Group.,C=RS
# Specify external port visible to users of EJBCA.
httpserver.external.privhttps=443
# Specify desired language for the web frontend.
web.availablelanguages=EN
# Error message which should be shown to end users in case of an error.
web.errorpage.notification=An exceptions has occurred while trying to process your request. Please contact the administrators and provide the information presented within this page.
-----END-----
Ademas podemos configurar el archivo de envio de correos para que EJBCA nos mande correos a nuestro email personal:
# /opt/ejbca/conf/mail.properties
----BEGIN----
# Log-in credentials for sending email notifications from EJBCA.
mail.user={{demo@cyttek.com}}
mail.password={{ejbca_mail_contraseña}}
# Mail server used for sending out email notifications.
mail.smtp.host=mail.cyttek.com
# Specify whether the mail server requires the authentication or not.
mail.smtp.auth=true
# Specify whether STARTTLS should be used or not.
mail.smtp.starttls.enable=true
# Email address used for sending the emails.
mail.from=ejbca-info@cyttek.com
-----END-----
----BEGIN----
# Log-in credentials for sending email notifications from EJBCA.
mail.user={{demo@cyttek.com}}
mail.password={{ejbca_mail_contraseña}}
# Mail server used for sending out email notifications.
mail.smtp.host=mail.cyttek.com
# Specify whether the mail server requires the authentication or not.
mail.smtp.auth=true
# Specify whether STARTTLS should be used or not.
mail.smtp.starttls.enable=true
# Email address used for sending the emails.
mail.from=ejbca-info@cyttek.com
-----END-----
Luego por ultimo asegurense que los archivos que acabamos de configurar
$ chown ejbca.ejbca /opt/ejbca/conf/*.properties
$ chmod 640 /opt/ejbca/conf/*.properties
$ chmod 640 /opt/ejbca/conf/*.properties
En este momento estaran como RAMBO I >> "Charly no siento los dedos...." jejeje..
pero ahora empezamos a instalar EJBCA,pasemos como el user ejbca que creamos anteriormente
$ su ejbca
$ cd /opt/ejbca/
$ ant bootstrap
$ cd /opt/ejbca/
$ ant bootstrap
Despues de que termine el proce de instalación , necesitamos correr el servicio de Jboss que contiene el EJBCA que configuramos mas arriba. en necesario para seguir mas adelante, pero esta vez como usuario root:
$ sudo su
$ service ejbca start
$ service ejbca start
Ojo, ! Jboss tarda un poco en terminar de arrancar pero podemos saber cuando termino con os siguientes comandos
$ su ejbca
$ tail -f /opt/jboss/server/ejbca/log/server.log
En el Tail buscamos dentro del archivo "log" una linea como estas.
2013-10-1
22:22:40,743 INFO [org.jboss.bootstrap.microcontainer.ServerImpl]
(main) JBoss (Microcontainer) [5.1.0.GA (build: SVNTag=JBoss_5_1_0_GA
date=201312011022)] Started in 4m:59s:229ms
$ su ejbca
$ cd /opt/ejbca/
$ ant install
$ sudo su
$ service ejbca stop
$ service ejbca stop
Y terminamos la instalación de Rambo con ;
$ su ejbca
$ cd /opt/ejbca/
$ ant deploy
$ cd /opt/ejbca/
$ ant deploy
$ sudo su
$ update-rc.d ejbca defaults
$ service ejbca start
$ update-rc.d ejbca defaults
$ service ejbca start
Ahora vamos a acceder al panel Administrador, como anteriormente hemos configurado el certificado del superadministrador con su password para acceder en el servidor Web. entonces desde el archivo "/opt/ejbca/p12/superadmin.p12 " el cual debe ser copiado a al computador de trabajo desde el servidor por "scp" o "sftp" , tengan cuidado con mandar el certificado por protocolos no seguros posublemente todavia no hemos hablado del diseño y las politicas pero en algunos casos estaria vulnerando las politicas de implementación de una infraestructura de clave publica en producción.
En el caso de Firefox para importarlo vamos a Edit -> Preferences -> Security -> Advanced -> Encryption -> Show Certificates . y importamos el certificado superadmin.p12 ahora les preguntara el passwor dque hemos configurado anteriormente en "web.properties" lo insertan y como hemos configurado los IPTABLES y enviado el .p12 a un cliente para configurar el servidor PKI deberemos entrar a la siguiete URL
>> http://ca.cyttek.com/ejbca/
Ok, asta el momento tenemos instalado correctamente nuestro infraestructura de clave publica, todavia no hemos entrado en las configuraciones ni emisión ni diseño que correctamente en un desarrollo el diseño es la parte mas compleja de la infraestructura, pero esta serie de post , van enfocados , en esos proyectos, que constantemente veo, de implementación de infraestructuras de clave publica, donde las empresas de cierto calibre estafan una cantidad risoria de millones de dolares a los gobiernos para sus PKI, sus tarjetitas sus OSCP , como ENTRUST, RSA, entre otras, viene y decontruyen millones de USD para implementar sus infraestructuras, con estos post intento que los gobiernos con sus presupuestos publicos se asesoren mejor en las implementaciones y al final de esta seria consegiremos crear DNIe , publicar una OSCP , entre otros ..
Lo que quiero es esclarecer bien que una infraestructura de clave publica no es simple su diseño y su configuración, pero estoy cansado de esas estafas que alfinal se reparte algun politico como la de Perú, o OpenCA de venezuela a saber como manejan el Timestamping, y esperemos que colombia, ecuador, y bolivia no caigan en los mismos ejes de proyectos con estafas, aqui pueden ver. que se puede remplazar una PKI enterprice, con los ajustes correctos...
Saludos
Bl4ck_D4wn
¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬|||
Infraestructura de clave publica I
Infraestructura de clave publica II (proximamente.)
Infraestructura de clave publica III
Infraestructura de clave publica IV
Infraestructura de clave publica V
¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬|||
Permiso para postear esto en Taringa capo...
ResponderEliminaratento a su respuesta por aquí mismo
Anónimo, mire mi idea no es publicar al derecho y al reves.. contenidos, no quiero degradar el contenido.. asi que si lo desean pueden referenciar el link..
ResponderEliminar