次のようなランダムな開始日と終了日を使用して自己署名証明書を動的に生成したいと思います。過去。私はOpenSSLなどの標準ツールを使用することを好みますが、作業を完了するツールであれば何でもいいです。
スタックオーバーフローの質問有効期間が1日未満のopenssl証明書を生成するには?同様の質問がありますが、私の証明書に自己署名したいと思います。
質問がある場合は、自動化されたテストに証明書が必要です。
ベストアンサー1
過去に証明書を作成する方法は2つありました。証明書署名時に時間(1)(2)を偽造するか、時間間隔(3)を定義します。
1)まず、偽の時間について:プログラムがシステムとは異なる日付を持っていると思うようにするには、以下を見てくださいlibfaketime
。faketime
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が言ったようdatefudge
にfaketime
。
違いは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.c
ASN1_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権限は必要ありません。