Public Key-Infrastruktur (Fortsetzung): Zertifizierungsstelle basierend auf OpenSSL und SQLite3

Bild Wenn eines der Hauptobjekte der Public-Key-Infrastruktur (PKI) X509-Zertifikate sind, sind Zertifizierungsstellen (CAs) das zentrale Thema der PKI. Es ist die Zertifizierungsstelle, die Zertifikate ausstellt, ihre Gültigkeit beendet (Zertifikatsperrung) und ihre Gültigkeit bestätigt. Auf den Seiten von Habrahabr finden Sie verschiedene Veröffentlichungen zum Thema digitale Zertifikate mit OpenSSL . Grundsätzlich wird in diesen Artikeln die Verwendung des Dienstprogramms openssl erläutert , die Befehlszeilenschnittstelle beschrieben und mit Dateien gearbeitet, in denen alles gespeichert ist: Schlüssel, Anforderungen, Zertifikate, einschließlich des Stammverzeichnisses usw. Wenn Sie jedoch ein auf OpenSSL basierendes Full-Scale-Zertifizierungszentrum (CA) entwickeln, möchten Sie diese Vielzahl von Dateien natürlich entfernen und mit der Arbeit mit Datenbanken fortfahren sowie über eine grafische Oberfläche für die Ausstellung und Verwaltung von Zertifikaten verfügen. Und wenn Sie sich an das Bundesgesetz vom 6. April 2011 erinnern. Nr. 63- Bei elektronischen Signaturen muss die zuständige Behörde die Anforderungen dieses Gesetzes sowie die Anforderungen für die Form eines qualifizierten Zertifikats für einen Schlüssel zur Überprüfung elektronischer Signaturen erfüllen, der vom Beschluss des föderalen Sicherheitsdienstes Russlands vom 27. Dezember 2011 Nr. 795 genehmigt wurde.

Normale Bürger haben den Eindruck, dass die UTs etwas Riesiges sind (nun, das Zentrum, fast wie das Missionskontrollzentrum).

Bild Aus Sicht der Verantwortlichkeit der CA - genau das ist es. Immerhin sind die von der CA ausgestellten Zertifikate heute im Pass tatsächlich gleich.

Aus Sicht eines Programmierers ist nicht alles so beängstigend. So wurde das CAFL63-Zertifizierungszentrumsprojekt geboren. Die Implementierung des CAFL63-Projekts basiert auf drei „Säulen“, nämlich OpenSSL, SQLite3 und Tcl / Tk .

Was ist eine Zertifizierungsstelle heute? Zuallererst ist es das Registrierungszentrum, in dem Vertreter von juristischen Personen, Einzelpersonen und Einzelunternehmern Zertifikate mit einem Paket notwendiger Dokumente einholen, insbesondere zur Identifizierung der Identität und Autorität des Antragstellers. Sie können mit vorgefertigten Anwendungen elektronisch geliefert werden. Die CR prüft die Dokumente, die Anfrage (ausgefüllte Daten, die Richtigkeit der elektronischen Signatur usw.) und wenn alles gut gegangen ist, nimmt sie die Anfrage an, genehmigt sie und sendet sie an das Certification Center (CA). Das ist aber ideal. In der Praxis sieht alles anders aus.

Bürger, Organisationen benötigen ein Zertifikat (für den Zugriff auf das Portal der staatlichen Dienste, für die Steuerberichterstattung, für Gebote), aber sie wissen nicht, was es ist und was sie damit tun sollen. Sie sind aufrichtig davon überzeugt, dass die Zertifizierungsstelle eine elektronische Signatur wie ein Fax erhält. Aber das sind Probleme der Erleuchtung. Daher kommen die Antragsteller zur Zentralverwaltung der Zentralverwaltung und legen Unterlagen vor. Zusammen mit dem Mitarbeiter der Zentrale gehen sie an einen separaten Arbeitsplatz und bereiten eine Zertifikatsanforderung vor:



Wie bereits erwähnt, geht eine vorbereitete Anfrage für elektronische Medien bei der CR ein. Woran muss sich der Antragsteller erinnern? Nehmen Sie in erster Linie die Medien mit dem erstellten privaten Schlüssel auf!
Eine genehmigte Anfrage für elektronische Medien wird an die Zertifizierungsstelle gesendet, wo auf ihrer Grundlage ein Zertifikat ausgestellt wird.

