Using Certificate-Transparency to grab a list of all hostnames a CA has issued certificates for

is available on github. To download, simply type:

git clone https://github.com/eriktews/certificate-transparency-tools.git
cd certificate-transparency-tools
mkdir out
python download_all_certs.py https://ct1.digicert-ct.com/log out/digicert-
find out/ -name "digicert*precert*" | xargs -n 8000 python get_precert_cn.py | sort -u > all-digicert-pre-certificate-names-sorted.txt

The result should be a sorted list of all hostnames (including with wildcards) digicert every issued a certificate for.

Future work

So far, no special verification of the data supplied by the digicert server is done. Feel free to submit patches on github to improve this code. Also feel free to play with the data and spot any hostnames in the result that looks suspicious to you.

Better seeded of the OpenSSL random number generator for gensafeprime

Previous releases of gensafeprime up to 1.3 used the OpenSSL library to generate safe prime numbers, but did not add a seed to the OpenSSL PRNG. As a result, it might be possible that these numbers can be guessed. The manpage of OpenSSL BN_generate_prime specifies:

The PRNG must be seeded prior to calling BN_generate_prime(). The prime number generation has a negligible error probability.

To fix that problem, gensafeprime 1.4 has been released. The release contains a patch that seeds the OpenSSL PRNG from the python os.urandom source of entropy, which should be sufficient for cryptographic applications.

All users of the previous versions are encouraged to update to gensafeprime 1.4.

Generating safe prime numbers in Python

Recently, I tried to generate

GMP supports finding prime numbers and also efficient prime testing, bue there is no support for generating safe prime numbers in python and/or in GMP. A number is a safe prime number, if is prime, and is a prime number too.

#!/usr/bin/python
 
import gensafeprime
print gensafeprime.generate(512)

 

Installing Stunnel on OpenWRT

general documentation on the OpenWRT website. After OpenWRT is running, there are two ways how to install stunnel.

The easiest way to install stunnel on OpenWRT is opkg. Just execute:

opkg update; opkg install stunnel

However, the space on many routers is limited, and this might fail.

For those, who don’t have enough space on their router, they can still try the

And possibly, other options need to be set, depending on your plattform. After the image has been generated, it can be flashed on the device.

Because some paths are different, we need to adjust the stunnel.conf from the last posting.

cert = /etc/stunnel/cert-server.pem
key = /etc/stunnel/key-server.pem
CAfile = /etc/stunnel/cert-client.pem
sslVersion = SSLv3
chroot = /var
setuid = nobody
setgid = nogroup
pid = /stunnel.pid
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
[service]
accept  = ZZZZZ
connect = 192.168.XXX.YYY:80
verify = 2

All certificate and key files are placed in /etc/stunnel/. How we can start it with /etc/init.d/stunnel start. Also, just doing a reboot on the device might be a good idea, to check if stunnel still works after a reboot.

Using SSL/TLS Client Certificate Authentification in Android Applications

Werkzeuge

To ensure authenticity of both communication partners, X.509 certificates can be used. Most secure websites in the internet like paypal, ebay, or amazon only use X.509 certificates for the server, and the client is authenticated using a username and a password. For this example, X.509 certificates will be used for both communication partners.

To generate two self-signed X.509 certificates, the following script can be used. It will generate two new RSA 2048 bit keys, generate two self signed certificates, and bundle the client certificate with the corresponding private key, and the servers public certificate in a PKCS#12 container file.

#!/bin/bash
OPENSSL_OPTS="-new -newkey rsa:2048 -nodes -days 5475 -x509"
CN_SERVER="/CN=server"
CN_CLIENT="/CN=client"
PASS="123456"
echo "Generating keys"
openssl req -keyout key-server.pem -subj "$CN_SERVER" \
 -out cert-server.pem $OPENSSL_OPTS
openssl req -keyout key-client.pem -subj "$CN_CLIENT"\
 -out cert-client.pem $OPENSSL_OPTS
echo "Encrypting key for the client now"
openssl pkcs12 -export -passout "pass:$PASS" \
 -in cert-client.pem -inkey key-client.pem -out client.p12 \
 -certfile cert-server.pem -name "Client" -caname "Server"

We will use stunnel for the server. Stunnel is a lightweight general SSL/TLS wrapper and proxy. First, we copy cert-client.pem cert-server.pem and key-server.pem to the server to /etc/ssl/stunnel or another directory. Next is the stunnel configuration file:

cert = /etc/ssl/stunnel/cert-server.pem
key = /etc/ssl/stunnel/key-server.pem
CAfile = /etc/ssl/stunnel/cert-client.pem
sslVersion = SSLv3
chroot = /var/lib/stunnel4/
setuid = stunnel4
setgid = stunnel4
pid = /stunnel4.pid
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
[service]
accept  = 1279
connect = target:1280
verify = 2

This will set up a stunnel server, listening on port 1279, and forwarding the unencrypted communication to target port 1280. It will only allow connections from a client, presenting a valid certificate.

Next, we can write the code for our Android application:

// Adopt this in your application
String PASSWORD_FOR_PKCS12 = "123456";
InputStream pkcs12in = ......
// You only need to execute this code once
SSLContext context = SSLContext.getInstance("TLS");
// Local client certificate and key and server certificate
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(pkcs12in, PASSWORD_FOR_PKCS12.toCharArray());
// Build a TrustManager, that trusts only the server certificate
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
KeyStore keyStoreCA = KeyStore.getInstance("BKS");
keyStoreCA.load(null, null);
Certificate c = keyStore.getCertificate("Server");
keyStoreCA.setCertificateEntry("Server", c);
tmf.init(keyStoreCA);
// Build a KeyManager for Client auth
KeyManagerFactory kmf = KeyManagerFactory.getInstance(
        KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, null);
context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
// Everytime you need your https connection, run this code
URL url = new URL("https://my-router:1279/");
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.setSSLSocketFactory(context.getSocketFactory());
urlConnection.setHostnameVerifier(new AllowAllHostnameVerifier());
InputStream in = urlConnection.getInputStream();

A blog on cryptographie

I have started to write about mostly applied aspects of cryptographie, cryptanalysis and security on http://cryptanalysis.eu/. Postings for these topics won’t appear here.