Назад | Перейти на главную страницу

Ошибка SSL - невозможно прочитать сертификат сервера из файла

Сегодня я настраивал SSL для своего домена и обнаружил еще одну проблему - я надеялся, что кто-то сможет пролить свет на ..

Я продолжаю получать следующие сообщения об ошибках:

[error] Init: Unable to read server certificate from file /etc/apache2/domain.com.ssl/domain.com.crt/domain.com.crt
[error] SSL Library Error: 218529960 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[error] SSL Library Error: 218595386 error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error

Я использую Apache 2.2.16 и Ubuntu 10.10. В моем файле .crt есть теги Begin и End, и он был скопирован в точности из полученного мной электронного письма с подтверждением, что очень расстраивает!

Ура!

Изменить >> При попытке проверить .crt Кажется, что это не работает:

>> openssl x509 -noout -text -in domain.com.crt 
unable to load certificate
16851:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:Expecting: TRUSTED CERTIFICATE

Также >>

>> openssl x509 -text -inform PEM -in domain.com.crt
unable to load certificate
21321:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:Expecting: TRUSTED CERTIFICATE
>> openssl x509 -text -inform DER -in domain.com.crt
unable to load certificate
21325:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1316:
21325:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:380:Type=X509

Edit >> (Кстати, приветствия за помощь)

>> grep '^-----' domain.com.crt
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----

Просто отправили электронное письмо компании, предоставившей сертификат, они ответили>

Я проверил предоставленный вами файл CSR и могу гарантировать, что он был сгенерирован правильно. Ошибка, с которой вы сейчас сталкиваетесь, вызвана тем, что вы используете неправильную командную строку для установки CSR. Вам нужно будет изменить этот domain.com.crt из командной строки, указав соответствующее имя вашего домена.

Возможно ли, что строки заканчиваются ^ M? Это потенциальная проблема при перемещении файлов из Windows в системы UNIX. Один простой способ проверить - использовать vi в режиме "показать двоичный", с vi -b /etc/apache2/domain.ssl/domain.ssl.crt/domain.com.crt.

Если каждая строка заканчивается на Control-M, как это

-----BEGIN CERTIFICATE-----^M
MIIDITCCAoqgAwIBAgIQL9+89q6RUm0PmqPfQDQ+mjANBgkqhkiG9w0BAQUFADBM^M
MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg^M
THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wOTEyMTgwMDAwMDBaFw0x^M

у вас есть файл в формате Windows с окончанием строки, и apache их не любит.

Ваши варианты включают в себя переместить файл снова, проявляя больше осторожности; или используя dos2unix команда убрать их; вы также можете удалить их внутри vi, если будете осторожны.


редактировать: спасибо @ dave_thompson_085, который указывает, что этот ответ больше не применяется в 2019 году. То есть Apache / OpenSSL теперь терпимо относятся к строкам с завершением ^ M, поэтому они не вызывают проблем. Тем не менее, другие ошибки форматирования, несколько различных примеров которых приводятся в комментариях, по-прежнему могут вызывать проблемы; внимательно проверьте их, если сертификат был перемещен между системами.

Для всех, кто попадает на эту страницу с аналогичной ошибкой при попытке прочитать запрос на подпись сертификата (CSR) (обратите внимание, что OP читает сертификат): убедитесь, что вы используете правильную команду OpenSSL. x509 для сертификатов и req для CSR:

openssl req -in server.csr -text -noout

против

openssl x509 -in server.crt -text -noout

Просто ходил по кругу по кругу, и оказалось, что сертификаты у меня были неправильные - например,

SSLCertificateFile    /etc/apache2/ssl/server.key
SSLCertificateKeyFile /etc/apache2/ssl/server.crt

вместо того:

SSLCertificateFile    /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key

Что-то, чтобы проверить, появляется ли у вас эта ошибка.

>> openssl x509 -noout -text -in domain.com.crt 
unable to load certificate
16851:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:Expecting: TRUSTED CERTIFICATE

Подозреваю, что у вас проблема с форматом сертификата.

Выполните обе из двух следующих команд и дайте нам результат:

openssl x509 -text -inform DER -in domain.com.crt 
openssl x509 -text -inform PEM -in domain.com.crt 

В моем случае я обнаружил, что в моем сертификате были разные символы «-». Вероятно, это была проблема копирования / вставки со стороны администратора, который поместил сертификат на сервер, с заменой текстового редактора специальным символом Юникода на этом пути.

На диагностику ушли часы, и в конце концов я просто догадался об этом, отредактировал сертификат в vi, удалил существующие символы «-» и перепечатал их.

