ssl

HSTS Preload

Written by  on Oktober 18, 2017

Das HSTS Preloading wurde mittlerweile augeschaltet:

Status: xn--hllrigl-90a.at is currently preloaded.

Sollte sofort sichtbar sein, wer versucht http://www.höllrigl.at aufzurufen wird sofort auf https://www.höllrigl.at umgeleitet.
Auch die SSLLabs Prüfung erkennt das:

HSTS Preloading	Chrome  Edge  Firefox  IE  

CAA records

Written by  on Oktober 4, 2017

Wie schaut ein CAA Record aus in bind:

xn--hllrigl-90a.at. CAA 1 issue "letsencrypt.org"

Erstellen lassen sich die CAA Records unter sslmate.com/caa. So bekommt man auch eine Auflistung aktueller Kürzel der CAs.

CAA Record mit dig überprüfen:

$ dig CAA höllrigl.at
...
;; QUESTION SECTION:
;höllrigl.at.                   IN      CAA

;; ANSWER SECTION:
höllrigl.at.            300     IN      CAA     0 iodef "mailto:hostmaster@xn--hllrigl-90a.at"
höllrigl.at.            300     IN      CAA     0 issue "letsencrypt.org"
...

Wenn dig den CAA Type noch nicht versteht:

$ dig höllrigl.at type257
...
;; QUESTION SECTION:
;höllrigl.at.                   IN      TYPE257

;; ANSWER SECTION:
höllrigl.at.            300     IN      TYPE257 \# 22 000569737375656C657473656E63727970742E6F7267
höllrigl.at.            300     IN      TYPE257 \# 43 0005696F6465666D61696C746F3A686F73746D617374657240786E2D 2D686C6C7269676C2D3930612E6174

HSTS Preload WordPress

Written by  on Oktober 2, 2017

HSTS Header korrekt setzen inklusive preload in WordPress mit dem Plugin Security Headers
Preloading für die Browser aktivieren lassen unter hstspreload.org

Status: xn--hllrigl-90a.at is pending submission to the preload list.

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

Checking SSL Private Keys

Written by  on August 1, 2017

Die ursprüngliche Frage war, wie kann ich feststellen, ob ein Zertifikat zum ursprünglichen Private Key passt. Googelt man die Frage, findet man auf SSLShopper einen Vorschlag, der aber nicht ausreicht sobald jemand Keys manipuliert!
Also muss noch eine zusätzliche Prüfung ins Script:

openssl rsa -in [privatekey] -check

Stellt sich raus, das funktioniert nicht mehr mit OpenSSL 1.1.0, weil eine Funktion einen neuen Namen erhalten hat. Aber die Leute bei OpenSSL sind da schnell und haben das nach meinen freundlichen Hinweis im Masterbranch eingepflegt.

OpenSSL 1.1.0 gibt’s ja jetzt schon etwas länger. Das bedeutet wohl, dass niemand seine Keys prüft. Zumindest nicht mit der aktuellen OpenSSL Version.

Let’s encrypt

Written by  on April 4, 2017

Good news everyone! Plesk kann seit kurzem auch mit Umlaut-Domains. Daher habe ich das gleich ein neues Zertifikat installiert. Mal sehen, ob sich Plesk jetzt auch ordentlich um die Verlängerung kümmert.

Plesk Let’s Encrypt Extension

Geändertes Browser Verhalten

Written by  on Oktober 28, 2016