Dies ist ein schematisches Diagramm der Arbeit der Zertifizierungsstelle. Details werden unten klar. Eine Bemerkung zur Vereinfachung der Demonstration: Das Dienstprogramm zum Vorbereiten einer Anforderung, CR und CA, werden zu einem Demonstrationskomplex zusammengefasst. Es gibt jedoch keine Probleme mit der Funktionsvielfalt. Am einfachsten ist es, an jedem Arbeitsplatz eine CAFL63-Instanz zu haben und nur die erforderlichen Funktionen zu verwenden.

Als das Projekt in vollem Gange war, fiel mir das SimpleCA- Projekt auf. Das Studium dieses Projekts hat bei der endgültigen Implementierung von CAFL63 CA sehr geholfen.

Der Quellcode des Dienstprogramms und seiner Distributionen für Linux- und MS Windows-Plattformen finden Sie hier
Führen Sie also das Dienstprogramm CAFL63 aus, und die Startseite wird auf dem Bildschirm angezeigt:



Wir beginnen die Arbeit mit dem Drücken der Taste "Datenbank erstellen". Die CA-Datenbank wird mit plattformübergreifendem SQLite3 -DBMS erstellt. Die CA-Datenbank enthält mehrere Tabellen. Die Haupttabelle mainDB enthält nur einen Datensatz, in dem das Stammzertifikat, der mit einem Kennwort verschlüsselte private Schlüssel und die CA-Einstellungen gespeichert sind. Es gibt zwei Tabellen, die sich auf Zertifikatanforderungen beziehen: aktuelle reqDB-Anforderungen und reqDBArc-Anforderungsarchiv. Für Zertifikate werden drei Tabellen erstellt: die Tabelle der neuen Zertifikate certDBNew, die Tabelle des Archivs der Zertifikate certDB und die Tabelle der widerrufenen Zertifikate certDBRev:

. . . certdb eval {create table certDB( ckaID text primary key , nick text, sernum text, certPEM text, subject text, notAfter text, notBefore text, dateRevoke text, state text )} certdb eval {create table certDBRev( ckaID text primary key )} certdb eval {create table certDBNew( ckaID text primary key )} certdb eval {create table reqDB (ckaID text primary key, nick text, sernum text, subject text, type text, datereq text, status text, reqpem text, pkcs7 text)} certdb eval {create table reqDBAr (ckaID text primary key, nick text, sernum text, subject text, type text, datereq text, status text, reqpem text, pkcs7 text)} certdb eval {create table crlDB(ID integer primary key autoincrement, signtype text, issuer text, publishdate text, nextdate text, crlpem text)} . . . 

