2015-01-02 19 views
6

Sto creando una piccola CA di test con il proprio certificato autofirmato utilizzando la seguente configurazione (utilizzando OpenSSL 1.0.1 14 marzo 2012). Il problema che ho è che se guardo la data di inizio del proprio certificato CA, lo crea per domani (e mi piacerebbe usarlo oggi).Certificato CA auto-firmato OpenSSL: Impostare una data di inizio

> openssl x509 -noout -startdate -enddate -in ~/my_little_ca/cacert.pem 
notBefore=Jan 2 16:05:52 2015 GMT 
notAfter=Feb 1 16:05:52 2015 GMT 

Quindi ho scavato un po 'perché avevo lo stesso problema con i certificati che ho firmato usando la CA. Per questi certificati posso impostare la data di inizio utilizzando --startdate, ma non riesco a vedere un'opzione simile per il certificato di origine CA. Ho provato a utilizzare default_startdate nel file di configurazione di openssl utilizzato durante la generazione della CA, ma questo sembra essere ignorato per qualche motivo?

Creo la CA come segue, che è praticamente presa quasi letteralmente da "Network Security with OpenSSL" di Pravir Chandra et al, come mostrato più avanti.

Il comando utilizzato è req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -verbose, ma quello che mi piacerebbe sapere è come impostare la data di inizio in questo caso particolare quando si genera il certificato CA principale e la chiave privata? Grazie in anticipo.

Lo script completo per generare il CA è qui sotto:

MYDIR=$(pwd -P) 
BASEDIR=~/enigma_ca 


mkdir -pv $BASEDIR 
cd $BASEDIR 

mkdir -pv private 
chmod g-rwx,o-rwx private 
mkdir -pv certs 
touch index.txt 
echo '01' > serial 

DEFAULT_STARTDATE=$(date +'%y%m01000000Z') 

cat <<EOF >openssl.cnf 
[ ca ] 
default_ca = my_test_ca 

[ my_test_ca ] 
certificate  = $BASEDIR/cacert.pem 
database   = $BASEDIR/index.txt 
new_certs_dir  = $BASEDIR/certs 
private_key  = $BASEDIR/private/cakey.pem 
serial   = $BASEDIR/serial 

default_crl_days = 7 
default_days  = 356 
default_md  = md5 
default_startdate = $DEFAULT_STARTDATE 

policy   = my_test_ca_policy 
x509_extensions = certificate_extensions 

[ my_test_ca_policy ] 
commonName    = supplied 
stateOrProvinceName  = supplied 
countryName    = supplied 
emailAddress   = supplied 
organizationName  = supplied 
organizationalUnitName = optional 

[ certificate_extensions ] 
basicConstraints = CA:false 

[ req ] 
default_bits  = 2048 
default_keyfile = $BASEDIR/private/cakey.pem 
default_md  = md5 
default_startdate = $DEFAULT_STARTDATE 
default_days  = 356 

prompt    = no 
distinguished_name = root_ca_distinguished_name 
x509_extensions  = root_ca_extensions 

[ root_ca_distinguished_name ] 
commonName   = My Mini CA 
stateOrProvinceName = Hampshire 
countryName   = UK 
emailAddress   = [email protected] 
organizationName  = My Mini CA Ltd 

[ root_ca_extensions ] 
basicConstraints = CA:true 

EOF 


OPENSSL_CONF=$BASEDIR/openssl.cnf 
export OPENSSL_CONF 

# Now generate self-signed certificate and generate key pair to go with it... 
expect - <<EOF >> $MYDIR/ca_debug.txt 
puts [concat "OPENSSL_CONF =" \$::env(OPENSSL_CONF)] 
spawn openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -verbose 
expect "PEM pass phrase:" 
send "junk\r" 
expect "PEM pass phrase:" 
send "junk\r" 
expect eof 
EOF 
+0

Proprio preavviso. "default_md = md5" è un buco nella sicurezza. sha256 andrebbe bene. – Dzenly

risposta

9

è possibile utilizzare openssl ca con l'opzione -selfsign per creare il certificato autofirmato CA. Questo comando permette di impostare spefic -startdate e -enddate

Per esempio:

  • creare una chiave privata per la CA:

openssl genrsa -out cakey.pem 2048

  • creare un CSR per questa chiave :

openssl req -new -key cakey.pem -out ca.csr

  • creare il certificato auto-firmato

openssl ca -config openssl.cnf -selfsign -keyfile cakey.pem -startdate 20150214120000Z -enddate 20160214120000Z

+0

@Etienne Sono quelle date valide? I documenti openssl dichiarano che -startdate e -enddate prevedono una data in YYMMDDHHMMSSZ che non consente la rappresentazione di 4 numeri all'anno. – Grasshopper

+0

@Grasshopper il modo migliore è provarlo: '' 'openssl ca -config conf/caconfig.cnf -startdate 20160107071311Z -enddate 20170106071311Z -batch -out server_cert_2048.pem -in server_cert_2048.pem.csr''' produce '' 'err Il certificato deve essere certificato fino al 6 gennaio alle 07:13:11 2017 GMT (363 giorni)' '': quindi Sì! – Etienne

2

basta sostituire hardcoded zero a timeshift in pochi secondi in linea 843 di applicazioni OpenSSL/req.c

https://github.com/openssl/openssl/blob/master/apps/req.c#L843

if (!X509_gmtime_adj(X509_get_notBefore(x509ss),0)) goto end; 

Esempio che crea una richiesta con data (ora - 10 giorni):

if (!X509_gmtime_adj(X509_get_notBefore(x509ss),-10*24*3600)) goto end; 
+1

Ciao, grazie per la tua risposta :) Sai se esiste un modo per farlo senza dover ricompilare lo strumento da riga di comando? – Jimbo

+0

Giudicando da req.c non esiste questa opzione. Può esserci, esiste un altro modo per me sconosciuto per farlo. –

+0

Ok, grazie comunque ... +1 per un buon suggerimento.Lascerò il tentativo di compilare l'utilità per un secondo momento se divento davvero disperata :) – Jimbo

Problemi correlati