miércoles, 27 de mayo de 2020

Putty: Copiar y pegar en Putty de Linux. Problema: PuTTY: unable to load font "server:fixed"

1. Copia y pega


Según Capy:

1. Con el ratón seleccionamos el texto a copiar (dentro de la ventana de putty)
2. Nos vamos a la aplicación donde queramos copiar y apretamos la rueda que está en el botón central y se pega.
3. También podemos pegar a putty desde otra aplicación, apretando la rueda.

Muuuuuuuuuuuuuuuy útil.

2. PuTTY: unable to load font "server:fixed"


Para cada uno de los servidores:
  • Ir a Category: Session
  • Marcar con el boton izquierdo del raton (sobre el nombre del servidor)
  • Apretar el boton Load
  • En Category:Fonts
  • Apretar el boton Change ... de "Font used for ordinary text"
Y seleccionar la fuente que se muestra junto con el tamaño y darle al boton OK

Le damos al boton Open y a funcionar








Ubuntu Server. Definir IP estática

Cuando se copian máquinas virtuales de Ubuntu Server 18.04, parece ser que la configuración de la dirección IP ya no se puede cambiar por el entorno gráfico, ya que cuando se reinicia se pierde la configuración de la IP.

Para ello he tenido que recurrir al blog de Gorka Izquierdo.

En resumidas cuentas hay que hacer lo siguiente:

1. Buscar en /etc/netplan un fichero que termine en .yaml

En mi caso se llama 50-cloud-init.yaml. su contenido es:

    ethernets:
        ens192:                        # verificar nombre arjeta de red con ifconfig   
            addresses:
                - 192.168.28.201/24    # IP estática a asignar
            gateway4: 192.168.28.100   # IP del gateway o puerta de enlace
            nameservers:
                addresses:
                    - 192.168.28.207   # IPs de los DNS
                    - 192.168.28.210
                search:
                    - mi.dominio
    version: 2


2. Ejecutar ifconfig para obtener el nombre de la tarjeta de red