Seit Oktober scheint sich das Verhalten von Webbrowsern beim Parsen von SSL/TLS Zertifikaten geändert zu haben. Bei Mozilla Firefox habe ich mir auch die entsprechenden Changes herausgesucht
Bug 585616 – No longer allow IP addresses in SSL server’s common names
Bug 1245280 – don’t fall back to subject common name for name information for new certificates
Kurz gesagt kommt das auf folgendes raus: Wenn es einen Subject Alternativ Name (SAN) gibt, ignoriere den Common Name (CN). Und zusätzlich: Verbiete IP Adressen als CN.
Wenn es bisher ein Zertifikat gab, dass CN=1.2.3.4 hatte und zusätzlich DNS=1.2.3.4 wurde der DNS ignoriert (eine IP Adresse ist kein DNS Name) es gab einen Fallback auf den CN und alle waren glücklich.
Seit Oktober ist es für neue Zertifikate so, dass wie gehabt der DNS Eintrag im SAN ignoriert wird, ein Fallback auf den CN stattfindet, aber die IP Adresse dort auch nicht mehr als Gültig gewertet wird. Das führt dann zu Fehlermeldungen wie: „Das Zertifikat ist nur gültig für 1.2.3.4, Du bist aber auf Seite 1.2.3.4 und das passt nicht zusammen, daher schmeiße ich Dir einen Zertifikatsfehler um die Ohren.“
Bei Mozilla heißt es dazu:

As of the Effective Date of these Requirements, prior to the issuance of a Certificate with a subjectAlternativeName (SAN) extension or Subject Common Name field containing a Reserved IP Address or Internal Server Name, the CA shall notify the Applicant that the use of such Certificates has been deprecated by the CA / Browser Forum and that the practice will be eliminated by October 2016. Also as of the Effective Date, the CA shall not issue a certificate with an Expiry Date later than 1 November 2015 with a SAN or Subject Common Name field containing a Reserved IP Address or Internal Server Name. As from 1 October 2016, CAs shall revoke all unexpired Certificates.


Wie macht man das jetzt richtig? Im SAN muss für eine IP Adresse das Primitive „IP“ verwendet werden und nicht „DNS“, dann klappt auch die Validierung wieder!

Zitat des Tages

Written by  on September 15, 2016

When a certificate contains alternative names, all common names are ignored. Newer certificates produced by CAs may not even include any common names. For that reason, include all desired hostnames on the alternative names list.

OpenSSL 1.1.0 mit SSL3

Written by  on September 7, 2016

Wie kompiliert man OpenSSL 1.1.0 mit SSL3?
Per Default wird SSL3 direkt abgeschaltet:

~/openssl-1.1.0>./config
Operating system: x86_64-whatever-linux2
Configuring for linux-x86_64
Configuring OpenSSL version 1.1.0 (0x0x1010000fL)
    no-asan         [default]  OPENSSL_NO_ASAN (skip dir)
    no-crypto-mdebug [default]  OPENSSL_NO_CRYPTO_MDEBUG (skip dir)
    no-crypto-mdebug-backtrace [default]  OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE (skip dir)
    no-ec_nistp_64_gcc_128 [default]  OPENSSL_NO_EC_NISTP_64_GCC_128 (skip dir)
    no-egd          [default]  OPENSSL_NO_EGD (skip dir)
    no-fuzz-afl     [default]  OPENSSL_NO_FUZZ_AFL (skip dir)
    no-fuzz-libfuzzer [default]  OPENSSL_NO_FUZZ_LIBFUZZER (skip dir)
    no-heartbeats   [default]  OPENSSL_NO_HEARTBEATS (skip dir)
    no-md2          [default]  OPENSSL_NO_MD2 (skip dir)
    no-msan         [default]  OPENSSL_NO_MSAN (skip dir)
    no-rc5          [default]  OPENSSL_NO_RC5 (skip dir)
    no-sctp         [default]  OPENSSL_NO_SCTP (skip dir)
    no-ssl-trace    [default]  OPENSSL_NO_SSL_TRACE (skip dir)
    no-ssl3         [default]  OPENSSL_NO_SSL3 (skip dir)
    no-ssl3-method  [default]  OPENSSL_NO_SSL3_METHOD (skip dir)
    no-ubsan        [default]  OPENSSL_NO_UBSAN (skip dir)
    no-unit-test    [default]  OPENSSL_NO_UNIT_TEST (skip dir)
    no-weak-ssl-ciphers [default]  OPENSSL_NO_WEAK_SSL_CIPHERS (skip dir)
    no-zlib         [default]
    no-zlib-dynamic [default]