Надеюсь, это кому-то поможет.

В моем случае я столкнулся с ошибками OP, потому что тот, кто создал для меня файл .crt, действительно создал .PEM отформатированный файл и назвал его .crt.

Я обнаружил это, прочитав следующее полезное руководство: https://support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-them

все, что мне нужно было сделать, это переименовать мой .crt в .pem, и все готово! В руководстве указано, что ошибки из вопроса OP подразумевают, что входной файл уже отформатирован в формате PEM, поэтому попытка преобразовать его в .pem из формата DER не может быть сделана и фактически не нужна.

Убедитесь, что в файле сертификата нет конечных или ведущих пробелов. Тщательно убедитесь, что в вашем файле сертификата нет пробелов или пробелов, выделив весь текст и ища пробелы в текстовом редакторе.

Также проверьте, действительно ли все настроенные файлы существуют и верны.

Например: в другом сообщении вы говорите, что ваш файл .key называется мойdomain.com.crt, а в конфигурации vhost у вас есть domain.com.crt

SSLCertificateFile /etc/apache2/domain.ssl/domain.ssl.crt/domain.com.crt
SSLCertificateKeyFile /etc/apache2/domain.ssl/domain.ssl.key/domain.com.key
SSLCertificateChainFile /etc/apache2/domain.ssl/ca.crt
SSLCACertificateFile /etc/apache2/domain.ssl/gs_intermediate_ca.crt

Еще раз проверьте, что все указанные выше файлы действительно существуют и действительны.

Если кто-то еще столкнется с этой проблемой, и в ваших журналах ошибок apache будет что-то вроде:

Инициализация: невозможно прочитать сертификат сервера из файла /etc/apache2/domain.com.ssl/domain.com.crt/domain.com.crt

Убедитесь, что вы не поменяли местами файлы ключей и сертификатов в объявлениях в конфигурации apache. Я указал ключ к моему файлу сертификата и сертификат к моему файлу ключа. Этот пост помог мне разобраться в проблеме, но я хотел указать на нее как на еще одну потенциальную проблему / решение.

Моя проблема (с той же ошибкой при установке нового сервера с Apache 2.4) заключалась в том, что Apache (2.4) не мог прочитать двоичный файл .crt. Я импортировал его в свое личное хранилище сертификатов (с mmc) и экспортировал как X.509 с кодировкой base-64 (.cer). Переименовал экспортированный файл в то же имя (.crt) (используется в моем httpd-ssl.conf), и он снова заработал! Тот же сертификат работал на моем старом сервере, может быть, Apache 2.4 более строгий, чем 2.2? Удачи.

В моем случае это связано с присутствием спецификации в файле. Раздеть его можно было так:

tail -c +4 ssl.crt > ssl2.crt

Не уверен, что это всегда занимает 3 байта, поэтому лучший способ должен быть:

vi -c 'se nobomb' -c wq ssl.crt

У меня такая же ошибка, потому что Я поменял .key на .crt имена файлов

У меня была аналогичная проблема, когда я случайно использовал предоставленный заказчиком сертификат IIS типа p7b в конфигурации apache. Преобразование сертификата в формат x509 исправило ошибку. Оба типа выглядят одинаково на поверхности, но, по всей видимости, отличаются внутри.

У меня возникла эта проблема, потому что мне отправили содержимое файла .p7b в стиле IIS, вставленного в электронное письмо. Он имеет теги «----- BEGIN CERTIFICATE -----» и «----- END CERTIFICATE -----», как и .pem, а содержимое использует аналогичную кодировку base64. Я преобразовал его в файл * .pem вот так:

openssl pkcs7 -print_certs -in cert.p7b -out cert.cer

После этого Apache 2.2 был доволен.

Недавно у меня возникла эта проблема с использованием Lets Encrypt (letsencrypt) в Windows. Сертификат вернулся в кодировке UTF-16LE. Преобразование его в UTF-8 (с помощью dos2unix) решило проблему.

В моем случае это были просто пустые строки. Когда я вставлял crt-файл из ntepad или notepad ++ в nano, всегда получалось что-то вроде

sdgrgrgr rgregegreg rgrgreg
rgregreg rggregregr rgregrg

удаление пустых пространств и пути всех в строке решило проблему, например:

sdgrgrgr
rgregegreg
rgrgreg
rgregreg
rggregregr
rgregrg

В моем случае файл PEM содержал только ключ, не свидетельство.

Проверьте содержимое файла, он должен содержать строку

-----BEGIN CERTIFICATE-----