
Я запускаю простое веб-приложение PKI на PHP, которое использует команды оболочки OpenSSL и хранит информацию в текстовой базе данных. Мне приходится иметь дело с не-ASCII-вводными символами (например, немецкими), но когда создается новый сертификат, поля превращаются в
[...] /C=DE/ST=H\xC3\xA4mburg/L=H\xC3\xA4mburg/O=\xC3\x9FBCD/OU=\xC3\xA4BC/ [...]
я добавил
[req]
utf8 = yes
string_mask = utf8only
name_opt = multiline,-esc_msb,utf8
в файлы конфигурации OpenSSL, а сертификаты создаются с помощью
openssl req -utf8 [...]
openssl ca -utf8 [...]
Программа записывает временные файлы конфигурации, используемые для запроса и создания сертификата пользователя. Я проверил, и поля в файле конфигурации пользователя в порядке, как и в CA. Проблема возникает, когда OpenSSL создает сертификаты. База данных и сертификаты содержат эти коды вместо правильных символов.
Я также попытался преобразовать файл базы данных в UTF-8, iconv
но файл остался в формате US-ASCII.Этот подходизменяет file --mime-encoding
вывод на utf-8, но OpenSSL продолжает записывать новые записи так же, как и раньше.
Я также упомяну, что я отправляю заголовок utf-8 и настраиваю его AddDefaultCharset utf-8
в virtualhosts. Локаль устанавливается de_DE.utf8
в коде и на сервере.
Что я упускаю? Любая помощь приветствуется.
решение1
Я тоже боролся с этим несколько дней, и наконец-то это заработало.
-utf8
в командной строке и utf8 = yes
в конфигурации кажется немного излишним.
Я использовал -utf8 -nameopt multiline,utf8
командную строку, я ничего не экранировал в файле конфигурации (я пробовал несколько версий, но ни одна не сработала), в котором говорится:Текст в кодировке UTF-8 Unicodeкогда я бегу file <configfile>
.
Моя локаль и cli настроены на использование ввода и вывода utf-8, конфигурация похожа на:
[req]
prompt = no
distinguished_name = subject
[subject]
C = DE
ST = myutf8state
L = myutf8locality
O = myutf8organization
OU = myutf8organizational unit
CN = my.common.name
Мне помогли два вопроса на stackoverflow: