Как узнать путь к доверенному сертификату openssl?
Как я могу узнать, где мой установленный openssl ищет установленные сертификаты (доверенные)? иногда это /etc/ssl/cert, но у меня есть новая система, и она не работает с этим путем.
Спасибо! С уважением, Крис
4 ответа
Этот фрагмент кода C, скомпилированный с OpenSSL, скажет вам:
#include <stdlib.h>
#include <stdio.h>
#include <openssl/x509.h>
int main()
{
const char *dir;
dir = getenv(X509_get_default_cert_dir_env());
if (!dir)
dir = X509_get_default_cert_dir();
puts(dir);
return 0;
}
Путь по умолчанию для поиска сертификатов может отличаться на разных платформах. Вы можете посмотреть конфигурацию вашей системы, используя следующую команду:
$ openssl version -d
OPENSSLDIR: "/etc/pki/tls"
Путь, который вы ищете, это "Каталог для файлов OpenSSL". Как ответил @tnbt, openssl version -d
(или же -a
) дает вам путь к этому каталогу. OpenSSL ищет здесь файл с именем cert.pem
и подкаталог certs/
, Сертификаты, которые он там находит, считаются доверенными openssl s_client
а также openssl verify
(источник: статья " Какие центры сертификации распознает OpenSSL?").
% openssl version -d
OPENSSLDIR: "/opt/local/etc/openssl"
% ls -l /opt/local/etc/openssl/cert*
lrwxr-xr-x 1 root admin 40 29 Nov 02:05 /opt/local/etc/openssl/cert.pem -> /opt/local/share/curl/curl-ca-bundle.crt
% head -10 /opt/local/etc/openssl/cert.pem
##
## Bundle of CA Root Certificates
##
## Certificate data from Mozilla as of: Fri Nov 24 08:00:26 2017 GMT
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates
## file (certdata.txt). This file can be found in the mozilla source tree:
## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
##
...[rest of file omitted]...
Оказывается, установщик, который установил OpenSSL в моей системе, также установил cert.pem
как символическая ссылка на пакет сертификатов центра сертификации из инструмента cUrl
, Те, в свою очередь, пришли из Мозиллы.
Возможно, в этом файле или каталоге ничего не установлено, или у вас может быть другой набор сертификатов. Это будет влиять на то, какие сертификаты сервера проверяет OpenSSL.
OpenSSL команды, такие как s_client
поддержка, я думаю, начиная с версии 1.1, варианты -no-CAfile
а также -no-CApath
, Они позволяют игнорировать сертификаты в этом файле и каталоге соответственно на протяжении одной команды. (Я не могу воспроизвести это, потому что я все еще использую версию 1.0.2, и у нее нет этих опций.)
Как я могу узнать, где мой установленный openssl ищет установленные сертификаты (доверенные)?
Ты не можешь OpenSSL по умолчанию ничего не доверяет и не ищет сертификатов. Вы должны дать ему указание, чему доверять. Есть даже тема часто задаваемых вопросов, покрывающая это: Почему <SSL program>
сбой с сертификатом проверить ошибку?:
Эта проблема обычно указывается в сообщениях журнала, в которых говорится что-то вроде "невозможно получить сертификат локального эмитента" или "самозаверяющий сертификат". Когда сертификат проверен, его корневой CA должен быть "доверенным" OpenSSL, это обычно означает, что сертификат CA должен быть помещен в каталог или файл и соответствующая программа настроена для его чтения. Программа OpenSSL 'verify' ведет себя аналогичным образом и выдает похожие сообщения об ошибках: для получения дополнительной информации посетите страницу руководства программы verify(1).
Ответ Кафа вроде правильный, но OpenSSL его не использует, и там ничего нет...
$ grep -R X509_get_default_cert_dir *
...
crypto/x509/x509_def.c:const char *X509_get_default_cert_dir(void)
...
Обратите внимание, что это ничего не касается в apps/
каталог. apps/
где все образцы и утилиты OpenSSL, как openssl req
, openssl rsa
, openssl dsa
, openssl x509
, openssl sign
, openssl verify
, так далее.
Затем:
$ cat crypto/x509/x509_def.c
...
const char *X509_get_default_cert_dir(void)
{ return(X509_CERT_DIR); }
...
$ grep -R X509_CERT_DIR *
crypto/cryptlib.h:#define X509_CERT_DIR OPENSSLDIR "/certs"
И наконец:
$ ls /usr/local/ssl/certs/
$
Как я уже сказал, его не используют и там ничего нет.