
In diesem Artikel möchte ich zeigen, wie Stunnel für die Verwendung russischer kryptografischer Algorithmen im TLS-Protokoll konfiguriert wird. Als Bonus zeige ich Ihnen, wie Sie einen TLS-Kanal mit GOST-Algorithmen verschlüsseln, die im Rutoken EDS 2.0-Kryptokern implementiert sind.
Aber zuerst wollen wir herausfinden, wofür Stunnel ist. Kurz gesagt - dies ist ein Programm, mit dem Sie die gesamte Logik der Verkehrsverschlüsselung zwischen dem Server und dem Client verschieben können. Dies geschieht wie folgt: Angenommen, Sie haben einen Client und einen Server, die ohne Verschlüsselung, Authentifizierung und Integritätsprüfung miteinander kommunizieren. Sie könnten den Client und den Server so umschreiben, dass alle ausgehenden und eingehenden Nachrichten unter Berücksichtigung all dieser Punkte untereinander übertragen werden. Warum jedoch solche Schwierigkeiten, wenn Sie sie einfach auf die Schultern einer anderen Anwendung verlagern können? Um dieses Problem zu lösen, ist Stunnel genau richtig.
Sie müssen den Client nur so konfigurieren, dass der gesamte Datenverkehr an den Client-Stunnel übertragen wird. Anschließend wird eine sichere Verbindung zum Server hergestellt und Daten an den Server-Stunnel gesendet. Stunnel auf dem Server entschlüsselt den eingehenden Datenverkehr und leitet die Daten an die Servereingabe weiter. Das oben Genannte ist einfacher zu realisieren, wenn man sich dieses Diagramm ansieht.

Es ist erwähnenswert, dass der Server nicht genau Stunnel sein muss, um mit kryptografischen Algorithmen zu arbeiten. Es ist großartig, dass es fertige Demonstrationsstände gibt, die die russische Kryptographie unterstützen. Eine Liste davon finden Sie in der Präsentation mit RusCrypto'2019 .
Wir benötigen stabile Server, die eine bidirektionale Authentifizierung ermöglichen.
Wir haben CryptoPro-Server als die zuverlässigsten mit vollständiger Implementierung des GOST TLS-Standards ausgewählt. Danke ihnen dafür :)
Es klingt einfach genug, versuchen wir, diesen Prozess zu organisieren.
Vorbereitender Schritt
Wir werden brauchen:
- Öffnetsl
- Stunnel
- rtengine
- Zugriff auf CryptoPro-Testserver zur Überprüfung der TLS-Verbindung
OpenSSL für Windows kann von hier und für Linux-Benutzer aus Repositorys heruntergeladen oder selbst zusammengestellt werden, indem die neueste Version von hier heruntergeladen wird. Es kann auch aus dem Rutoken SDK entnommen werden, aus dem Verzeichnis openssl \ openssl-tool-1.1 , dieses Archiv wird uns weiterhin nützlich sein, als es enthält den für uns interessanten Motor. Stunnel finden Sie hier . Für den Betrieb wird die Version> = 5.56 benötigt.
Sie können Rtengine vom Rutoken SDK herunterladen. Es befindet sich im Verzeichnis openssl \ rtengine \ bin . Sie müssen es dort ablegen, wo alle OpenSSL-Engines gespeichert sind. Sie finden den Weg zu ihnen mit
openssl.exe version -a
Es reicht jedoch nicht aus, die Engine in den gewünschten Ordner zu verschieben, sondern Sie müssen lediglich openssl selbst konfigurieren, um damit arbeiten zu können. Wir finden heraus, wo sich die Konfigurationsdatei openssl.cnf mit demselben Befehl wie oben befindet (unter Windows wird stunnel mit einer eigenen Version von openssl ausgeliefert, daher befindet sich die Konfigurationsdatei im Pfad \ to \ stunnel \ config \ openssl.cnf
Stellen wir sicher, dass rtengine verbunden ist. Dazu verbinden wir ein Token und listen alle Verschlüsselungsalgorithmen auf:
openssl ciphers -v
Ich möchte Sie daran erinnern, dass Sie in Windows nach openssl suchen müssen, das neben stunnel liegt
Wenn unter ihnen unsere GOSTs anwesend sein werden, ist alles richtig eingerichtet.
Die Zeit ist reif für das Interessanteste: die Überprüfung der Verbindung zu den GOST-Testservern CryptoPro. Eine Liste dieser Server finden Sie hier ( https://www.cryptopro.ru/products/csp/tc26tls ). Jeder dieser Server arbeitet mit eigenen Algorithmen für die Authentifizierung und Verschlüsselung. Außerdem werden an den Ports 443, 1443, 2443, ... Dienste gestartet, die nur bestimmte Parameter akzeptieren. So wird beispielsweise unter http://tlsgost-256auth.cryptopro.ru die Verschlüsselung mit Authentifizierung unter Verwendung der Algorithmen GOST2012-GOST8912-GOST8912 und eines 256-Bit-Schlüssels durchgeführt. Außerdem verwendet Port 443 XchA-ParamSet, Port 1443 XchB-ParamSet, Port 2443 A-ParamSet usw.
Nachdem wir wissen, welchen Schlüssel wir benötigen, lassen Sie uns das Stammzertifikat vom Testserver abrufen, die Schlüssel für die Arbeit ausarbeiten und die Anforderung für unser Zertifikat unterzeichnen.
Einfacher Weg (funktioniert unter Windows und Linux)
- Um das Stammzertifikat zu erhalten, besuchen Sie die Website der Test-CA LLC "CRIPTO-PRO" . Und klicken Sie auf die Schaltfläche, um ein Zertifikat zu erhalten. Eine neue Registerkarte wird angezeigt, auf der Sie die Base64-Verschlüsselungsmethode auswählen und auf die Schaltfläche "CA-Zertifikat herunterladen" klicken müssen. Die resultierende Datei certnew.cer wird gespeichert.
- Folgen Sie dem Link . Installieren Sie alle von uns angeforderten Plugins. Wir klicken auf den Button "Create key" und wählen den Algorithmus "GOST R 34.10-2012 256-bit" zur Generierung aus. Als nächstes erstellen Sie eine Zertifikatsanforderung, in der Spalte "Anwendung" können Sie alles auswählen. In der Spalte Additional Application: Client Authentication und CryptoPro Registration Center User.
- Wir öffnen erneut die Site der Test-CA, aber dieses Mal klicken wir auf die Schaltfläche "Send ready request PKCS # 10 oder PKCS # 7 encoded in Base64" . Wir fügen den Inhalt unserer Anfrage in das Feld ein, klicken auf die Schaltfläche „Issue“ und laden das user.crt- Zertifikat im Base64-Format. Die resultierende Datei wird gespeichert.
Über die Kommandozeile
Um das Stammzertifikat zu erhalten, besuchen Sie die Website der Test-CA LLC "CRIPTO-PRO" . Und klicken Sie auf die Schaltfläche, um ein Zertifikat zu erhalten. Eine neue Registerkarte wird angezeigt, in der Sie die Base64-Verschlüsselungsmethode auswählen und auf die Schaltfläche "CA-Zertifikat herunterladen" klicken müssen. Die resultierende Datei certnew.cer wird gespeichert.
Generieren Sie nun die Schlüssel.
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type GOSTR3410-2012-256:B -l --id 45
Es ist zu beachten, dass die auf dem Token generierten Schlüssel nicht vom Token kopiert werden können. Dies ist einer der Hauptvorteile ihrer Verwendung.
Erstellen Sie eine Zertifikatsanforderung:
openssl req -engine rtengine -new -key="pkcs11:id=E" -keyform engine -out client.req
Wir öffnen erneut die Site der Test-CA, aber dieses Mal klicken wir auf die Schaltfläche "Send ready request PKCS # 10 oder PKCS # 7 encoded in Base64" . Wir fügen den Inhalt unserer Anfrage in das Feld ein, klicken auf die Schaltfläche Issue und laden das user.crt- Zertifikat im Base64-Format hoch . Die resultierende Datei wird gespeichert.
Es gab die letzte Frage: Warum ist das alles ??? Warum haben wir all diese Zertifikate, Schlüssel und Anfragen erhalten?
Tatsache ist, dass sie vom TLS-Protokoll für die bidirektionale Authentifizierung benötigt werden. Es funktioniert sehr einfach.
Wir haben ein Serverzertifikat und betrachten es als vertrauenswürdig.
Unser Client überprüft, ob der Server, mit dem wir arbeiten, über ein ähnliches Zertifikat verfügt.
Der Server möchte sicherstellen, dass er mit dem Benutzer zusammenarbeitet, den er kennt. Hierfür haben wir eine Zertifikatsanforderung zur Bearbeitung unserer Schlüssel erstellt.
Wir haben diese Anfrage gesendet und der Server hat sie mit seiner digitalen Signatur signiert. Jetzt können wir dieses Zertifikat, das von der Stammzertifizierungsstelle signiert wurde, jedes Mal vorlegen und damit bestätigen, dass wir wir sind.
Stunnel konfigurieren
Es bleibt nur, um unseren Tunnel richtig zu konfigurieren. Erstellen Sie dazu eine stunnel.conf- Datei mit den Standardeinstellungen von Stunnel und schreiben Sie dort Folgendes:
; - debug = 7 output = /path/to/stunnel.log ; TLSv1 sslVersion=TLSv1 ; . engine=rtengine ; [remote system] client=yes ; engine, engineId=rtengine ; 2 ( ) verify = 2 ; CAFile = /path/to/certnew.cer ; cert=/path/to/user.crt ; . key=pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;id=E ; Stunnel accept = localhost:8080 connect = tlsgost-256auth.cryptopro.ru:2443
Wenn nun alles richtig gemacht ist, können Sie Stunnel mit unserer Konfiguration starten und eine Verbindung zum Server herstellen:
stunnel.exe /path/to/stunnel.conf
Öffnen Sie den Browser und gehen Sie zu localhost: 8080. Wenn alles korrekt ist, wird Folgendes angezeigt:

Wenn nicht, sehen wir uns die Protokolle an und verwenden den Debugger, um zu verstehen, wo das Problem liegt.
Wenn Sie Fragen haben, dann können Sie gerne kommentieren :)