Alle Anforderungs- und Zertifikatstabellen verwenden den Hashwert (sha1) des öffentlichen Schlüssels als Schlüssel (Primärschlüssel). Der Einfachheit halber wird der Hash-Wert aus dem Wert des öffentlichen Schlüssels in Zukunft als CKAID (PKCS # 11-Terminologie) bezeichnet. Dies erwies sich beispielsweise bei der Suche nach einem Zertifikat auf Anfrage als sehr praktisch oder umgekehrt. In der Datenbank befindet sich eine weitere crlDB-Tabelle, in der Listen mit gesperrten Zertifikaten gespeichert sind.

Der Wert des öffentlichen Schlüssels wird sowohl in der Anforderung als auch im Zertifikat gespeichert. Daher ist es vor dem Einfügen in die Datenbank erforderlich, den öffentlichen Schlüssel aus ihnen zu extrahieren und die CKAID zu berechnen. Um den Wert des öffentlichen Schlüssels zu extrahieren, ist es zweckmäßig, das pki-Paket (package require pki) zu verwenden, das Tools zum Arbeiten mit Zertifikaten und Anforderungen enthält. Dieses Paket ist jedoch nicht für die Verwendung mit russischer Kryptographie ausgelegt. Schreiben Sie in diesem Zusammenhang basierend auf den im Paket pki enthaltenen Prozeduren parse_cert und parse_csr die Prozeduren parce_cert_gost und parse_csr_gost:

 ... ## Convert Pubkey type to string set pubkey_type [::pki::_oid_number_to_name $pubkey_type] # Parse public key, based on type switch -- $pubkey_type { "rsaEncryption" { set pubkey [binary format B* $pubkey] binary scan $pubkey H* ret(pubkey) ::asn::asnGetSequence pubkey pubkey_parts ::asn::asnGetBigInteger pubkey_parts ret(n) ::asn::asnGetBigInteger pubkey_parts ret(e) set ret(n) [::math::bignum::tostr $ret(n)] set ret(e) [::math::bignum::tostr $ret(e)] set ret(l) [expr {int([::pki::_bits $ret(n)] / 8.0000 + 0.5) * 8}] set ret(type) rsa } "1.2.643.2.2.19" - "1.2.643.7.1.1.1.1" - "1.2.643.7.1.1.1.2" { # gost2001, gost2012-256,gost2012-512 set pubkey [binary format B* $pubkey] binary scan $pubkey H* ret(pubkey) set ret(type) $pubkey_type ::asn::asnGetSequence pubkey_algoid pubalgost #OID -  ::asn::asnGetObjectIdentifier pubalgost oid1 #OID -   ::asn::asnGetObjectIdentifier pubalgost oid2 } default { error "Unknown algorithm" } } ... 

Im Gegensatz zu den "nativen" Prozeduren können Sie mit Objekten nicht nur im PEM-Format, sondern auch im DER-Format arbeiten. Um mit Sperrlisten für CRL-Zertifikate zu arbeiten, wurde die Prozedur parse_crl geschrieben. Alle diese Prozeduren finden Sie im Quellcode, der in der Distribution gespeichert ist.

Auch im pki-Paket gibt es keine russischen Oids, zum Beispiel TIN, SNILS usw. Dieses Problem lässt sich leicht lösen, indem dem Array :: pki :: oids russische oid-s hinzugefügt werden:

 . . . set ::pki::oids(1.2.643.100.1) "OGRN" set ::pki::oids(1.2.643.100.5) "OGRNIP" set ::pki::oids(1.2.643.3.131.1.1) "INN" set ::pki::oids(1.2.643.100.3) "SNILS" #  set ::pki::oids(1.2.643.2.2.3) "  34.10-2001" set ::pki::oids(1.2.643.7.1.1.3.2) "  34.10-2012-256" set ::pki::oids(1.2.643.7.1.1.3.3) "  34.10-2012-512" . . . 

Mit den Funktionen parse_cert_gost und parse_csr_gost werden die Werte von CKAID (Primärschlüssel für die Datenbank) wie folgt berechnet:

 . . . array set b [parse_csr_gost $req] set pem $b(pem) set subject $b(subject) set pubkey $b(pubkey) set key1 [binary format H* $pubkey] set ckaID [::sha1::sha1 $key1] . . . 

Klicken Sie also auf die Schaltfläche "Datenbank erstellen":



Die CA-Erstellung beginnt mit der Auswahl des Verzeichnisses, in dem die Datenbank- und Kennworteinstellungen für den Zugriff auf den privaten CA-Schlüssel gespeichert werden. Das Dienstprogramm CAFL63 überwacht die Kennwortlänge sorgfältig:



Das Kennwort wird in der CA-Datenbank als Hash gespeichert:

 . . . set hash256 [::sha2::sha256 $wizData(capassword)] . . . 

Nach dem Drücken der Taste "Trace" wird der Prozess zum Erstellen eines selbstsignierten Stammzertifikats der bereitgestellten Zertifizierungsstelle gestartet. Im ersten Schritt dieses Prozesses werden Typ und Parameter des Schlüsselpaars ausgewählt:



Nachdem wir uns für das Schlüsselpaar für das Stammzertifikat des erstellten Zertifizierungszentrums entschieden haben, füllen wir das Formular mit Informationen zum Eigentümer aus (der erste Screenshot fehlt).

Beachten Sie, dass das Dienstprogramm CAFL63 über eine bestimmte „Intelligenz“ verfügt und daher nicht nur die Verfügbarkeit von Daten in den Feldern kontrolliert, sondern auch die Richtigkeit (rote Markierung - falsch) beim Ausfüllen von Feldern wie TIN, PSRN, SNILS, PSRNIP, E-Mail-Adresse usw.:



Nachdem Sie die Felder mit Informationen zum Eigentümer der Zertifizierungsstelle ausgefüllt haben, wird angeboten, die Systemeinstellungen der Zertifizierungsstelle zu ermitteln:



Wenn Sie nicht mit russischer Kryptographie arbeiten, können Sie die übliche OpenSSL verwenden. Um mit russischer Kryptographie arbeiten zu können, müssen Sie die entsprechende Version auswählen, eine Modifikation von OpenSSL. Weitere Informationen finden Sie in der heruntergeladenen Distribution unter README.txt. Da die Ausstellung qualifizierter Zertifikate geplant ist, müssen auch Informationen zur Zertifizierung der Zertifizierungsstelle selbst und des von ihr verwendeten kryptografischen Informationsschutzsystems bereitgestellt werden (siehe „Anforderungen an das Formular für ein qualifiziertes Zertifikat eines Verifizierungsschlüssels für elektronische Signaturen“, genehmigt im Auftrag des Federal Security Service of Russia vom 27. Dezember 2011 Nr. 795).

Nachdem Sie alle Felder korrekt ausgefüllt haben, wird erneut angeboten, ihre Richtigkeit zu überprüfen und auf die Schaltfläche „Fertig stellen“ zu klicken:



Nach dem Klicken auf die Schaltfläche „Fertig stellen“ wird die CA-Datenbank erstellt, in der das CA-Stammzertifikat, der private Schlüssel und die Systemeinstellungen gespeichert werden, und die Startseite des CAFL63-Dienstprogramms wird erneut auf dem Bildschirm angezeigt. Nachdem wir die Datenbank der neu erstellten Zertifizierungsstelle erstellt haben, klicken wir auf die Schaltfläche "DB öffnen", wählen das Verzeichnis mit der Datenbank aus, gehen zum Hauptarbeitsfenster der Zertifizierungsstelle und klicken auf die Schaltfläche "CA-Zertifizierungsstelle anzeigen". Stellen Sie sicher, dass das von uns erstellte Stammzertifikat vorhanden ist ::



Der nächste Schritt besteht darin, Anwendungsvorlagen / -profile für juristische Personen, Einzelpersonen und einzelne Unternehmer zu erstellen ( Tools-> Einstellungen-> Zertifikatstypen-> Neu ):



Nach Angabe des Namens des neuen Profils wird vorgeschlagen, dessen Zusammensetzung zu bestimmen:



Die Zusammensetzung des Profils wird durch den definierten Namen (eindeutiger / eindeutiger Name des Zertifikatsinhabers) bestimmt. Jedes Profil hat seine eigene Zusammensetzung mit erforderlichen (erforderlichen) oder nicht erforderlichen Feldern / Oids. Die Zusammensetzung des Profils für juristische Personen, Einzelpersonen und Einzelunternehmer richtet sich nach den Anforderungen des Bundesgesetzes 63 und dem FSB "Anforderungen an das qualifizierte Zertifikat eines Schlüsselzertifikats zur Überprüfung der elektronischen Signatur" in Russland.

Nach der Erstellung der Profile ist die Zertifizierungsstelle bereit, Bewerber und Bewerbungen von ihnen entgegenzunehmen. Wie oben erwähnt, kann der Antragsteller mit oder ohne einen fertigen Antrag auf ein Zertifikat kommen.
Wenn der Antragsteller einen fertigen Antrag eingereicht hat, wird der Antrag nach Prüfung seiner Unterlagen in die Datenbank der Zertifizierungsstelle importiert. Wählen Sie dazu im Hauptarbeitsfenster die Registerkarte „Anforderungen für Zertifikate“, klicken Sie auf die Schaltfläche „Importanforderung / CSR“ und wählen Sie die Datei mit der Anforderung aus. Danach erscheint ein Fenster mit Informationen zur Anfrage:



Nachdem Sie die Anforderung überprüft und sichergestellt haben, dass sie korrekt ausgefüllt ist, können Sie auf die Schaltfläche „Importieren“ klicken, um sie in die Datenbank einzugeben. Sofort stellen wir fest, dass beim erneuten Versuch, eine Anforderung in der Datenbank der Zertifizierungsstelle erneut zu stellen, eine Meldung angezeigt wird:



Anforderungen an die CA-Datenbank werden entweder als "Gebietsschema" markiert, das im CA-Registrierungscenter erstellt wurde, oder als "Import", das vom Antragsteller selbst erstellt wurde, und der Zeitpunkt des Eingangs des Antrags in der CA wird ebenfalls aufgezeichnet. Dies kann bei der Lösung von Konfliktsituationen hilfreich sein. Daher sollten Sie beim Importieren einer Zertifikatanforderung angeben, wer die Anforderung erstellt hat (siehe Screenshot).
Die importierte Anwendung befindet sich in der CA-Datenbank und wird im Hauptfenster auf der Registerkarte "Zertifikatanforderungen" angezeigt. Die empfangenen Anforderungen befinden sich in der Phase "Prüfung" (in der Spalte "Status" der Registerkarten "Zertifikatsanforderungen" und "Anforderungsarchiv"). Für jede neu empfangene Anfrage muss eine Entscheidung getroffen werden (Dropdown-Menü, wenn Sie mit der rechten Maustaste auf die ausgewählte Anfrage klicken):



Jeder Antrag muss entweder abgelehnt oder genehmigt werden:



Wenn die Anforderung abgelehnt wird, wird sie aus der Tabelle der aktuellen reqDB-Anforderungen in die Tabelle des reqDBArc-Anforderungsarchivs verschoben und verschwindet dementsprechend auf der Registerkarte "Zertifikatanforderungen" und wird auf der Registerkarte "Anforderungsarchiv" angezeigt.

Der genehmigte Antrag verbleibt in der Tabelle reqDB und auf der Registerkarte „Zertifikatanforderungen“, bis das Zertifikat ausgestellt wird, und landet dann auch im Archiv.

Vor der Ausstellung des Zertifikats muss mit dem Antragsteller geklärt werden, für welche Zwecke (z. B. für den Zugriff auf das State Services-Portal) das Zertifikat verwendet wird ( Tools-> Einstellungen-> Zertifikatstypen -> Individuell -> Bearbeiten -> Schlüsselnutzung ):



Um ein Zertifikat auszustellen, müssen Sie die genehmigte Anwendung auf der Registerkarte "Anforderung von Zertifikaten" auswählen, mit der rechten Maustaste klicken und im Dropdown-Menü "Zertifikat ausstellen" auswählen. Im angezeigten Widget müssen Sie das Profil auswählen, dem das Profil der Anforderung / des Zertifikats entsprechen soll:



Beachten Sie, dass Sie bei der Ausstellung eines Zertifikats die Werte eines bestimmten Felds klären können:



Das Verfahren zum Ausstellen eines Zertifikats selbst (Menüpunkt "Ausstellen eines Zertifikats") unterscheidet sich kaum von dem Verfahren zum Erstellen eines Stammzertifikats oder zum Ausstellen einer Anwendung:



Das ausgestellte Zertifikat wird sofort auf der Registerkarte Zertifikate angezeigt. In diesem Fall fällt das Zertifikat selbst in die Tabelle certDBNew der CA-Datenbank und bleibt dort, bis es veröffentlicht wird. Ein Zertifikat gilt als veröffentlicht, nachdem es in den SQL-Speicherauszug neuer Zertifikate exportiert wurde, der an einen öffentlichen Dienst übertragen wird. Durch das Veröffentlichen eines Zertifikats wird es von der Tabelle certDBNew in die Tabelle certDB verschoben.

Wenn Sie mit der rechten Maustaste auf die ausgewählte Zeile auf der Registerkarte "Zertifikate" klicken, wird ein Menü mit den folgenden Funktionen angezeigt:



Mit diesen Funktionen können Sie sowohl das Zertifikat selbst als auch die Anforderung anzeigen, auf deren Grundlage es ausgestellt wurde. Sie können das Zertifikat auch in eine Datei oder auf das Flash-Laufwerk eines Bewerbers exportieren. Die wichtigste Funktion hierbei ist die Zertifikatsperrfunktion! Es gibt eine so exotische Funktion wie das Exportieren eines Zertifikats in einen sicheren PKCS # 12-Container. Es wird verwendet, wenn der Antragsteller einen solchen Container erhalten möchte. Für solche Antragsteller wird speziell eine Anforderungsgenerierungsfunktion zum Speichern des privaten Schlüssels in einer Datei bereitgestellt (Schaltfläche "Anforderung / CSR erstellen" auf der Registerkarte "Zertifikatanforderungen").

Also begann die CA ihr Leben und stellte das erste Zertifikat aus. Eines der Ziele der Zertifizierungsstelle ist die Organisation des freien Zugangs zu ausgestellten Zertifikaten. Die Veröffentlichung von Zertifikaten erfolgt normalerweise über Webdienste. CAFL63 hat auch diesen Service:



Um Zertifikate und Listen mit gesperrten Zertifikaten in einem öffentlichen Dienst zu veröffentlichen, lädt die Zertifizierungsstelle die Zertifikate entweder vorab in Dateien hoch ( Zertifikate-> Zertifikate exportieren ) oder erstellt einen SQL-Speicherauszug der gesamten Zertifikatstabelle, aus dem Sie eine Datenbank mit Zertifikaten erstellen und in diese hochladen können SQL-Speicherauszug neuer Zertifikate, aus denen sie der Datenbank für öffentliche Dienste hinzugefügt werden:



Die grundlegende Funktion einer Zertifizierungsstelle besteht darin, eine Liste der widerrufenen Zertifikate zu veröffentlichen, ähnlich wie es das Innenministerium in Bezug auf abgelaufene Pässe tut. Das Zertifikat kann auf Antrag des Eigentümers widerrufen werden. Der Hauptgrund für den Widerruf ist der Verlust des privaten Schlüssels oder der Vertrauensverlust.

Um ein Zertifikat zu widerrufen, wählen Sie es einfach auf der Registerkarte "Zertifikate" aus, klicken Sie mit der rechten Maustaste und wählen Sie den Menüpunkt "Zertifikatssperrung":



Das Widerrufsverfahren unterscheidet sich nicht vom Genehmigungsverfahren für eine Anfrage oder die Ausstellung eines Zertifikats. Das widerrufene Zertifikat fällt in die Tabelle cerDBRev der CA-Datenbank und wird auf der Registerkarte "Widerrufene Zertifikate" angezeigt.

Die letzte Funktion der Zertifizierungsstelle - die Freigabe der CRL - bleibt eine Liste der widerrufenen Zertifikate. Die CRL-Liste wird auf der Registerkarte "Widerrufene Zertifikate" erstellt, wenn Sie auf die Schaltfläche "SOS / CRL erstellen" klicken. Der Administrator muss lediglich das CA-Kennwort eingeben und Ihre Absicht bestätigen, die CRL auszustellen:



Die ausgegebene CRL fällt in die crlDB-Tabelle der Datenbank und wird auf der Registerkarte CRL / SOS angezeigt.

Um die CRL vor dem Einfügen in die Datenbank zu analysieren, wurde die Prozedur parse_crl geschrieben:

 proc parse_crl {crl} { array set ret [list] if { [string range $crl 0 9 ] == "-----BEGIN" } { array set parsed_crl [::pki::_parse_pem $crl "-----BEGIN X509 CRL-----" "-----END X509 CRL-----"] set crl $parsed_crl(data) } ::asn::asnGetSequence crl crl_seq ::asn::asnGetSequence crl_seq crl_base ::asn::asnGetSequence crl_base crl_full ::asn::asnGetObjectIdentifier crl_full ret(signtype) #puts "KEY_TYPE=$ret(signtype)" ::::asn::asnGetSequence crl_base crl_issue set ret(issue) [::pki::x509::_dn_to_string $crl_issue] #puts "ISSUE=$ret(issue)" ::asn::asnGetUTCTime crl_base ret(publishDate) ::asn::asnGetUTCTime crl_base ret(nextDate) #puts "publishDate=$ret(publishDate)" return [array get ret] } 

Um die CRL anzuzeigen oder zur Veröffentlichung in einem öffentlichen Dienst zu exportieren, müssen Sie wie immer die gewünschte Zeile auswählen, mit der rechten Maustaste klicken und den entsprechenden Menüpunkt auswählen:



Das ist alles, die Zertifizierungsstelle ist bereit.
Bild Hier erfahren Sie, wie Sie OpenSSL zusammenstellen und mit der russischen Kryptografie verbinden können.

Source: https://habr.com/ru/post/de413493/


All Articles