Mostrando entradas con la etiqueta seguridad. Mostrar todas las entradas
Mostrando entradas con la etiqueta seguridad. Mostrar todas las entradas

jueves, 15 de mayo de 2008

Como configurar Joomla y virtuemart en modo SSL

Lo primero es crear la CA y su certificado e instalarlo en el servidor

Una vez tengamos el certificado instalado en el dominio, el siguiente paso es activarlo, aqui es donde tenemos estas tres posibilidades:

1.- Poner todo el sitio bajo SSL
2.- Poner solo el admin bajo SSL (esto es bastante útil)
3.- Poner una serie de links determinados bajo SSL (esto será lo que haremos en nuestra práctica)


1.- Poner el sitio entero bajo SSL: No es muy recomendable, porque normalmente ralentiza bastante toda la navegación en general.

2.- Poner el administrator en SSL: Para poder loguearse al administrador en modo seguro SSL, es necesario editar los ficheros index.php e index2.php de la carpeta administrator. En el index.php inmediatamente después de la linea define( '_VALID_MOS', 1); teneis que poner el siguiente código:

//Redirect to https if accessed over http (except when running locally)

if ($_SERVER['SERVER_NAME'] != "localhost")
{
$port = $_SERVER["SERVER_PORT"];
$ssl_port = "443"; //Change 443 to whatever port you use for https (443 is the default and will work in most cases)
if ($port != $ssl_port)
{
$host = $_SERVER["HTTP_HOST"];
$uri = $_SERVER["REQUEST_URI"];
header("Location: https://$host$uri");
}
}

Igualmente hay que añadirlo en el index2.php inmediatamente despues de las directivas require_once al principio del fichero.

Con esto veréis que el administrator carga directamente en modo SSL. Una única cosa que he visto, es que en el editor WYSIWYG, no funcionan determinados popups de insertar imagen, etc. algo un poco molesto.

3. Configurar Virtuemart para que funcione bajo SSL: Virtuemart trae una opción en la configuración general, para activar el modo SLL, simplemente ponemos la URL de nuestra web, con el https, por ejemplo: https://www.tutienda.com (bastante cutre!). El problema que te vas a encontrar, es que cuando entras a realizar el pedido a modo seguro, cuando termines la compra o cuando pinches en cualquier otro link, seguirás con toda la web en modo seguro, porque no vuelve a poner http, en vez de https. Para conseguir que tu web cambie automáticamente a modo no seguro al pinchar en cualquier link normal, hay que realizar los siguientes ajustes:

Abrir el index.php de la raiz de joomla. En la línea 261, cerca de // loads template file cambiar todo ese bloque por esto:

// loads template file
if ( !file_exists( 'templates/'. $cur_template .'/index.php' ) ) {
echo _TEMPLATE_WARN . $cur_template;
} else {
if( $_SERVER['SERVER_PORT'] == 443 || @$_SERVER['HTTPS'] == 'on' ) {
$option = mosgetparam($_REQUEST, "option");
$page = mosgetparam($_REQUEST, "page");

if(@strstr($page, "account.") || @strstr($page, "checkout.") || @strstr($page, "shop.registration")){
$from_url = $mosConfig_live_site;
$to_url = str_replace("http:","https:",
$mosConfig_live_site);
ob_start();
require_once( 'templates/'. $cur_template .'/index.php' );
echo "";
$my_content = str_replace( "src=\"".URL, "src=\"".SECUREURL, ob_get_contents());
$my_content = str_replace( "src=".URL, "src=".SECUREURL, $my_content);
$my_content = str_replace( "url('".URL, "url('".SECUREURL, $my_content);
$my_content = str_replace( "url(".URL, "url(".SECUREURL, $my_content);
ob_end_clean();
echo $my_content;
}
else {
$to_url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
mosRedirect( $to_url );
}
}
else {
require_once( 'templates/'. $cur_template .'/index.php' );
echo "";
}
}

Bibliografía util:
http://www.netshinesoftware.com/security/using-an-ssl-certificate-with-your-joomla-website.html
http://www.joomlaspanish.org/foros/showthread.php?t=15108
http://www.adstudio.es/2008/02/20/poner-joomla-bajo-ssl/

jueves, 8 de mayo de 2008

Como configurar un servidor seguro con OpenSSL

Aqui os dejo un tutorial paso a paso que he hecho para configurar un servidor Apache con OpenSSL, crear una autoridad certificadora capaz de emitir certificados y generar certificados tanto para el servidor como para los clientes. Espero que os quede claro:


1.- Instalar OpenSSl en el servidor (si no esta ya)

apt-get install openssl

2.- Crear la estructura de directorios que necesitamos (yo lo he hecho en /home/ pero eso depende del servidor. Como es en local, donde queramos)

mkdir ca ca/private ca/certs ca/conf

3.- Para tener un numero de serie que controle el numero de certificados emitimos

