module OpenSSL::OCSP
OpenSSL::OCSP implementiert Online Certificate Status Protocol-Anfragen und -Antworten.
Um eine OCSP-Anfrage zu erstellen und zu senden, wird ein Subjektzertifikat benötigt, das eine OCSP-URL in einer authorityInfoAccess-Erweiterung enthält, sowie das Ausstellerzertifikat für das Subjektzertifikat. Laden Sie zuerst die Aussteller- und Subjektzertifikate.
subject = OpenSSL::X509::Certificate.new subject_pem issuer = OpenSSL::X509::Certificate.new issuer_pem
Um die Anfrage zu erstellen, müssen wir eine Zertifikats-ID für das Subjektzertifikat erstellen, damit die CA weiß, nach welchem Zertifikat wir fragen.
digest = OpenSSL::Digest.new('SHA1') certificate_id = OpenSSL::OCSP::CertificateId.new subject, issuer, digest
Erstellen Sie dann eine Anfrage und fügen Sie die Zertifikats-ID hinzu.
request = OpenSSL::OCSP::Request.new request.add_certid certificate_id
Das Hinzufügen eines Nonce zur Anfrage schützt vor Replay-Angriffen, aber nicht alle CAs verarbeiten den Nonce.
request.add_nonce
Um die Anfrage zur Verifizierung an die CA zu übermitteln, müssen wir die OCSP URI aus dem Subjektzertifikat extrahieren.
ocsp_uris = subject.ocsp_uris require 'uri' ocsp_uri = URI ocsp_uris[0]
Um die Anfrage zu übermitteln, werden wir die Anfrage per POST an die OCSP URI senden (gemäß RFC 2560). Beachten Sie, dass wir in diesem Beispiel nur HTTP-Anfragen verarbeiten und keine Weiterleitungen handhaben, daher ist dies für den ernsthaften Gebrauch unzureichend.
require 'net/http' http_response = Net::HTTP.start ocsp_uri.hostname, ocsp_uri.port do |http| http.post ocsp_uri.path, request.to_der, 'content-type' => 'application/ocsp-request' end response = OpenSSL::OCSP::Response.new http_response.body response_basic = response.basic
Zuerst prüfen wir, ob die Antwort eine gültige Signatur hat. Ohne eine gültige Signatur können wir ihr nicht vertrauen. Wenn Sie hier einen Fehler erhalten, fehlt Ihnen möglicherweise ein Systemzertifikatsspeicher oder Zwischenzertifikate.
store = OpenSSL::X509::Store.new store.set_default_paths unless response_basic.verify [], store then raise 'response is not signed by a trusted certificate' end
Die Antwort enthält die Statusinformationen (Erfolg/Fehler). Wir können den Status als String anzeigen.
puts response.status_string #=> successful
Als Nächstes müssen wir die Antwortdetails kennen, um zu bestimmen, ob die Antwort mit unserer Anfrage übereinstimmt. Zuerst prüfen wir den Nonce. Auch hier unterstützen nicht alle CAs einen Nonce. Sehen Sie Request#check_nonce für die Bedeutung der Rückgabewerte.
p request.check_nonce basic_response #=> value from -1 to 3
Extrahieren Sie dann die Statusinformationen für das Zertifikat aus der Basisantwort.
single_response = basic_response.find_response(certificate_id) unless single_response raise 'basic_response does not have the status for the certificate' end
Prüfen Sie dann die Gültigkeit. Ein zukünftig ausgestellter Status muss abgelehnt werden.
unless single_response.check_validity
raise 'this_update is in the future or next_update time has passed'
end
case single_response.cert_status
when OpenSSL::OCSP::V_CERTSTATUS_GOOD
puts 'certificate is still valid'
when OpenSSL::OCSP::V_CERTSTATUS_REVOKED
puts "certificate has been revoked at #{single_response.revocation_time}"
when OpenSSL::OCSP::V_CERTSTATUS_UNKNOWN
puts 'responder doesn't know about the certificate'
end
Constants
- NOCASIGN
-
(Dieses Flag wird von
OpenSSL1.0.1g nicht verwendet) - NOCERTS
-
Fügen Sie keine Zertifikate in die Antwort ein.
- NOCHAIN
-
Verifizieren Sie die Zertifikatkette der Antwort nicht.
- NOCHECKS
-
Führen Sie keine zusätzlichen Überprüfungen des Signaturzertifikats durch.
- NODELEGATED
-
(Dieses Flag wird von
OpenSSL1.0.1g nicht verwendet) - NOEXPLICIT
-
Vertrauen Sie nicht.
- NOINTERN
-
Suchen Sie nicht in den in der Antwort enthaltenen Zertifikaten nach einem Unterzeichner.
- NOSIGS
-
Überprüfen Sie die Signatur der Antwort nicht.
- NOTIME
-
Fügen Sie die produzierte Zeit nicht in die Antwort ein.
- NOVERIFY
-
Überprüfen Sie die Antwort überhaupt nicht.
- RESPID_KEY
-
Identifizieren Sie die Antwort durch Signieren der Schlüssel-ID des Zertifikats.
- RESPONSE_STATUS_INTERNALERROR
-
Interner Fehler beim Aussteller.
- RESPONSE_STATUS_MALFORMEDREQUEST
-
Illegale Bestätigungsanfrage.
- RESPONSE_STATUS_SIGREQUIRED
-
Sie müssen die Anfrage signieren und erneut einreichen.
- RESPONSE_STATUS_SUCCESSFUL
-
Responsehat gültige Bestätigungen. - RESPONSE_STATUS_TRYLATER
-
Versuchen Sie es später erneut.
- RESPONSE_STATUS_UNAUTHORIZED
-
Ihre Anfrage ist nicht autorisiert.
- REVOKED_STATUS_AFFILIATIONCHANGED
-
Der Name des Zertifikatsubjekts oder andere Informationen haben sich geändert.
- REVOKED_STATUS_CACOMPROMISE
-
Dieses CA-Zertifikat wurde aufgrund eines Schlüsselkompromisses widerrufen.
- REVOKED_STATUS_CERTIFICATEHOLD
-
Das Zertifikat ist gesperrt.
- REVOKED_STATUS_CESSATIONOFOPERATION
-
Das Zertifikat wird nicht mehr benötigt.
- REVOKED_STATUS_KEYCOMPROMISE
-
Das Zertifikat wurde aufgrund eines Schlüsselkompromisses widerrufen.
- REVOKED_STATUS_NOSTATUS
-
Das Zertifikat wurde aus unbekanntem Grund widerrufen.
- REVOKED_STATUS_REMOVEFROMCRL
-
Das Zertifikat war zuvor gesperrt und sollte nun aus der CRL entfernt werden.
- REVOKED_STATUS_SUPERSEDED
-
Das Zertifikat wurde durch ein neues Zertifikat ersetzt.
- REVOKED_STATUS_UNSPECIFIED
-
Das Zertifikat wurde aus einem nicht spezifizierten Grund widerrufen.
- TRUSTOTHER
-
Überprüfen Sie keine zusätzlichen Zertifikate.
- V_CERTSTATUS_GOOD
-
Zeigt an, dass das Zertifikat nicht widerrufen wurde, bedeutet aber nicht unbedingt, dass das Zertifikat ausgestellt wurde oder dass diese Antwort innerhalb des Gültigkeitsintervalls des Zertifikats liegt.
- V_CERTSTATUS_REVOKED
-
Zeigt an, dass das Zertifikat dauerhaft oder vorübergehend (gesperrt) widerrufen wurde.
- V_CERTSTATUS_UNKNOWN
-
Zeigt an, dass der Responder nichts über das angeforderte Zertifikat weiß.
- V_RESPID_KEY
-
Die Responder-ID basiert auf dem öffentlichen Schlüssel.
- V_RESPID_NAME
-
Die Responder-ID basiert auf dem Schlüsselnamen.