終了日が過去の自己署名証明書を作成します。

終了日が過去の自己署名証明書を作成します。

次のようなランダムな開始日と終了日を使用して自己署名証明書を動的に生成したいと思います。過去。私はOpenSSLなどの標準ツールを使用することを好みますが、作業を完了するツールであれば何でもいいです。

スタックオーバーフローの質問有効期間が1日未満のopenssl証明書を生成するには?同様の質問がありますが、私の証明書に自己署名したいと思います。

質問がある場合は、自動化されたテストに証明書が必要です。

答え1

過去に証明書を作成する方法は2つありました。証明書署名時に時間(1)(2)を偽造するか、時間間隔(3)を定義します。

1)まず、偽の時間について:プログラムがシステムとは異なる日付を持っていると思うようにするには、以下を見てくださいlibfaketimefaketime

Debian にインストールするには:

sudo apt-get install faketime

faketimeその後、コマンドの前に使用できますopenssl

使用例:

$faketime 'last friday 5 pm' /bin/date
Fri Apr 14 17:00:00 WEST 2017
$faketime '2008-12-24 08:15:42' /bin/date
Wed Dec 24 08:15:42 WET 2008

からman faketime

与えられたコマンドは、現在のシステム時間がタイムスタンプで指定された時間であると信じるようになります。特に指定しない限り、壁時計はこの日時から実行され続けます(詳細オプションを参照)。実際、faketimeは、LD_PRELOADメカニズムを使用してtime(2)やfstat(2)などの関数へのシステムコールを傍受する小さなライブラリをロードするlibfaketimeの単純なラッパーです。

たとえば、あなたの場合、日付を2008年として定義し、2010年までに2年間有効な証明書を生成できます。

faketime '2008-12-24 08:15:42' openssl ... 

注:このユーティリティは、MacOSを含む複数のUnixバージョンで、あらゆる種類のプログラム(コマンドラインに限定されない)のラッパーとして使用できます。

明確にすると、この方法を使用してロードされたバイナリ(およびそのサブファイル)の時間のみが変更され、偽の時間は残りのシステムの現在の時間には影響しません。

2)@Wyzardが言ったようdatefudgefaketime

違いはdatefudge影響を受けませんfstat(つまり、ファイルの作成時間は変わりません)。また、LD_PRELOADを使用してロードされる独自のライブラリdatefudge.soもあります。

-s static timeまた、数秒が経過しても、常に参照された時間を返す場所もあります。

$ datefudge --static "2007-04-01 10:23" sh -c "sleep 3; date -R"
Sun, 01 Apr 2007 10:23:00 +0100

3)時間を偽造することに加えて、証明書の有効期限の始点と終点を定義することもできます。兆候OpenSSLの証明書。

あなたの質問にリンクされている質問の誤解は、証明書の有効性が要求時間(CSR要求時間)ではなく署名時間に定義されることです。

を使用して自己署名証明書を生成するときにopenssl caオプション-startdateとを追加します-enddate

opensslソースによると、これら2つのオプションの日付形式はopenssl/crypto/x509/x509_vfy.cASN1_TIME、つまりASN1UTCTimeです。形式はYYMMDDHHMMSSZまたはYYYYMMDDHHMMSSZでなければなりません。

引用するopenssl/crypto/x509/x509_vfy.c

int X509_cmp_time(const ASN1_TIME *ctm, time_t *cmp_time)
{
    static const size_t utctime_length = sizeof("YYMMDDHHMMSSZ") - 1;
    static const size_t generalizedtime_length = sizeof("YYYYMMDDHHMMSSZ") - 1;
    ASN1_TIME *asn1_cmp_time = NULL;
    int i, day, sec, ret = 0;

    /*
     * Note that ASN.1 allows much more slack in the time format than RFC5280.
     * In RFC5280, the representation is fixed:
     * UTCTime: YYMMDDHHMMSSZ
     * GeneralizedTime: YYYYMMDDHHMMSSZ
     *
     * We do NOT currently enforce the following RFC 5280 requirement:
     * "CAs conforming to this profile MUST always encode certificate
     *  validity dates through the year 2049 as UTCTime; certificate validity
     *  dates in 2050 or later MUST be encoded as GeneralizedTime."
     */

変更ログ(2038バグ?) - この変更ログは、APIを直接使用する場合にのみ関連するため、追加の脚注です。

1.1.0eと1.1.1の間の変更点[xx XXX xxxx]

*) ASN.1 タイプ INT32、UINT32、INT64、UINT64、Z プレフィックスの付いたバリエーションが追加されました。これはLONG​​とZLONGを置き換え、サイズの安全性を確保するためです。 LONG と ZLONG の使用は廃止され、OpenSSL 1.2.0 では廃止予定です。

