Tips (PHP): Escribir en la sesión de otro usuario
Mientras desarrollaba una nueva funcionalidad para el framework PHP en el que estoy trabajando, me encontré con la necesidad de realizar una acción no muy común: escribir valores en la sesión de otro usuario.

Como todo desarrollador PHP sabe (o debería...), es posible almacenar valores que persisten entre requests en una misma sesión, utilizando el arreglo súper global $_SESSION. Cada sesión se asocia a un usuario, por lo que los valores almacenados para un dado usuario son accesibles sólo para él. Ahora, y si desde la sesión de un usuario, deseamos acceder valores de la sesión de otro usuario?
Muchos se preguntarán, para qué querría hacer esto? Bueno, en mi caso particular me sirvió para actualizar la configuración de un usuario desde un usuario administrador, sin la necesidad que el primero se loguee nuevamente para ver los cambios. Por ejemplo, si un usuario administrador A cambia el theme de un usuario B que ya está logueado, quiero que B vea los cambios al instante. Podría hacer esto mismo almacenando un valor en la base de datos y chequeando desde la sesión de B el registro en cada acceso, pero esto me pareció muy ineficiente. Mi solución fue escribir un flag en el arreglo de sesión de B, y luego desde B chequear el valor en el arreglo para ver si hay cambios.
Como me resultó una funcionalidad interesante, decidí compartirla.

Para que el siguiente código funcione, es necesario almacenar los IDs de sesión de cada usuario logueado. Lo pueden hacer guardando los IDs en una tabla cada vez que un usuario se loguea en el sistema. Asumo que la función "get_user_session_id($user)" ya está implementada y me permite obtener el ID del usuario que le envío por parámetro; cada uno verá como almacenar y obtener el ID.
Traté de dejar el código lo más genérico posible, con lo que deberán cambiar sólo la línea que asigna el valor en la sesión del otro usuario, la cual marqué con el comentario "CAMBIAR AQUI!".
Espero que les resulte útil!

//guardar el session id actual para poder restaurarlo luego
$current_id = session_id();

if(($sid = user_get_session_id($user)) === FALSE)
{
  throw new Exception("user ID not found");
}

//guardar los valores de la sessión actual antes de cambiar de sessión
session_write_close();

//abrir la sessión del otro usuario
session_id($sid);
session_start();

//almacenar el valor deseado en la sessión del otro usuario
$_SESSION['some_value'] = $value;   // CAMBIAR AQUI!

//guardar los cambios hechos en la sessión del otro usuario
session_write_close();

//volver a la sessión del usuario actual
session_id($current_id);
session_start();
Shortcuts: comandos OpenSSL para generar claves, certificados y testear conexiones

OpenSSL es una herramienta extremadamente potente, la cual permite hacer todo tipo de manejos relacionados a TLS/SSL, desde creación de claves y certificados, realizar conexiones tipo telnet a servicios que se ejecutan sobre SSL, hasta generar hashes de archivos, entre otras cosas.
A continuación les dejo un listado de comandos útiles a realizar con OpenSSL. La mayoría se centran en la creación y manipulación de claves y certificados, algo que todo administrador ha tenido que hacer alguna vez.
Ya había escrito sobre la creación de certificados en el artículo Certificados Digitales, donde podrán encontrar una explicación más detallada sobre ello. En éste la idea es dejar un acceso rápido a comandos que nos serán muy útiles, además de proveer varios comandos adicionales a los descriptos anteriormente.
Cabe mencionar que muchos de estos comandos los aprendí gracias al artículo The Most Common OpenSSL Commands y los completé con el excelente OpenSSL Command-Line HOWTO y Creating an SSL Certificate of Authority.


Claves

Generar clave RSA de 4096 bits encriptada con 3des:
  $ openssl genrsa -des3 -out superkey.key 4096

Desencriptar la clave privada
  $ openssl rsa -in superkey.key -out super-decrypted.key

Extraer la clave privada de un archivo en formato PKCS#12:
  $ openssl pkcs12 -in certificad.pfx -out clave.pem -nodes -nocerts

Verificar clave RSA:
  $ openssl rsa -in interbankingtestmil-open.pkcs -check

 
Convertir formatos

Convertir clave de formato tradicional a pkcs8:
  $ openssl pkcs8 -in key.pem -topk8 -out pkcskey.pkcs

Convertir un certificado PEM y una clave privada en un archivo formato PKCS#12 (.pfx o p12)
  $ openssl pkcs12 -export -out certificado.pfx -inkey clave.pem -in certificado.crt -certfile certificadoCA.crt
 
 
Certificados

Crear una CA Propia con validez de 10 años y clave RSA de 4096 bits:
  $ openssl req -new -x509 -days 3650 -extensions v3_ca -newkey rsa:4096 -keyout private/newca.pem -out newca.crt //-config /etc/ssl/openssl.cnf

Generar un request de certificado:
  $ openssl req -new -key superkey.key -out certrequest.csr

Autofirmar request de certificado (CSR):
  $ openssl x509 -req -days 3650 -in cert-request.csr -signkey ca.key -out certificado.crt
 
Firmar request con CA:
  $ openssl ca -in cert-request.csr -out certificado.crt -days 3650

Crear clave y certificado autofirmado en un solo paso:
  $ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt

Extraer el certificado incluído en un contenedor PKCS#12:
  $ openssl pkcs12 -in certificad.pfx -out certificado.crt -nodes -nokeys

Ver los campos de un request de certificado:
  $ openssl req -noout -text -in certrequest.csr

Ver campos del certificado:
  $ openssl x509 -in certificado.crt -text -noout
 
Ver campos de un contenedor PKCS#12:
  $ openssl pkcs12 -info -in certificado.pfx


Otras utilidades

Conectar a un servicio que se ejecuta sobre SSL (por ejemplo HTTPS):
  $ openssl s_client -connect servidor:443

Calcular el hash MD5, SHA1, SHA2, etc de un archivo y de un texto
  $ openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] archivo
  $ echo "texto" | openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1]