
Ich führe eine einfache PKI-Webanwendung in PHP aus, die OpenSSL-Shell-Befehle verwendet und Informationen in einer Textdatenbank speichert. Ich muss mit Nicht-ASCII-Eingabezeichen (z. B. Deutsch) umgehen, aber wenn ein neues Zertifikat erstellt wird, werden die Felder zu
[...] /C=DE/ST=H\xC3\xA4mburg/L=H\xC3\xA4mburg/O=\xC3\x9FBCD/OU=\xC3\xA4BC/ [...]
Ich habe hinzugefügt
[req]
utf8 = yes
string_mask = utf8only
name_opt = multiline,-esc_msb,utf8
zu den OpenSSL-Konfigurationsdateien, und die Zertifikate werden erstellt mit
openssl req -utf8 [...]
openssl ca -utf8 [...]
Das Programm erstellt temporäre Konfigurationsdateien, die zum Anfordern und Erstellen des Benutzerzertifikats verwendet werden. Ich habe es überprüft und die Felder in der Benutzerkonfigurationsdatei sowie in den CAs sind in Ordnung. Das Problem tritt auf, wenn OpenSSL die Zertifikate erstellt. Die Datenbank und die Zertifikate enthalten diese Codes anstelle der richtigen Zeichen.
Ich habe auch versucht, die Datenbankdatei in UTF-8 zu konvertieren, iconv
aber die Datei bleibt im US-ASCII-Format.Dieser Ansatzändert die file --mime-encoding
Ausgabe in UTF-8, OpenSSL schreibt neue Einträge jedoch weiterhin auf die gleiche Weise wie zuvor.
Ich werde auch erwähnen, dass ich den UTF-8-Header sende und ihn in virtuellen Hosts einstelle . Das Gebietsschema ist im Code und auf dem Server AddDefaultCharset utf-8
festgelegt .de_DE.utf8
Was übersehe ich? Jede Hilfe ist willkommen.
Antwort1
Ich habe auch tagelang damit gekämpft, bis es endlich funktioniert hat.
-utf8
auf der Befehlszeile und utf8 = yes
in der Konfiguration scheint etwas überflüssig.
Ich habe es -utf8 -nameopt multiline,utf8
auf der Kommandozeile verwendet, ich habe nichts in der Konfigurationsdatei maskiert (ich habe mehrere Versionen davon ausprobiert, aber keine hat funktioniert), die besagtUTF-8 Unicode-Textwenn ich laufe file <configfile>
.
Mein Gebietsschema und meine Befehlszeilenschnittstelle sind für die Verwendung von UTF-8-Eingabe und -Ausgabe konfiguriert. Die Konfiguration ähnelt der folgenden:
[req]
prompt = no
distinguished_name = subject
[subject]
C = DE
ST = myutf8state
L = myutf8locality
O = myutf8organization
OU = myutf8organizational unit
CN = my.common.name
Diese beiden Fragen auf Stackoverflow haben mir geholfen: