2015-01-02 97 views
6

次の設定(OpenSSL 1.0.1を使用して2012年3月14日)を使用して、独自の自己署名証明書を使用して小さなテストCAを作成しています。私が持っている問題は、CA自身の証明書の開始日を見ると、明日のためにそれが作成されます(そして、私は今日それを使いたいと思います)。OpenSSL自己署名付きルートCA証明書:開始日を設定する

> 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 

CAを使用して署名した証明書で同じ問題が発生したため、少し掘りました。これらの証明書では、--startdateを使用して開始日を設定できますが、CAルート証明書には同様のオプションが表示されません。私はdefault_startdateを使用して、CAを生成する際に使用されるopenssl設定ファイルで試してみましたが、それは何らかの理由で無視されるようですか?

次のようにCAを作成します。これは基本的に、Pravir Chandraらの「NetworkSecurity with OpenSSL」とほぼ同じです。

使用するコマンドはreq -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -verboseですが、ルートCAの証明書と秘密鍵を生成する際にこの特定のケースでどのように開始日を設定するのですか?ありがとうございます。

CAを生成するための完全なスクリプトは以下の通りです:

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

だけ通知を作成します。 "default_md = md5"はセキュリティの問題です。 sha256は良いでしょう。 – Dzenly

答えて

9

-selfsignオプションを使用すると、CA自己署名証明書を作成できます。 このコマンドは、例えばspefic -startdate-enddate

を設定することができます:

  • あなたのCAの秘密鍵を作成します:

openssl genrsa -out cakey.pem 2048

  • は、このキーのCSRを作成します:

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

  • 自己署名証明書

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

+0

@Etienne有効な日付ですか? opensslドキュメントでは、-startdateと-enddateはYYMMDDHHMMSSZ内の日付が4桁の年の表現を許可しないと想定しています。 – Grasshopper

+0

@Grasshopper最も良い方法は、試してみることです: '' 'openssl ca -config conf/caconfig.cnf -startdate 20160107071311Z -enddate 20170106071311Z -batch-out server_cert_2048.pem -in server_cert_2048.pem.csr'''が生成します'' '誤った証明書は1月6日まで認定される予定です07:13:11 2017 GMT(363日)' '':そうです! – Etienne

2

だけの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; 
のライン843に秒単位でタイムシフトにハードコードさゼロを置き換えます

リクエストを作成する日付(現在 - 10日間):

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

こんにちは、お返事ありがとう:)私はコマンドラインツールを再コンパイルせずにこれを行うことができる方法がある場合は知っていますか? – Jimbo

+0

req.cによると、そのようなオプションはありません。私にそれをする方法が他に知られていないかもしれません。 –

+0

さて、ありがとうとにかく...良い提案を+1してください。もし私が本当に必死になったら後でユーティリティをコンパイルしようとしています:) – Jimbo

関連する問題