Configuring for linux-x86_64
...

Aber man kann es im Configure aktivieren:

~/openssl-1.1.0>./config enable-ssl3 enable-ssl3-method
Operating system: x86_64-whatever-linux2
Configuring for linux-x86_64
Configuring OpenSSL version 1.1.0 (0x0x1010000fL)
    no-asan         [default]  OPENSSL_NO_ASAN (skip dir)
    no-crypto-mdebug [default]  OPENSSL_NO_CRYPTO_MDEBUG (skip dir)
    no-crypto-mdebug-backtrace [default]  OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE (skip dir)
    no-ec_nistp_64_gcc_128 [default]  OPENSSL_NO_EC_NISTP_64_GCC_128 (skip dir)
    no-egd          [default]  OPENSSL_NO_EGD (skip dir)
    no-fuzz-afl     [default]  OPENSSL_NO_FUZZ_AFL (skip dir)
    no-fuzz-libfuzzer [default]  OPENSSL_NO_FUZZ_LIBFUZZER (skip dir)
    no-heartbeats   [default]  OPENSSL_NO_HEARTBEATS (skip dir)
    no-md2          [default]  OPENSSL_NO_MD2 (skip dir)
    no-msan         [default]  OPENSSL_NO_MSAN (skip dir)
    no-rc5          [default]  OPENSSL_NO_RC5 (skip dir)
    no-sctp         [default]  OPENSSL_NO_SCTP (skip dir)
    no-ssl-trace    [default]  OPENSSL_NO_SSL_TRACE (skip dir)
    no-ubsan        [default]  OPENSSL_NO_UBSAN (skip dir)
    no-unit-test    [default]  OPENSSL_NO_UNIT_TEST (skip dir)
    no-weak-ssl-ciphers [default]  OPENSSL_NO_WEAK_SSL_CIPHERS (skip dir)
    no-zlib         [default]
    no-zlib-dynamic [default]
Configuring for linux-x86_64
...

Die Option -ssl3 wird jetzt wieder erkannt, funktioniert aber nicht:

echo "" | apps/openssl s_client -servername ${SERVERNAME} -connect $SERVERNAME:443 -ssl3
CONNECTED(00000003)
140198926489344:error:141640BF:SSL routines:tls_construct_client_hello:no protocols available:ssl/statem/statem_clnt.c:709:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 0 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
---

Gleicher Befehl mit -tls1 bzw auch wenn keine Protokollversion explizit angegeben wird:

echo "" | apps/openssl s_client -servername ${SERVERNAME} -connect $SERVERNAME:443 -tls1
CONNECTED(00000003)
...
Server did acknowledge servername extension.
---
Certificate chain
...
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIHfjCC...
...
dTc=
-----END CERTIFICATE-----

Irgendjemand eine Idee dazu?

OpenSSL 1.1 ohne SSLv3

Written by  on September 6, 2016

Bisher konnte man zum Beispiel auf SSLv3 testen mit OpenSSL:

openssl version
OpenSSL 1.0.2h  3 May 2016
echo "" | openssl s_client -servername ${SERVERNAME} -connect $SERVERNAME:60003 -ssl3
CONNECTED(00000003)
2675996:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:s3_pkt.c:656:
...

OpenSSL 1.1.0 kommt per default aber ohne support für SSL3. Das heißt auch, man kann Server von Haus aus nicht mehr auf SSL3 testen.

openssl version
OpenSSL 1.1.0  25 Aug 2016
echo "" | openssl s_client -servername ${SERVERNAME} -connect $SERVERNAME:60003 -ssl3
s_client: Option unknown option -ssl3
s_client: Use -help for summary.

Muss man also Server darauf testen, sollte man noch eine ältere OpenSSL Version vorhalten.