したがって、2008年1月1日から2010年1月1日までの期間の証明書を生成する方法は次のとおりです。

openssl ca -config /path/to/myca.conf -in req.csr -out ourdomain.pem \
-startdate 200801010000Z -enddate 201001010000Z

または

openssl ca -config /path/to/myca.conf -in req.csr -out ourdomain.pem \
-startdate 0801010000Z -enddate 1001010000Z

-startdate-enddate@guntbertが指摘したように、ソースと変更ログには表示されますが、ホームページopensslには表示されませんが、man openssl次の場所にも表示されますman ca

-startdate date
       this allows the start date to be explicitly set. The format of the date is
       YYMMDDHHMMSSZ (the same as an ASN1 UTCTime structure).

   -enddate date
       this allows the expiry date to be explicitly set. The format of the date is
       YYMMDDHHMMSSZ (the same as an ASN1 UTCTime structure).

引用するopenssl/CHANGE

0.9.3aと0.9.4の間の変更点[1999年8月9日]

*) "ca"プログラムの-startdateおよび-enddate(欠落)パラメータを変更します。

PS選択した答えは質問StackExchangeから引用しています。一般的に悪い考え特に、本番システムでこの回答の方法を使用すると、システム時間を変更するためにroot権限は必要ありません。

答え2

私は明らかなことが効果があるという事実にほとんど驚きました。openssl証明書が有効な日数をパラメータとして使用している間は、負の数だけを指定してください。

openssl req -x509 -newkey rsa:4096 \
    -keyout key.pem -out cert.pem -days -365

これは実際に非常に奇妙な結果をもたらします。証明書の有効期限のタイムスタンプです。先に開始する有効なタイムスタンプです。実際には奇妙なので、自動テストにこれを使用しないことをお勧めします。検証開始タイムスタンプを逆追跡する方法が必要な場合があります。

答え3

あるいは、この短いPythonプログラムのようなものを使用することもできます...(注意事項を適用)

開始時間が過去10年(-10 * 365 * 24 * 60 * 60秒は-10年)で、有効期限が過去のキー(test.key)と証明書(test.crt)を生成します。 5年(-5*365*24*60*60)。

これは最小デモプログラムなので、拡張(basicConstraintsなど)の設定は不要で、固定シリアル化を使用します。

#!/usr/bin/env python

from OpenSSL import crypto

key = crypto.PKey()
key.generate_key(crypto.TYPE_RSA, 2048)
cert = crypto.X509()
cert.get_subject().CN = "Test"
cert.set_serial_number(666)
cert.gmtime_adj_notBefore(-10*365*24*60*60)
cert.gmtime_adj_notAfter(-5*365*24*60*60)
cert.set_issuer(cert.get_subject())
cert.set_pubkey(key)
cert.sign(key, 'sha384')

open("test.crt", "wb").write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
open("test.key", "wb").write(crypto.dump_privatekey(crypto.FILETYPE_PEM, key))

答え4

ステップ1。偽の時間をインストールしてください

sudo apt-get install faketime

ステップ2。現在の日付の1日前に期限切れの証明書を生成します。

faketime 'last friday 5 pm' /bin/bash -c 'openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 6 -nodes'

ステップ3証明書の有効期限を確認する

openssl x509 -noout -text -in cert.pem

証明書の有効期間 - スクリーンショット

関連情報