class OpenSSL::Timestamp::Factory

Wird verwendet, um eine Response von Grund auf neu zu generieren.

Bitte beachten Sie, dass die Implementierung immer das in der Anfrage angegebene Policy-Objekt-Identifier anwendet und dieses gegenüber dem in der Factory spezifizierten Standard-Policy-Identifier bevorzugt. Infolgedessen wird default_policy_id nur angewendet, wenn keine Request#policy_id angegeben wurde. Dies bedeutet jedoch auch, dass man den Policy-Identifier in der Anfrage manuell überprüfen muss, bevor die Response erstellt wird, z. B. um zu prüfen, ob er mit einem bestimmten Satz akzeptabler Policies übereinstimmt.

Es besteht auch die Möglichkeit, neben dem Zeitstempelzertifikat zusätzliche Zertifikate (Instanzen von OpenSSL::X509::Certificate) hinzuzufügen, die im resultierenden Zeitstempel-Token enthalten sein werden, wenn Request#cert_requested? true ist. Idealerweise sollten auch alle Zwischenzertifikate enthalten sein (das Stammzertifikat kann weggelassen werden – um es zu vertrauen, muss eine prüfende Partei es ohnehin besitzen). Dies vereinfacht die Validierung des Zeitstempels, da diese Zwischenzertifikate "bereits vorhanden" sind und nicht als externe Parameter an Response#verify übergeben werden müssen, wodurch die für die Verifizierung benötigten externen Ressourcen minimiert werden.

Beispiel: Einbeziehung von (nicht vertrauenswürdigen) Zwischenzertifikaten

Angenommen, wir haben eine Zeitstempelanfrage erhalten, bei der Request#policy_id auf nil und Request#cert_requested? auf true gesetzt wurde. Die Rohdaten der Anfrage sind in einer Variablen namens req_raw gespeichert. Wir möchten dennoch die notwendigen Zwischenzertifikate (in inter1.cer und inter2.cer) integrieren, um die Validierung der resultierenden Response zu vereinfachen. ts.p12 ist eine PKCS#12-kompatible Datei, die den privaten Schlüssel und das Zeitstempelzertifikat enthält.

req = OpenSSL::Timestamp::Request.new(raw_bytes)
p12 = OpenSSL::PKCS12.new(File.binread('ts.p12'), 'pwd')
inter1 = OpenSSL::X509::Certificate.new(File.binread('inter1.cer'))
inter2 = OpenSSL::X509::Certificate.new(File.binread('inter2.cer'))
fac = OpenSSL::Timestamp::Factory.new
fac.gen_time = Time.now
fac.serial_number = 1
fac.allowed_digests = ["sha256", "sha384", "sha512"]
#needed because the Request contained no policy identifier
fac.default_policy_id = '1.2.3.4.5'
fac.additional_certificates = [ inter1, inter2 ]
timestamp = fac.create_timestamp(p12.key, p12.certificate, req)