Obtenenos el nombre de nuestra tarjeta de red, en este caso ens192


 ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.28.201  netmask 255.255.255.0  broadcast 192.168.28.255
        inet6 fe80::250:56ff:feb5:3a1e  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:b5:3a:1e  txqueuelen 1000  (Ethernet)
        RX packets 7950  bytes 580000 (580.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 371  bytes 46630 (46.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 842  bytes 218267 (218.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 842  bytes 218267 (218.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


3. Editar el fichero con el editor nano

Este editor funciona con putty y hay que darle el nombre de la tarjeta de red, y las IPs a asignarle al servidor, del gateway y de los DNS


4. Activar la configuración

Hay  que aplicar cambios y reiniciar la red para ello ejecutamos estos 2 comandos


netplan apply

systemctl restart networking

y ya está.

lunes, 25 de mayo de 2020

Certificados en java (1). Crear mi propia Autoridad de Certificados (CA)

Veamos los pasos a seguir (basándonos en Deliciousbrains)

1. Generar la clave privada


openssl genrsa -des3 -out myCA.key 2048

y nos sale esta ratahila solicitándonos una contraseña que por ejemplo damos  "mi-contraseña"


Generating RSA private key, 2048 bit long modulus (2 primes)
.......................................+++++
.................................................+++++
e is 65537 (0x010001)
Enter pass phrase for myCA.key:
Verifying - Enter pass phrase for myCA.key:

2. Generar el certificado raiz (Root certifcate)

openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem

(en vez de myCA.pem podríamos haber indicado myCA.crt)

y nos pide la contraseña

Enter pass phrase for myCA.key: 
Can't load /home/ximo/.rnd into RNG
140017841828288:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/home/eduard/.rnd
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Teruel
Locality Name (eg, city) []:Escorihuela
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Informatica Dantesca
Organizational Unit Name (eg, section) []:Informatica Dantesca
Common Name (e.g. server FQDN or YOUR name) []:Ximo Dante
Email Address []:ximodante@gmail.com

OJO con el CN (Common name), convien darle el nombre completo de la máquina con el dominio, como por ejemplo informatica.dantesca.es

Ya tenemos 2 ficheros:
  1. myCA.key (mi clave privada)
  2. myCA.pem (mi certificado raíz)

3. Instalar el certificado raiz en el keystore de Java

Solamente para que nuestro Java reconozca el certificado raiz, en mi caso me interesa para ser cliente de WS de un servidor que le vamos a instalar un certificado nuestro.

Veamos donde tenemos el Java instalado:

sudo update-alternatives --config java

y observamos que tenemos 2 versiones de Java y conviene actualizarlo en los 2 keystores

  Selecció    Camí                                           Prioritat  Estat
------------------------------------------------------------
* 0            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      mode automàtic
  1            /usr/java/jdk-13.0.2/bin/java                    1         mode manual

Para el java 8 hacemos:

/usr/lib/jvm/java-8-openjdk-amd64/bin/keytool -import -trustcacerts -alias RootCert -file myCA.pem -storepass changeit -keystore /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts

y nos contesta:

Owner: EMAILADDRESS=ximodante@gamil.com, CN=Ximo Dante, OU=Informatica Dantesca, O=Informatica Dantesca, L=Escorihuela, ST=Teruel, C=ES
Issuer: EMAILADDRESS=ximodante@gamil.com, CN=Ximo Dante, OU=Informatica Dantesca, O=Informatica Dantesca, L=Escorihuela, ST=Teruel, C=ES
Serial number: 2f70e1318bee92310bb278db98597b48bdd0575c
Valid from: Fri May 22 08:48:23 CEST 2020 until: Wed May 21 08:48:23 CEST 2025
Certificate fingerprints:
	 MD5:  A7:81:46:75:34:28:C1:73:DB:26:11:3B:A5:1C:44:8A
	 SHA1: E1:82:8C:A0:5A:97:9D:6D:A0:F9:08:B6:ED:4B:C6:38:39:AC:28:76
	 SHA256: D4:42:33:6A:B7:86:98:42:17:B3:0C:39:7D:2C:3E:7D:06:3D:89:6B:52:40:77:34:61:04:81:4A:0D:77:46:39
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3

Extensions: 

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: B0 E6 C3 22 E5 18 E6 10   AF 95 E2 AD 75 00 29 63  ..."........u.)c
0010: 64 A4 91 A7                                        d...
]
]

#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: B0 E6 C3 22 E5 18 E6 10   AF 95 E2 AD 75 00 29 63  ..."........u.)c
0010: 64 A4 91 A7                                        d...
]
]

Trust this certificate? [no]:  yes
Certificate was added to keystore

Y para el java 13

sudo /usr/java/jdk-13.0.2/bin/keytool -import -trustcacerts -alias RootCert -file myCA.pem -storepass changeit -keystore /usr/java/jdk-13.0.2/lib/security/cacerts

Y nos devuelve una ratahila parecida.

