2013-05-10 6 views
7

Próbuję wygenerować żądanie podpisania certyfikatu z tematem UTF-8.Jak stworzyć CSR z tematem utf8 w openssl?

$ openssl req -utf8 -nodes -newkey rsa:2048 -keyout my.private_key.pem -out my.csr.pem -text 
Generating a 2048 bit RSA private key 
......................................................................................................................................................................+++ 
......+++ 
writing new private key to 'my.private_key.pem' 
----- 
You are about to be asked to enter information that will be incorporated 
into your certificate request. 
What you are about to enter is what is called a Distinguished Name or a DN. 
There are quite a few fields but you can leave some blank 
For some fields there will be a default value, 
If you enter '.', the field will be left blank. 
----- 
Country Name (2 letter code) [PL]: 
State or Province Name (full name) []:Zażółć gęślą jaźń 
problems making Certificate Request 
12376:error:0D07A07C:asn1 encoding routines:ASN1_mbstring_ncopy:illegal characters:a_mbstr.c:162: 

kodowania Terminal jest UTF-8, mam ten sam problem, kiedy używać wiersza poleceń przedmiot (...) -subj /C=PL/ST=zażółć\ gęślą\ jaźń/O=my-company/CN=ThisIsMeForSure

Kiedy pominąć przełącznik -utf8, CSR jest generowany ze wszystkie znaki spoza ASCII zastąpiony z notacją szesnastkową (np. ó staje się \xC3\xB3). Taki CSR nie może być odczytany poprawnie z php() - oryginalny ó jest czytany jako cztery bajty, reprezentujące dwie dziwne postacie ...

Co robię źle?

+0

Używanie 'openssl req' * bez * niestandardowego pliku conf oznacza, że ​​nazwa serwera będzie znajdować się w' CN'. Ta praktyka jest przestarzała zarówno przez fora IETF, jak i CA/B. Zamiast tego należy upewnić się, że nazwy serwerów (i adresy IP) znajdują się w 'SAN'. Zobacz na przykład [Jak utworzyć samopodpisany certyfikat z openssl?] (Http://stackoverflow.com/a/27931596) (odpowiedź jest używana zarówno dla żądań podpisywania, jak i samopodpisanych certyfikatów). I "string_mask = utf8only" jest ustawiony w pliku conf. – jww

Odpowiedz

1

użyć opcji string_mask:

string_mask maski

Ta opcja z wykorzystaniem pewnych typów łańcuchowych w niektórych dziedzinach. Większość użytkowników nie musi zmieniać tej opcji.

Można ustawić kilka wartości domyślnych, co jest również domyślną opcją używającą PrintableStrings, T61Strings i BMPStrings, jeśli używana jest wartość pkix, wówczas będą używane tylko PrintableStrings i BMPStrings. Jest to zgodne z zaleceniem PKIX w dokumencie RFC2459. Jeśli zostanie użyta opcja utf8only, wówczas używane będzie tylko UTF8Strings: jest to zalecenie PKIX w RFC2459 po 2003 roku. Wreszcie opcja nombstr używa właśnie PrintableStrings i T61Strings: pewne oprogramowanie ma problemy z BMPStrings i UTF8Strings: w szczególności Netscape.

+2

Podobno ta (string_mask) nie jest wystarczająca. (Daje to kodom UTF-8 znaki, ale nie traktuje ich w ten sposób podczas wyświetlania w wielu narzędziach). '-utf8' lub' utf8 = yes' to do zrobienia. (Sprawdzone empirycznie). – Cromax

+0

@Cromax, masz rację. Czy możesz odpowiedzieć na komentarz? –

+0

@Vlastimil Najwyżej oceniona odpowiedź zawiera już przełącznik '-utf8', więc nie jestem do końca pewien, czy jest taka potrzeba. Dodaje tylko dodatkowe wyjaśnienia, ale nic naprawdę ważnego. Dziękuję, ty. – Cromax

0

Dowolny kod Unicode działa dla mnie z pliku php.

<? shell_exec('openssl req -new -md5 -utf8 -key C:/Temp/1.key -out C:/Temp/1.csr -subj "/C=MD/ST=ff/O=Religie/OU=Cen/CN=中国/[email protected]" -config C:/Temp/openssl.cnf'); ?> 
9

Byłem sukces z poleceniem

openssl req -new -utf8 -nameopt multiline,utf8 -config example.com.cnf -newkey rsa:2048 -nodes -keyout example.com.key -out example.com.csr 

Gdzie example.com.cnf jest plik konfiguracyjny w UTF-8:

[req] 
prompt = no 
distinguished_name = dn 
req_extensions = ext 

[dn] 
CN = Описание сайта    # Site description 
emailAddress = [email protected] 
O = Моя компания     # My company 
OU = Моё подразделение    # My dept 
L = Москва       # Moscow 
C = RU 

[ext] 
subjectAltName = DNS:example.com,DNS:*.example.com 

poprawnie wyświetlany w Chrome, Firefoksie i Safari.

+4

W rzeczywistości opcja -nameopt multiline, utf8 jest bezużyteczna w tym kontekście. Tylko -utf8 robi różnicę.Użytkownik może nadal unikać ustawiania tej opcji w wierszu poleceń przy użyciu odpowiedniego pliku konfiguracyjnego. Wystarczy dodać utf8 = yes do sekcji [req]. To powinna być metoda preferowana, ponieważ zapomnienie opcji -utf8 w wierszu poleceń może prowadzić do niepożądanych wyników. Podczas wyświetlania certyfikatu należy użyć opcji -nameopt utf8, opcja -nameopt multiline, opcja utf8 powoduje, że wartość utf8 jest dla mnie ignorowana. OpenSSL wersja 1.0.2h. – Achille

+2

Potwierdziłem, że sama opcja '-utf8' jest wystarczająca. 'openssl req -new -newkey rsa: 2048 -sha256 -nodes -utf8 -subj"/C = JP/ST = 大阪 府/L = 大阪 市/O = 架空 の 会 社 名 の 例/OU = あ/CN = www.example.jp "-out ./clients/$client_domain/$client_domain.csr.pem -keyout./clients/$ client_domain/$ client_domain.key.pem" '$ dpkg-query -W -f = '$ {Version} \ n' openssl' 1.0.2g-1ubuntu4.5 Dzięki, Achille! – hnakamur

+0

Nie podałeś e-maili w języku innym niż angielski. Czy masz jakiś konkretny powód tego @Envek? –