shell

Verify X509 Certificate

Written by  on September 8, 2017

Es ist nicht ausreichend nur den Private Key zu überprüfen!
OpenSSL bietet auch eine einfache Möglichkeit einen CSR zu prüfen:

openssl req -in example.csr -verify
verify OK

Beim Public Key wird es komplizierter. Einzig eine Prüfung mit der Signatur der übergeordneten CA hilft. Hier eine erste Version eines Prüfscriptes.

#!/bin/bash
if [[ $# -ne 1 ]]; then
  echo "Wrong number of arguments."
  exit 1
fi

FILE=$1

# Allows to configure different openssl version
OPENSSL=$(which openssl)
TEMPDIR="/tmp
USERAGENT="CustomUserAgent"
# A proxy server would also get configured here
WGETOPTS="--user-agent=${USERAGENT} --timeout=5 --tries=1 -e"

SIGNER=$($OPENSSL x509 -in ${FILE} -text -noout | grep "CA Issuers - URI:http" | cut -d":" -f2- | tr -d '\r')
if [[ -z $SIGNER ]]; then
  echo "No issuer certificate found for download."
  exit 1
fi
SIGNERFILE=$(awk -F'/' '{print $NF}' <<<$SIGNER)

/usr/bin/wget $WGETOPTS $SIGNER -O $TEMPDIR/$SIGNERFILE >/dev/null 2>&1

# Try to convert to PEM
$OPENSSL x509 -inform der -in $TEMPDIR/$SIGNERFILE -out $TEMPDIR/$SIGNERFILE.cer 2>/dev/null
if [[ -s $TEMPDIR/$SIGNERFILE.cer ]]; then
  # use converted file, if conversation was successfull
  SIGNERFILE="$SIGNERFILE.cer"
fi
echo -n "Certificate verification: "
$OPENSSL verify -CAfile $TEMPDIR/$SIGNERFILE -partial_chain $FILE 2>&1 | grep -e "certificate signature failure" -e "OK" | cut -d":" -f2

# Cleanup
if [[ ! -z $SIGNERFILE ]]; then
  /bin/rm $TEMPDIR/$SIGNERFILE*
fi

Pipe View

Written by  on August 17, 2017

Beobachten wie viele Daten durch eine Pipe in einem Shellscript durchgehen:

dd if=example.img bs=1M | pv | dd of=/dev/sdXX

Beispiel Output:

1.16GiB 0:09:37 [4.76MiB/s] [                                   <=>           ]

ROT13 bash

Written by  on April 23, 2017

Also auf die Idee bin ich noch nicht gekommen, einen ROT13 einfach mit ‚tr‘ zu erzeugen:

echo "Hallo Welt" | tr [a-zA-Z] [n-za-mN-ZA-M]
Unyyb Jryg
echo "Unyyb Jryg" | tr [a-zA-Z] [n-za-mN-ZA-M]
Hallo Welt

Powershell Stringverwendung

Written by  on April 10, 2017

Ein Script verhält sich anders auf Windows 2008 und Windows 2012? Scheinbar hat sich die Stringverarbeitung leicht verändert. Wo unter 2012 eine Variable aufgelöst wird, passiert das unter 2008 nicht:

Windows 2008 R2

$A="IchBinEineVariable"

echo "-p$A"
-pIchBinEineVariable

echo -p"$A"
-p"$A"

echo -p$A
-p$A

Windows 2012 R2

$A="IchBinEineVariable"

echo "-p$A"
-pIchBinEineVariable

echo -p"$A"
-pIchBinEineVariable

echo -p$A
-p$A

Powershell 32 Bit vs. 64 Bit

Written by  on März 21, 2017

Wenn einem Certutil.exe bei manchen Parametern mitteilt, dass manche Klassen nicht geladen werden könne, ist möglicherweise die 32 Bit vs. 64 Bit Problematik daran schuld.

C:\windows\System32\certutil.exe -view -restrict "Issued Common Name=<CN>, Disposition=20" -out "RequestID,RequesterName"  -config "<CAHostName>\<CAName>"
CertUtil: -view command FAILED: 0x80040154 (-2147221164)
CertUtil: Class not registered

Wie tritt das auf, wenn ich doch ein 64 Bit Betriebssystem habe? Und wie stelle ich fest, was ich für eine PowerShell am laufen habe?
Eine „normale“ PowerShell:

> [Environment]::Is64BitProcess
True

Die „gleiche“ PowerShell geöffnet in MobaXterm:

> [Environment]::Is64BitProcess
False

Erst Version 10 von MobaXterm soll das Problem beheben und auf 64 Bit Systemen die korrekte PowerShell öffnen.

Interessantes Detail am Rande, eine 64 Bit PowerShell liegt unter C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe ide 32 Bit Version ist zu finden unter C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe!

Aufräumen wenn ein Script abgebrochen wurde

Written by  on November 29, 2016
#!/bin/bash
TMPFILE1=$(mktemp /tmp/im1.XXXXXX)
TMPFILE2=$(mktemp /tmp/im2.XXXXXX)
trap "rm -f $TMPFILE1 $TMPFILE2; exit 1" INT
sleep 10

Frei nach How Linux Works, S. 264

OpenSSL STR_COPY variable has no value

Written by  on September 23, 2016

Openssl kann Shellvariablen im der Konfigurationsdatei verarbeiten. Kommt dabei eine Fehlermeldung wie

openssl.exe version
6870300:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:618:line 19

liegt das daran, dass die Shellvariable nicht definiert ist.
Eine leere Variable dagegen ist aber OK.
Ich dachte schon einen Bug gefunden zu haben. Der Report dafür wurde aber nicht anerkannt, weil das Verhalten so gewünscht und dokumentiert ist.

Wie kommt man zum Fehler? Mit einer Config wie:

[req]
promt=no
distinguished_name=dn
default_md=sha256
default_bits=2048
req_extensions=alt_names

[dn]
C=AT
ST=NOe
L=xxx
O="org"
OU="ou"
E="test@example.com"

[alt_names]
subjectAltName=${ENV::SAN}

Wie repariert man es?
Indem man einen Default Wert in der Config setzt:

SAN=""
[req]
promt=no
distinguished_name=dn
default_md=sha256
default_bits=2048
req_extensions=alt_names

[dn]
C=AT
ST=NOe
L=xxx
O="org"
OU="ou"
E="test@example.com"

[alt_names]
subjectAltName=${ENV::SAN}

Dokumentation, wenn auch leicht verwirrend findet man unter https://www.openssl.org/docs/man1.0.2/apps/config.html bzw. https://www.openssl.org/docs/manmaster/apps/config.html für die letzte Version.
Suchen auf der Seite nach Begrif „ENV“.

Windows und die Bash

Written by  on August 27, 2016

Spannende Zeiten! Microsoft gibt die Powershell frei für Linux. Und gleichzeitig gibt’s die Bash unter Windows 10.
Wie kommt man zur Shell? Die Installation geht recht einfach laut Anleitung.
Man braucht zumindest Windows 10 Anniversary Update build 14316, das prüft man am einfachsten mit „winver.exe“
Dann aktiviert man den Entwicklermodus. Einfach Windows Taste -> „Entwicklerfunktionen verwenden“
Als nächstes „Windows Features aktivieren oder deaktivieren“ und „Windows Subsystem for Linux (beta)“ wählen. Neustarten. Installation abschließen, indem der Befehl „bash“ ausgeführt wird.

Von Batch zu PowerShell

Written by  on Juli 12, 2016

Ein guter Grund Scripte zu migrieren könnte sein, dass viele Konstrukte einfacher und lesbarer geworden sind.

Es ist eher schwierig auf einen Blick genau zu sagen, was hier für Dateinamen erzeugt werden. Weil scheinbar Strings an festen Positionen zerschnitten werden. Das könnte ausserdem Probleme geben, wenn verschiedene Sprachversionen zum Einsatz kommen:

"%PATH%\%DATE%_%HOUR: =0%.%TIME:~3,2%.%TIME:~6,2%.zip"

Eleganter auf der Powershell

"$PATH\$(get-date -format dd.mm.yyyy_HH.mm.ss).zip"

VI Insert Mode and the Cursor Keys

Written by  on April 18, 2016

Wenn der Editor vi im Insert Mode mit den Pfeiltasten statt den Cursor zu bewegen die Buchstaben A, B, C und D ausgibt lässt sich das leicht beheben.

~/.vimrc

set nocompatible

Hitting arrow keys adds characters in vi editor – Ask Ubuntu