Esta es una herramienta de registro de QSO basada en el shell-script, basada en la web.
Cuenta:
El control de acceso es proporcionado por el archivo de política .htaccess al archivo CGI registra.cgi , que en realidad escribe los nuevos registros.
La herramienta Cannonical de ARRL's Logbook of the World (LOTW) para manejar contactos es la herramienta TQSL. Si bien TQSL es de código abierto, no me gustaba exactamente la idea de usarla para interactuar con mi sistema de registro, es una herramienta poderosa con varias otras funcionalidades adicionales (que no estaba interesado por registrar el bien) y quería algo súper delgado y directo, por lo tanto, me moví a mi propia implementación de TQSL. En la implementación de mi TQSL, el objetivo principal es iniciar sesión automáticamente para Lotw todos mis contactos en el momento del QSO, sin tener instalado TQSL.
Su certificado se encuentra en un archivo .tq6 , que es un archivo gzip'ed que contiene la cadena de confianza del certificado, desde la CA hasta su certificado (en la cláusula <usercert> ) y el esquema TQSL para entidades, modos, etc.
[rfreire@rf rpmbuild]$ file lotw.tq6
lotw.tq6: gzip compressed data, from Unix
[rfreire@rf rpmbuild]$ gunzip -S .tq6 lotw.tq6
<?xml version="1.0" encoding="UTF-8" ?>
<tqsldata>
<tqslcerts>
<rootcert>-----BEGIN CERTIFICATE-----
[...]
Al usar su utilidad TQSL, puede exportar un archivo .p12 que contiene una clave de firma. En el certificado de indicador de llamadas, use la opción Save the callsign certificate for <YOUR CALLSIGN> .
Primero, extraiga su certificado de usuario del archivo .p12 , es el primer certificado en la cadena y guárdelo a lotw-<callsign>.cer
[rfreire@rf rpmbuild]$ openssl pkcs12 -info -in lotw.p12
Enter Import Password:
MAC Iteration 2048
MAC verified OK
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
Bag Attributes
localKeyID: CC AC 6E 08 94 09 6E 7E B7 5B 2E 90 1A 24 2E CE 10 07 35 5D
friendlyName: TrustedQSL user certificate
subject=/1.3.6.1.4.1.12348.1.1=PY2RAF/CN=Rodrigo A B Freire/[email protected]
issuer=/C=US/ST=CT/L=Newington/O=American Radio Relay League/OU=Logbook of the World/CN=Logbook of the World Production CA/DC=arrl.org/[email protected]
-----BEGIN CERTIFICATE-----
MIIEtTCCA52gAwIBAgIDBw2TMA0GCSqGSIb3DQEBCwUAMIHYMQswCQYDVQQGEwJV
UzELMAkGA1UECAwCQ1QxEjAQBgNVBAcMCU5ld2luZ3RvbjEkMCIGA1UECgwbQW1l
[...]
Y ahora, obtenga la clave privada para poder firmar contenido utilizando este certificado. Déle una contraseña en el paso Enter PEM pass phrase , de lo contrario, fallará miserablemente que se queja de la falta de una contraseña. Guárdelo como lotw-<callsign>.key
[rfreire@rf rpmbuild]$ openssl pkcs12 -in lotw.p12 -nocerts -out lotw-<callsign>.key
Enter Import Password:
MAC verified OK
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Ahora, ha obtenido todo lo que necesita para firmar los contactos.
El archivo .tq8 en realidad contiene los contactos que se cargarán en el LOTW. Es un archivo comprimido por GZIP y con una estructura característica que compartiré a continuación. No entrará en detalles, ya que los detalles son prácticamente autodescritos.
Los aspectos más destacados del archivo tq8 son:
La información de contacto. A saber:
[rfreire@rf rpmbuild]$ file py2raf.tq8
py2raf.tq8: gzip compressed data, was "py2raf", from Unix, last modified: Tue Dec 31 13:27:43 2019
[rfreire@rf rpmbuild]$ gunzip -S .tq8 py2raf.tq8
[rfreire@rf rpmbuild]$ cat py2raf
<TQSL_IDENT:53>TQSL V2.5.1 Lib: V2.5 Config: V11.9 AllowDupes: false
<Rec_Type:5>tCERT
<CERT_UID:1>1
<CERTIFICATE:1638>MIIEtTCCA52gAwIBAgIDBw2TMA0GCSqGSIb3DQEBCwUAMIHYMQswCQYDVQQGEwJV
UzELMAkGA1UECAwCQ1QxEjAQBgNVBAcMCU5ld2luZ3RvbjEkMCIGA1UECgwbQW1l
[...]
zQf9UWPErprv
<eor>
<Rec_Type:8>tSTATION
<STATION_UID:1>1
<CERT_UID:1>1
<CALL:6>PY2RAF
<DXCC:3>108
<GRIDSQUARE:6>GG66gm
<ITUZ:2>15
<CQZ:2>11
<eor>
<Rec_Type:8>tCONTACT
<STATION_UID:1>1
<CALL:5>PY2XX
<BAND:4>70CM
<MODE:3>FAX
<FREQ:7>439.480
<QSO_DATE:10>2019-12-31
<QSO_TIME:9>10:00:00Z
<SIGN_LOTW_V2.0:175:6>cLO9toAVzpzhDjMlMuJHAS7z6Tjpq95U0yvpd2qawz7tIrUG6jXUq9RHy4yuZd2x
kwDIkIyjv6iMevwDfFeETP0XjHQziRiUC1Ol6YnCBl3GWQAX05Y8OxEpUx0fy6Tu
8osQlV7rJ0YtvNmhPc/Fz7w79JdXqM2KVIxyUsy6tzM=
<SIGNDATA:48>11GG66GM1570CMPY2XX439.480FAX2019-12-3110:00:00Z
<eor>
Los datos a firmar se definen en el siguiente orden, sin espacios:
Después de construir la cadena para ser hash/firmada, luego firme con su clave. Vea la siguiente muestra:
$ echo $STRING-TO-BE-SIGNED | openssl dgst -sha1 -sign lotw-py2raf.key -passin 'pass:<password>' | base64
Pronto. Ahora ha preparado el contenido firmado y el último paso es construir el archivo que contiene todos los campos requeridos, compactos y cargarlo en LOTW.
Ver el siguiente curl de muestra
$ curl -F '[email protected]' https://lotw.arrl.org/lotw/upload
Ahora emite registro a SQLite también. Esquema:
CREATE TABLE contacts (
serial INTEGER PRIMARY KEY,
qrg REAL,
callsign TEXT,
op TEXT,
qtr INTEGER,
mode TEXT,
power INTEGER,
propagation TEXT,
sighis INTEGER,
sigmy INTEGER,
qth TEXT,
obs TEXT );
Esquema QSL:
CREATE TABLE qsl (
callsign TEXT,
method TEXT,
date INTEGER,
via TEXT,
type TEXT,
xo BOOLEAN );
Advertencia: su usuario web debe tener permiso de lectura/escritura no solo para el archivo SQLite, sino también para su directorio SQLite, de lo contrario, arrojará un acceso denegado.
Formulario de registro de py2raf
Lista de Py2Raf QSO