Comment demander un certificat TERENA SSL ?

Les instructions sont données sur cette page.

Après vous être acquitté des démarches indiquées sur la page référencée ci-dessus, vous allez pouvoir obtenir des certificats.

Vous devez fournir une CSR (Certificate Signing Request) lors de votre demande de certificat sur la plateforme de l'opérateur de certificats. Habituellement, les demandes se font à l'aide d'openssl à l'aide d'une commande du type :

openssl req -new -newkey rsa:2048 -keyout clepriveeàconserver.pem -out monfichierdecsr.pem -subj "/C=FR/O=mon etablissement/CN=nomdelamachine/"

Vous pouvez passer par ici pour une demande plus complexe.

Celle-ci est un exemple mais Vous devez vous limiter aux domaines autorisés pour votre établissement. Sinon votre requête risque d'être refusée par notre service d'enregistrement.

Pour la génération des CSR, vous pouvez également :

Puis je demander un certificat serveur "wildcard" (*.domaine.tld) ?

Oui, vous pouvez demander un certificat serveur du type *.mondomaine.tld .

La seule contrainte que vous avez est que le CN corresponde bien à un domaine de votre établissement déclaré lors de sa souscription au service TCS.

L'avantage de ces certificats est évident : un seul certificat permet de configurer autant de serveurs SSL que l'on souhaite ; soit des serveurs virtuels sur un même host soit sur des hosts différents. Il y a une réelle économie pour les différentes opérations de gestion du cycle de vie des certificats (en particulier pour le renouvellement).

Cependant, il ne faut pas négliger les inconvénients de ces certificats :

  • du point de vue du client, la preuve du nom du serveur avec lequel la communication est établie est une preuve partielle (seul le nom de domaine est prouvé).
  • la compromission de la clé privée associée à ce certificat a beaucoup plus de conséquences car il est alors possible pour le pirate de créer des sites avec des noms de sous-domaines librement choisis.
  • l'expiration ou la révocation de ce certificat entraîne un arrêt de tous les services concernés.

Pour tempérer les inconvénients liés aux wildcard certificates, sachez qu'il est possible de demander plusieurs certificats avec “cn=*.mondomaine.fr”. Vous pouvez donc par exemple demander un certificat de ce type pour chaque serveur physique hébergeant plusieurs virtual hosts HTTP.

Pour limiter les risques liés à l'utilisation des wildcard certificates, n'utilisez pas un seul certificat wildcard sur plusieurs machines physiques distinctes. Si vous avez besoin de wildcard certificates pour plusieurs machines physiques distinctes, demandez autant de wildcard certificates que de machines.

Pour obtenir un wildcard certificate il suffit de faire une demande pour *.mon-domaine.fr comme si c'était un vrai nom de machine. La procédure est la même que pour un certificat normal.

Puis je ajouter des Subject Alternatives Names à un certificat serveur (SAN) ?

Vous pouvez le faire en déposant une CSR spécifique. Dans ce cas, utilisez de préférence le script ci-dessous pour composer une CSR complexe. Vous pouvez aussi choisir de le faire au moment du dépôt de la demande, en complétant la demande dans l'interface TCS, après validation de la CSR.

Les CN peuvent correspondre à des domaines différents mais tous les domaines doivent être des domaines de votre établissement déclarés dans la lettre d'engagement. Les “wildcard” sont prohibés dans les SAN.

TCS : générer une demande de certificat complexe

Vous pouvez utiliser le script suivant :

#!/bin/sh
# csr.sh: Certificate Signing Request Generator
 
 
# be safe about permissions
LASTUMASK=`umask`
umask 077
 
# OpenSSL for HPUX needs a random file
RANDOMFILE=$HOME/.rnd
 
# create certs did if dos not exists 
KEYFILE=${HOME}/certs
[ -d $KEYFILE ] || mkdir $KEYFILE
 
# create a config file for openssl
CONFIG=`mktemp -q /tmp/openssl-conf.XXXXXXXX`
if [ ! $? -eq 0 ]; then
    echo "Could not create temporary config file. exiting"
    exit 1
fi
 
echo "Private Key and Certificate Signing Request Generator"
echo
 
printf "Établissement: "
read ORGANIZATION
printf "Composante (optionnel : taper entrée pour passer):"
read OU
printf "Province ou Région (optionnel : taper entrée pour passer):"
read STATE
printf "Ville (optionnel : taper entrée pour passer):"
read LOCALITY
printf "Adresse email (optionnel : taper entrée pour passer):"
read EMAILADDRESS
printf "Nom court (ie. imap big_srv www2): "
read HOST
printf "FQDN/Nom commun (ie. www.example.com) : "
read COMMONNAME
echo "Taper les  SubjectAltNames pour ce certificat, un par ligne. Entrée une ligne vide pour finir"
SAN=1        # bogus value to begin the loop
SANAMES=""   # sanitize
while [ ! "$SAN" = "" ]; do
    printf "SubjectAltName: DNS:"
    read SAN
    if [ "$SAN" = "" ]; then break; fi # end of input
    if [ "$SANAMES" = "" ]; then
        SANAMES="DNS:$SAN"
    else
        SANAMES="$SANAMES,DNS:$SAN"
    fi
done
 
# Config File Generation
 
cat <<EOF > $CONFIG
# -------------- BEGIN custom openssl.cnf -----
 HOME                    = $HOME
EOF
 
if [ "`uname -s`" = "HP-UX" ]; then
    echo " RANDFILE                = $RANDOMFILE" >> $CONFIG
fi
 
cat <<EOF >> $CONFIG
 oid_section             = new_oids
 [ new_oids ]
 [ req ]
 default_days            = 730            # how long to certify for
 default_keyfile         = ${HOME}/certs/${HOST}_privatekey.pem
 distinguished_name      = req_distinguished_name
 encrypt_key             = no
 string_mask = nombstr
EOF
 
 
if [ ! "$SANAMES" = "" ]; then
    echo "req_extensions = v3_req # Extensions to add to certificate request" >> $CONFIG
fi
 
cat <<EOF >> $CONFIG
 [ req_distinguished_name ]
 countryName			= Country Name (2 letter code)
 countryName_default		= FR
 countryName_min		= 2
 countryName_max		= 2
 0.organizationName		= Organization Name (eg, company)
 0.organizationName_default	= $ORGANIZATION
EOF
if [ ! "$OU" = "" ]; then
cat <<EOF >> $CONFIG
 organizationalUnitName	 = organizational Unit Name (eg, unit)
 organizationalUnitName_default    = $OU
EOF
fi
if [ ! "$STATE" = "" ]; then
cat <<EOF >> $CONFIG
 stateOrProvinceName	 = State
 stateOrProvinceName_default    = $STATE
EOF
fi
if [ ! "$LOCALITY" = "" ]; then
cat <<EOF >> $CONFIG
 localityName	 = locality name (eg city)
 localityName_default    = $LOCALITY
EOF
fi
cat <<EOF >>$CONFIG
 commonName              = Common Name (eg, YOUR name)
 commonName_default      = $COMMONNAME
 commonName_max          = 64
 
EOF
if [ ! "$EMAILADDRESS" = "" ]; then
cat <<EOF >> $CONFIG
 emailAddress		 = Email Address
 emailAddress_default    = $EMAILADDRESS
 emailAddress_max	 = 64
 
EOF
else
cat <<EOF >> $CONFIG
 
EOF
fi
if [ ! "$SANAMES" = "" ]; then
    echo "[ v3_req ]" >> $CONFIG
    echo "subjectAltName=$SANAMES" >> $CONFIG
fi
 
 
echo "# -------------- END custom openssl.cnf -----" >> $CONFIG
 
echo "Running OpenSSL..."
openssl req -batch -config $CONFIG -newkey rsa:2048 -out ${HOME}/certs/${HOST}_csr.pem
echo "Copy the following Certificate Request and paste into CAcert website to obtain a Certificate."
echo "When you receive your certificate, you 'should' name it something like ${HOST}_server.pem"
echo
cat $HOME/certs/${HOST}_csr.pem
echo
echo The Certificate request is also available in ${HOME}/certs/${HOST}_csr.pem
echo The Private Key is stored in ${HOME}/certs/${HOST}_privatekey.pem
echo
 
rm $CONFIG
 
#restore umask
umask $LASTUMASK

Puis-je utiliser un autre outil qu'OpenSSL pour générer ma requête ?

Oui. Sachez alors qu'il risque de ne pas générer un fichier .key comme dans nos exemples. Reportez-vous alors à sa documentation pour connaître le processus de demande et d'intégration du certificat. Vérifiez la présence des 3 champs obligatoires : O , C et CN sinon votre requête risque d'être refusée par notre service d'enregistrement.

Est-il possible d'utiliser des tailles différentes de 2048 ?

  • Oui, s'il s'agit de clés d'une taille supérieure.
    Par contre, pour certains services, une taille de clé de 4096 peut entraîner un temps de traitement SSL trop long, alors qu'elle n'offre que peu d'intérêt supplémentaire.
  • Non s'il s'agit de clés d'une taille inférieure : 2048 est considérée aujourd'hui comme étant le minimum.