cd /ca
echo '01' > serial
touch index.txt

(Posteriormente declararemos index.txt como nuestra base de datos de certificados)

4.- Crear la Autoridad certificadora

4.1.- Creamos el fichero de configuracion en ca/conf:
cd /ca/conf
gedit caconfig.cnf

4.2.- Copiamos esta estructura con nuestra informacion en caconfig.cnf:
(también podemos actualizar el que viene por defecto en el servidor como openssl.cnf para ahorrarnos escribir tanto) -> rellenarlo con nuestros datos


#…………………………….
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /home/ca
serial = $dir/serial
database = $dir/index.txt
new_certs_dir = $dir/certs
certificate = $dir/certs/cacert.pem
private_key = $dir/private/cakey.pem
default_days = 365
default_md = md5
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 1024 # Size of keys
default_keyfile = key.pem # name of generated keys
default_md = md5 # message digest algorithm
string_mask = nombstr # permitted characters
distinguished_name = req_distinguished_name
req_extensions = v3_req
[ req_distinguished_name ]
# Variable name Prompt string
#————————- ———————————-
0.organizationName = Organization Name (company)
organizationalUnitName = Organizational Unit Name (department, division)
emailAddress = Email Address
emailAddress_max = 40
localityName = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
commonName = Common Name (hostname, IP, or your name)
commonName_max = 64
# Default values for the above, for consistency and less typing.
# Variable name Value
#———————— ——————————
0.organizationName_default = My Organization
localityName_default = NEW YORK
stateOrProvinceName_default = NEW YORK
countryName_default = US
emailAddress_default = email@mydomain.net
[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
[ v3_req ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash

5.- Generar la clave de la AC y su certificado raiz.
OJO este paso es importante: aqui se nos pedira informacion del nombre de la CA y tiene que ser siempre igual para todos los certificados, asi que hay que ponerse de acuerdo a la hora de escribirlo y ademas hay que pensar una frase generadora de la clave que sea larga y dificililla.

openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out certs/cacert.pem -days 365 -config conf/caconfig.cnf

Esto genera un certificado valido por 365 dias que se llama cacert.pem en la carpeta "certs" y una clave privada RSA cakey.pem que se guarda en el directorio "private"

6.- Crear el certificado del servidor cliente

Aqui creamos una clave privada como cliente y una petición de firma para la CA. Aquí tenemos que poner el nombre del servidor, que sera www.miTiendaChunga.com o el que sea.

6.1.- Nos vamos a nuestro directorio

cd /home/ca

6.2.- Lanzamos el comando de petición de certificado a la CA

openssl req -new -nodes -out certs/localhost.req.pem -keyout private/localhost.key.pem -config conf/caconfig.cnf

Y esto genera la clave en "private" y la peticion del certificado en "certs"

6.3.- Ahora, como CA, firmamos el certificado (motivos de seguridad) y generamos el certificado definitivo, actualizando la base de datos de certificados

openssl ca -in localhost.req.pem -notext -out certs/localhost.cert -config conf/caconfig.cnf

[A partir de aquí ya no es realmente necesario]
8.- Los certificados generados tienen la extension .pem. Para que sean mas manejables y compatibles con los navegadores deberian tener la extension .crt, asi que los cambiamos:

cd /home/ca

rename 's/\.pem/\.crt/' *

9.- A la hora de la implementacion real en el servidor, habria que llevar los certificados y claves a las carpetas correctas, ssl.key y ssl.crt y actualizar el fichero de configuracion del servidor, que debe acabar con algo asi como "ssl.conf". En caso de estar usando Lampp, está en /opt/lampp/etc/extra/httpd-ssl.conf. Esto es necesarios -> la creacion de un servidor virtual.
Habria que escribir algo asi: (esto es solo un ejemplo) [la ip del localhost es 127.0.0.1 pero una real seria de la forma 192.168.1.1]
NameVirtualHost *:443 #para que se active cuando se acceda por el puerto seguro

DocumentRoot /var/www/html
ServerName 127.0.0.1
ServerAdmin someone@your.domain

ErrorLog /etc/httpd/logs/ssl_error_log
TransferLog /etc/httpd/logs/ssl_access_log
SSLEngine On
SSLCertificateFile /opt/lampp/etc/ssl.crt/miCertificadoDelServidor.crt
SSLCertificateKeyFile /opt/lampp/etc/ssl.key/miClaveDelServidor.key

Ojo: Hay que reiniciar el servidor (/opt/lampp/lampp restart ) despues modificar los ficheros de configuracion

Nota: es MUY!!! importante comprobar que en un documento de configuracion existe una linea que ponga "Listen 443". Si no, debemos añadirla

Aqui hay un truco bastante importante que puede servirnos para redireccionar una url accedida como http a un https. Yo lo he probado y funciona:

Escribimos en la pagina, en vez de todo el html que contuviera, las siguientes lineas en la cabecera:

[Entre las etiquetas de apertura y cierre html]

MENOR_QUE
meta http-equiv="refresh" content="0;url=https://localhost/web_prueba/contacto_seguro.html"
MAYOR_QUE

(lo escribo así porque blogger no me deja escribir html:
MENOR_QUE es "<" y MAYOR_QUE es ">"
)


Y esto nos redirecciona a la web segura, que contiene todo el codigo html que tenia el anterior, pero emitiendo nuestro certificado.


Otra cosa interesante es (cito literalmente de http://www.linuxtotal.com.mx/ssl_apache.html):

"Si quieres evitar que a tus clientes cada vez que ingresen a tu sitio salga el molesto diálogo que pide aceptar el certificado, la única solución es que distribuyas el archivo cacert.pem, recuerda que este archivo es el que te identifica como una autoridad certificadora. Lo puedes poner a descarga desde tu propio sitio, o mandarlo por correo, como sea. Cuando el cliente lo tenga en su equipo deberá importarlo dentro del browser o navegador. Todos los navegadores en sus preferencias o herramientas tienen una opción de certificados y desde ahí existe un botón importar para realizar esto."


[Informacion extraida y traducida de
http://codeghar.wordpress.com/2008/03/17/create-a-certificate-authority-and-certificates-with-openssl/
http://www.flatmtn.com/article/setting-openssl-create-certificates#SSLCert-8
http://www.eclectica.ca//howto/ssl-cert-howto.php
https://help.ubuntu.com/7.10/server/C/httpd.html#https-configuration
http://www.linuxtotal.com.mx/ssl_apache.html
]


Espero que te haya sido util. Si te ha gustado, deja un comentario
Un saludo

lunes, 21 de abril de 2008

Introducción a los certificados digitales

Qué son:

Un certificado digital es un documento que contiene una clave pública del usuario, un identificador y los datos personales del usuario.

El documento está firmado digitalmente por una autoridad certificadora (Certification Authority, CA)

Para qué se usan:

Un certificado sirve para que el usuario pueda realizar tareas que requieran seguridad y confidencialidad.

Al estar firmado el ciertificado por una autoridad de confianza (una CA), confirma a terceros (por ejemplo los navegadores web) su validez y demuestra que las claves pertenecen a ese usuario.

Quién los emite:

Cualquiera puede emitir un certificado digital, pero deben estar firmados digitalemente por una CA.

Qué información contienen:

El certificado digital contiene una serie de campos contenidos como fichero .cert:

Algoritmo de cifrado y resumen
Clave pública del usuario
Información personal del usuario
Periodo de validez
Información del CA emisor
Firma digital del emisor, que valida el enlace entre la clave pública y la identificación de usuario (es la forma que tiene el CA de decir "tío, te juro que esta clave es de Paco").
Usos permitidos, es decir, para qué se puede usar el certificado.

Claves privadas:

Cuando un usuario instala un certificado (como fichero .pfx) en un navegador, almacena la clave privada en su ordenador.


Pasos que se dan en un sistema seguro:

1.- Al darse de alta en el sistema, se le envía al usuario un .pfx con su certificado y su clave privada. Esto se hace como CA

2.- Cada vez que hagas login o una compra hay un intercambio de certificados (ficheros .cert sin clave privada, sólo con la clave pública y la información de usuario), en el que el sistema al que te conectas como usuario te demuestra que realmente es el sistema que afirma ser, y el sistema a continuación te pide tu certificado para saber que eres realmente quien afirmas ser, validándose así la identidad de ambos para evitar los problemas de la suplantación, así como evitar el repudio, ya que es prueba de que ambos han enviado o recibido la información.



nota: podéis examinar el contenido de un certificado accediendo a un sitio seguro como éste y haciendo clic en examinar el certificado.

Espero que os haya servido. Si os a gustado dejad un comentario

Un saludo

Cómo funciona la firma digital RSA

¿Para qué sirve?

Sirve para enviar mensajes no necesariamente secretos sin que nadie los pueda modificar.

En la situación en que A quiere enviar un mensaje a B, A tiene una clave pública de dos valores (e y n) y una clave privada (d)


¿Qué pasos se dan?

1.- A hace un resumen (r) del mensaje con una función resumen (por ejemplo MD5 o SHA1)

2.- La firma digital (f) será la codificación del resumen con su clave privada:

f = r^d, mod n

3.- A envía el mensaje junto con la firma f.

4.- B, el receptor, resume el mensaje con la misma función resumen que A, obteniendo r'

5.- B compara: cifra la firma (f) con la pública de A y debe obtener su r'

[f ^e, mod n] debe ser igual a r'

Si son iguales, se puede afirmar que nadie ha modificado el mensaje que A envió.


Espero que os sirva.

Si os ha servido dejad un comentario


Un saludo