(para crear un jks desde cero (aunque no recomendable)
 keytool -keystore ximodante.jks -genkey -alias ximodante


4. Instalar el certificado raiz en Chrome

Vamos a Configuración - Privacidad y seguridad - Más V - Administra certificados - (Tab)Entidades emisoras - (Botón) Importa

Y nos situamos donde está el certificado.

5. Instalar el certificado raiz en Mozilla Firefox

Vamos a Prefencias - Privacidad y seguridad - Certificados - Muestra Certificados - Entidades -(Boon) Importar

Y nos situamos donde está el certificado.


6. Crear certificados firmados por nuestra entidad certificadora (CA)  

Primero, creamos una clave privada:

openssl genrsa -out ximo.dante.key 2048

y nos contesta

Generating RSA private key, 2048 bit long modulus (2 primes)
..............................................................+++++
..........................+++++
e is 65537 (0x010001)


Ahora generamos el CSR (Certificate Signing Request)


openssl req -new -key ximo.dante.key -out ximo.dante.csr

Nos pregunta lo mismo que al generar el certificado raiz, pero las contestaciones parece que no sirven para mucho, porqué es un CSR y no un certificado. De todas formas contestar lo más adecuadamente posible.

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Teruel
Locality Name (eg, city) []:Escorihuela
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Informatica Dantesca
Organizational Unit Name (eg, section) []:Informatica Dantesca
Common Name (e.g. server FQDN or YOUR name) []:ws.ximodante.es        
Email Address []:ximodante@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

OJO con el common name (CN) que debería de ser el nombre de la máquina.!!

Nos puede que hace falta también un fichero de configuración, pues necesitamos el SAN (Subject Alternative File). sinó no reconocerá al servidor de https. Le llamaremos ximo.dante.conf

NOTA: En la versión 3 del formato X509 podemos indicarle varios dominios a un certificado, con lo que parece ser que prodríamos utilizar un solo certificado par varias máquinas y ahorrarnos una pasta en caso de que compremos los certificados... Pero todo tiene su cara y su cruz, ya que si queremos convertir dicho certificado X509v3 al estándard PKCS12, APARENTEMENTE se pierde toda la información de los dominios alternativos. Por eso es muy importante colocar el nombre y dominio de la máquina en del CN (Common Name). Digo "aparentemente", pues si mostramos la información del certificado con " openssl -nokeys -info -in ximo.dante.p12 " NO MUESTRA LA INFORMACION DE LOS DOMINIOS ALTERNATIVOS... pero si lo instalamos en un tomcat y miramos el certificado con Firefox, SI QUE APARECEN !!!!

OJO: Para obtener cada una de las DNS, debemos hacer este comando:

nslookup 192.168.2.2

siendo 192.168.2.2 la dirección IP del servidor que queremos crear el certificado, y nos devuelve:

server.interno.ximodante.es  --> Dominio Interno
server.externo.ximodante.es  --> Dominio Externo

Ahora ya podemos ver el fichero de configuración para el caso de darle varios nombres y dominio de equipos. Esto puede ser útil cuando estamos en una DMZ y se tienen 2 dominios, uno por lo que las máquinas acceden entre si dentro de la DMZ y otro para las máquinas que estan fuera de este DMZ.

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = server.interno.ximodante.es
DNS.2 = server.externo.ximodante.es


Vamos a generar nuestro preciado certificado usando el CSR, la clave privada y certificado de Entidad Certificadora y el fichero de configuración.


openssl x509 -req -in ximo.dante.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out ximo.dante.crt -days 825 -sha256 -extfile ximo.dante.conf

 Y nos escribe en la consola datos del "subject".... 

Y ya tenemos el certificado.

Si queremos ver todos los detalles del certificado escribimos

openssl x509 -in ximo.dante.crt -text

 
7. Convertir el certificado X509 a PKCS12

Algunas veces, nos hace falta tener el certificado en formato PKCS12, con la ratahila de certificados raiz de la entidad certificadora... Pero todo tiene un pero en esta vida, si hacemos la conversión, PARECE FALSEMENTE que se pierde la información de los SAN o "nombre de máquina+ dominio" alternativos, y parece solo conserva la información de "máquina+dominio" del campo CN!!  PERO SI SE CONSERVA!!!


openssl pkcs12 -export -in ximo.dante.crt -inkey ximo.dante.key -out ximo.dante.p12 -name servercert -CAfile myCA.pem -caname root -chain

Y nos pide una contrasseña y que la verifiquemos

Si queremos ver el certificado, podemos comprobar que pierde gran parte de la información adicional que tiene la versión 3 del X509. Para ello ejecutamos el comando y le damos la contraseña que le hemos dado antes (mypassword) o si no le ponemos "-passin pass:", nos pedirá la contraseña al ejecutar el comando.


openssl pkcs12 -nokeys -info -in ximo.dante.p12 -passin pass:mypassword

No nos muestra los dominios alternativos SAN pero si instalamos el certificado en tomcat y vemos desde Firefox el certificado, SI QUE APARECEN los DNS alternativos.

8. Opcionalmente copiar el certificado a un jks

Veamos

keytool -importcert -alias ximo.dante -file ximo.dante.crt -keystore ximodante.jks

domingo, 3 de mayo de 2020

Utilizar Google Drive como lugar web

0. Introducción

Para hacer este post me he basado en este post.

Hay que cumplir una serie de requisitos:

  1. Solo se pueden servir ficheros html,css y javascript
  2. Por tanto no se puede servir ficheros Wordpress, ni java, ni php.
  3. Tampoco se pueden servir ficheros Typescript.
  4. Parece ser que con javascript no se puede acceder a manipular ficheros.
Estro es lo que hay.

1. Pasos a realizar
1. Botón derecho sobre la carpeta de google drive y "Compartir"(2a opción) y indicar a que todo el mundo puede ver (que no puedan actualizar)


2. Boton derecho sobre la carpeta de google drive otra vez y "obtener enlace para compartir" (3a opción) y con ello copia al portapapeles la url del enlace.

3. Vamos a la "drive to web" (drv.tw) y seleccionamos Google drive


4. Le damos la cuenta donde está el drive



5. Nos pide permiso para acceder a la cuenta 




6. Ahora nos da las direcciones que podemos acceder


Y ahora se prueba a entrar y se verifica.


sábado, 2 de mayo de 2020

Javascript aplicado(3). Nociones muuuuy elementales de Tone.js

0. Introcucción

Tone.js es una librería muy completa pero bastante durilla de entender si no estás en el mundillo del audio.

Veamos solo unas pequeñas indicaciones de utilización mínima.

1. Inicializar tone.js en una sola voz y tocar una nota

El objeto Tone.Synth nos permite crear música. En este caso, solo actua  un instrumento o voz:


//create a synth and connect it to the master output (your speakers)
var synth = new Tone.Synth().toMaster()

Y si queremos tocar una nota por ejemplo Do4 con una duración de una corchea (1/8 de redonca)


//play a middle 'C' for the duration of an 8th note
synth.triggerAttackRelease('C4', '8n')


2. Inicializar tone.js con polifonía y tocar un acorde

Vamos a crear un sintetizador polifónico de 6 voces máximo y a continuación tocaremos un acorde mayor de Do4 (Do4-Mi4-Sol4) de duración una negra (1/4 de redonda). En este caso estamos utilizando 3 de las 6 voces que tenemos.


//a polysynth composed of 6 Voices of Synth
var synth = new Tone.PolySynth(6, Tone.Synth).toMaster();
//set the attributes using the set interface
synth.set("detune", -1200); //?
//play a chord
synth.triggerAttackRelease(["C4", "E4", "G4"], "4n");


3. Tocar una nota y esperar un momento


Cuando tocamos una nota, la nota se ejecuta en un hilo de ejecución y simultáneamente la ejecución de la siguiente sentencia se ejecuta en otro hilo paralelo. Por tanto debemos utilizar la función window.setTimeout (funcion a ejecutar, tiempo de espera em ms, parametros de la función a ejecutar) donde la función a ejecutar es la continuación del programa.

Por ejemplo si queremos tocar 2 notas una a continuación de la otra.

//Toca una nota (note1) durante myDuration1 en ms
synth.triggerAttackRelease(note1, myDuration1/1000);

//Espera myDuration1 en ms a tocar la nota2  (note2) durante myDuration2 ms.
window.setTimeout(synth.triggerAttackRelease, myDuration1, note2, myDuration2/1000);


Existen otras maneras de tocar varias notas una a continuación de la otra, y hay que tener en cuenta la duración acumulada de las notas anteriores.


var synth = new Tone.FMSynth().toMaster()

//schedule a series of notes, one per second (although they ara actuve for 0.5 seconds)
//Note the last parameter that indicates the moment the note should be played!! So it must take into account the previous notes!
synth.triggerAttackRelease('C4', 0.5, 0)
synth.triggerAttackRelease('E4', 0.5, 1)
synth.triggerAttackRelease('G4', 0.5, 2)
synth.triggerAttackRelease('B4', 0.5, 3)