viernes, 11 de octubre de 2019

Crear almacen de certificados KeyStore con Keytool

Para crear un almacen de certificados tipo jks se ejecuta lo siguiente con keytool:

{jdk.path}/bin/keytool -genkey -alias {nameAlias} -keyalg RSA -keystore {path.to.file}/fileName.jks
Introduzca la contraseña del almacén de claves:
Volver a escribir la contraseña nueva:
¿Cuáles son su nombre y su apellido?
  [Unknown]:
¿Cuál es el nombre de su unidad de organización?
  [Unknown]:
¿Cuál es el nombre de su organización?
  [Unknown]:
¿Cuál es el nombre de su ciudad o localidad?
  [Unknown]:
¿Cuál es el nombre de su estado o provincia?
  [Unknown]:
¿Cuál es el código de país de dos letras de la unidad?
  [Unknown]:
¿Es correcto CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown?
  [no]:  si

Solicitará una constraseña que es para acceder al almacen de certificados, distribuciones java por defecto establecen la contraseña changeit.

Crear almacen con formato PKCS12. Se agrega la opcion -storetype

{jdk.path}/bin/keytool.exe -genkey -alias {nameAlias} -keyalg RSA -storetype pkcs12 -keystore {path.to.file}/fileName.p12
Introduzca la contraseña del almacén de claves:
Volver a escribir la contraseña nueva:
¿Cuáles son su nombre y su apellido?
  [Unknown]:
¿Cuál es el nombre de su unidad de organización?
  [Unknown]:
¿Cuál es el nombre de su organización?
  [Unknown]:
¿Cuál es el nombre de su ciudad o localidad?
  [Unknown]:
¿Cuál es el nombre de su estado o provincia?
  [Unknown]:
¿Cuál es el código de país de dos letras de la unidad?
  [Unknown]:
¿Es correcto CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown?
  [no]:  si

miércoles, 17 de abril de 2019

Notas Docker

Chuleta para docker

Listar todos los contenedores

docker ps -a

Iniciar un contenedor

docker start idContenedor

Iniciar session se se delaro iterativo un contenedor

docker attach idContenedor


martes, 9 de abril de 2019

Certificados en java SSLHandshakeException ValidatorException: PKIX path

Una exepcion común en java sobre todo cuando se implementa codigo que realiza peticiones GET, POST, etc.. a un servidor es la siguiente:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Comunmente esta excepcion se logea cuando la JVM no tiene registrado el certificado en su "cacert", para palear esta exception seguir los siguientes pasos:

1)En el navegador pegar la url a la que se intenta acceder o alguna parecida, lo importante es el host del server por ejemplo https://www.dominio1.com/opcion1/opcion2

2)El navegador es posible que muestre algunas notificaciones diciendo si se quiere confiar en dicho host y que se agrega un certificado, aceptamos todo.

3)Importar el certificado desde el navegador a un fichero.
En firefox escribimos lo siguiente en la barra de navegacion "about:preferences#privacy"
Buscamos la seccion "Certificados" y presionamos en "Ver certificados". Buscamos el certificado referente al dominio "dominio1" y lo exportamos como fichero .crt a una ruta conocida.

4)Desde linea de comandos ejecutamos keytool, keytool es un comando que esta en la ruta de la JVM
"{JVMPath}/bin/" si teneis dado de alta java en el PATH del sistema os deberia de pillar sin problema, si no ir directamente a la ruta donde teneis instalado java a la carpeta bin.

4.1) se ejecuta "keytool -alias unAliasDominio1 -import -keystore {JVMPath}/lib/security/cacerts -file C:\ruta1\ruta2\certificados\dominio1Certificado.crt"

4.2)Os pedira el password del keystore "Enter keystore password:" por defecto es "changeit" sin las comillas (si lo habeis cambiado mal asunto).
"Introduzca la contraseña del almacén de claves:"

{JVMPath} Es la ruta donde tenies instalado java por ejemplo "C:\java\jdk-11.0.2"

4.3) Confirmar la confianza en este certificado
"¿Confiar en este certificado? [no]:  si"


miércoles, 9 de enero de 2019

Recopilatorio de Bash y comandos Linux

COMANDOS
Crear varios directorios a la vez
mkdir -p /opt/folder1/folder2/folder3

Copiar el rsa key del host1 al host2 para no proporcionar la passwor del "usuario" cada vez que se realiza una conexion ssh del host1 al host2
[user@hots1]$ ssh-copy-id -i /home/user/.ssh/id_rsa.pub user@host2

Generar el id_rsa.pub
ssh_keygen


Editor VI
:set number -> muestra el numero de linea en el editor

-------------

:set fileformat=unix
:set fileformat=dos

Aplica el formato unix o dos al fichero actualmente abierto, muy util cuando se muestra el error
Not found #!/bin/bash^M

----------
:set list
Muestra los caracters ocultos en el archivo abierto

BASH
Ejemplo de for 1:
Los espacion son IMPORTANTES.

actions=(opcion1 opcion2 opcion3)
for item in ${actions[@]}; do
  echo "Action: ${item}"
done

Ejemplo for 2:
  for (( a=1; a < 80; a++ )); do
    echo "Iteration ${a}"
  done

IF

Igualar cadenas:Los espacios son IMPORTANTES

 _APP=opcion5
if [[ $_APP = "opcion1" ]]
  then
    echo "opcion 1"
  elif  [[ $_APP = "opcion2" ]]
  then
    echo "opcion 2"
  else
    echo "No es ninguna opcion"
  fi

Doble condicion:
$var
if [[ $var = *"value1"* || $var = *"value2"* ]]
then
  echo "var contiene value1 o value2 "
fi


Existe el directorio:

if [ -d /path/dir1/dir2 ]
then
  echo "Directorio existe"
else
  echo "Directorio NO existe"
fi

Fichero existe:

if [ -f /path/dir1/dir2 ]
then
  echo "Fichero existe"
else
  echo "Fichero NO existe"
fi


Ejemplo case :

typeVar=Z
case $typeVar in
  A)
    echo "opcion A"
  ;;
  B)
    echo "opcion B"
  ;;
  C)
    echo "opcion C"
  ;;
  D)
    echo "opcion D"
  ;;
  *)
    echo "opcion no definida"
  ;;
esac

Ejemplo obtener el PID del script en ejecucion y el pid de invocaciones dentro del mainPID
#!/bin/bash

myFunction(){
  for (( a=1; a<10; a++ )); do
    echo "myFunction iteration ${a}"
    sleep 3
  done
}

myFunction &
myFuncPid=$!
mainPid=$$

for (( a=1; a<10; a++ )); do
  echo "mainPID ${mainPid} funcPid ${myFuncPid} iteration ${a}"
  sleep 5
done





viernes, 13 de noviembre de 2015

Comando WGET funciona y CURL NO :`(

Hace poco tuve que obtener el descriptor de un webservice (wsdl) con autentificación por certificado, pero lo raro es que con wget funcionaba y con curl no!!!!!!!!!!!!! porque!!!!!!!!
Esto era porque el formato de la clave privada del certificado (.PEM) tenia el encabezado
-----BEGIN ENCRYPTED PRIVATE KEY-----

Y al parecer curl no entendía este encabezado y por eso siempre obtenía el error:

curl: (58) Unable to load client cert -8018.

Bueno ademas si no das correctamente la ubicación del certificado puede darte el error:

curl: (35) NSS: client certificate not found: certificado.pem

No basta cambiarle el encabezado directo a mano, hay que generar correctamente la llave primaria, para eso ejecutamos:

openssl rsa -in certificado.pem -out private.key
Enter pass phrase for localhost.wget.pem:

Luego pide la frase mágica, que debemos introducir y se genera el fichero private.key con el encabezado:
-----BEGIN RSA PRIVATE KEY-----
.
.
-----END RSA PRIVATE KEY-----

Esta llave la remplazamos en el fichero certificado.pem y ejecutamos:

curl -k --cert ./certificado.curl.pem https://host:1000/webService?wsdl

Ahora ya no pide la "palabra magica" y obtiene el descriptor del servicio. tomar en cuenta que certificado.curl.pem es el fichero de certificado PEM y "./" es para que lo obtenga de la ubicación actual.


viernes, 26 de diciembre de 2014

Raspberrypi B+ Disco duro 2T no lee

Y estas navidades una raspberry pi B+-

La raspberry pi B+ proporciona una corriende de 600mA en los puertos USB, por seguridad lo que causa problemas al enchufar perifericos que requieren una alimentación mayor, en mi caso un disco duro de 2TB que requiere 1A y 5V.

Para aumentar la corriende a 1A en los puertos USB, se edita el fichero /boot/config.txt en el sistema operativo que hayas intalado en tu SD, yo instale raspbmc, entonces te conectar por ssh a la raspeberry y editas ese fichero.

1)Iniciar raspberry sin conectar el disco duro.

2)Conseguir la ip de la raspberry. En raspmbc settings>system

3)Conectar via ssh a la raspberry. En raspmbc usuario:pi password:raspberry
  ssh pi@192.162.0.18

4) editar el fichero con vi.
sudo vi /boot/config.txt

5)Agregar 2 lineas al final del fichero
max_usb_current=1
safe_mide_gpio=4

6)Guardar los cambios, wq!

7)Reiniciar la raspberry y conectar el disco duro.

El disco duro sin estos cambios trataba de ser montado en el sistema, pero se queda infinitamente haciendo un ruido como de lectura en el disco y no se montaba nada nunca, y eso provoca que se quedara colgado el SO.


martes, 9 de diciembre de 2014

Enviar mensajes a cola

Holas!!!!!!!!!!!!!! Pues eso, ahora un quick code pare enviar mensaje a Colas, version para WebsphereMQ y ActiveMQ.

El marrón de WebsphereMQ es que hay que tener sus librerías que si lo tienes instalado las puedes pillar de donde lo hayas instalado o si no buscar arduamente en la red que estarán colgadas seguramente por algún lugar.

package com.myutils.services;

import javax.jms.Connection;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.log4j.Logger;

import com.ibm.mq.jms.MQConnectionFactory;
import com.ibm.mq.jms.MQQueue;
import com.ibm.msg.client.wmq.WMQConstants;

public class WebsphereMQService {

private static Logger log4j = Logger.getLogger(WebsphereMQService.class);

public void enviarMessage(String txtMsg){
try{
MQConnectionFactory mq = new MQConnectionFactory();
mq.setTransportType(1);//Se envia como cliente
mq.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
mq.setHostName("SERVIDOR_MQ");//Proporcionado por server
mq.setPort(1616);//Esto puede cambiar, proporcionado por server
mq.setChannel("NOMBRE.CANAL");//Proporcionado por server
mq.setQueueManager("QUEUE.MNG");//Proporcionado por server
Connection c = mq.createConnection("usuario", "password");
MQQueue q = new MQQueue("NOMBRE.QUEUE");//Nombre cola, proporcionado por server
   Session s = c.createSession(false, Session.AUTO_ACKNOWLEDGE);
   MessageProducer producer = s.createProducer(q);
   TextMessage message = s.createTextMessage(txtMsg.trim());
   producer.send(message);
   c.close();
}catch(Exception e){
log4j.error("Exception:", e);
}
}

}

//Proporcionado por server: son datos que nos deben de dar para conexión.


Y ahora para Active MQ.


package com.myutils.services;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.log4j.Logger;

public class ActiveMQService {

private static Logger log4j = Logger.getLogger(ActiveMQService.class);

/**
* Envia mensaje
* @param xml
* @throws BusinessException
*/
public void enviarMensaje(StringBuilder xml, String qName){
try{
ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");//Servidor
   Connection conn = cf.createConnection();
   conn.start();
   Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
   Destination destination = session.createQueue(qName);//Nombre de cola
   MessageProducer producer = session.createProducer(destination);
   TextMessage message = session.createTextMessage(xml.toString());//Mensaje a enviar
   producer.send(message);
   conn.close();
}catch(Exception e){
log4j.error("Exception.", e);
}
}

}



Esto debería de funcionar y si no ......