Реализация mtls с phpPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Реализация mtls с php

Сообщение Anonymous »

Я хочу получить mTLS на фиктивной веб-странице PHP от гостя к моему серверу Openldap.
У меня проблема, и кажется, что мой php никогда не отправляет сертификат клиента на мой сервер даже тогда, когда я указал соответствующие параметры. У меня установлен PHP 8.2 на моем гостевом клиенте, а версия slapd для моего сервера openldap находится в версии 2.5.13.
Я включил TLS и принудительно включил взаимный TLS (mTLS) на моем сервере:

Код: Выделить всё

olcTLSCACertificateFile: /etc/ldap/certs/issuing_ca.crt
olcTLSCertificateFile: /etc/ldap/certs/ldap.test.local.crt
olcTLSCertificateKeyFile: /etc/ldap/certs/ldap.test.local.key
olcTLSVerifyClient: demand
Я могу успешно подключиться к ldapsearch в csh с помощью сертификата клиента от гостя, поэтому они верны и действительны:

Код: Выделить всё

setenv LDAPTLS_CACERT /var/run/certs/f03dd1db.crt
setenv LDAPTLS_CERT /var/run/certs/229c13f4.crt
setenv LDAPTLS_KEY /var/run/certs/229c13f4.key
ldapsearch -H ldaps://ldap.test.local -b "dc=test,dc=local" -D "uid=ldap_srv,ou=users,dc=test,dc=local" -W -d 256 -x -LLL
Однако я не могу заставить его работать с моим PHP:

Код: Выделить всё

//set global options
ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_HARD);
ldap_set_option(NULL, LDAP_OPT_X_TLS_CACERTDIR, "/var/run/certs/");
ldap_set_option(NULL, LDAP_OPT_X_TLS_CACERTFILE, "/var/run/certs/f03dd1db.crt");
ldap_set_option(NULL, LDAP_OPT_X_TLS_CERTFILE, "/var/run/certs/229c13f4.crt");
ldap_set_option(NULL, LDAP_OPT_X_TLS_KEYFILE, "/var/run/certs/229c13f4.key");

// initial connection seems to work and return success:
if (!($ldap = ldap_connect($ldapserver))) {
$error = true;
}
// Also tried to set options here especially for $ldap without luck also :
//ldap_set_option(NULL, LDAP_OPT_X_TLS_CERTFILE, "/var/run/certs/229c13f4.crt");
//ldap_set_option(NULL, LDAP_OPT_X_TLS_KEYFILE, "/var/run/certs/229c13f4.key");

// set few options :
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
ldap_set_option($ldap, LDAP_OPT_DEREF, LDAP_DEREF_SEARCHING);
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, (int)$ldapver);
ldap_set_option($ldap, LDAP_OPT_TIMELIMIT, (int)$ldaptimeout);
ldap_set_option($ldap, LDAP_OPT_NETWORK_TIMEOUT, (int)$ldaptimeout);

//try to bind and check for errors (that I have):
if (!($res = @ldap_bind($ldap, $ldapbindun, $ldapbindpw))) {
$error = true;
}
if ($error == true) {
log_error(sprintf(gettext("LDAP bind failed: %s (%s)"),ldap_error($ldap), ldap_errno($ldap)));
@ldap_close($ldap);
log_error(sprintf(gettext("ERROR! Could not bind to LDAP server %s. Please check the bind credentials."), $ldapname));
return null;
}
Журналы клиентов показывают мне:

Код: Выделить всё

LDAP bind failed: Can't contact LDAP server (-1)
ERROR! Could not bind to LDAP server ldap.test.local.  Please check the bind credentials.
Журналы сервера показывают мне:

Код: Выделить всё

 slap_listener_activate(8):
>>> slap_listener(ldaps:///)
conn=1022 fd=14 ACCEPT from IP=:32896 (IP=0.0.0.0:636)
connection_get(14): got connid=1022
connection_read(14): checking for input on id=1022
connection_get(14): got connid=1022
connection_read(14): checking for input on id=1022
TLS: can't accept: Certificate is required..
connection_read(14): TLS accept failure error=-1 id=1022, closing
connection_close: conn=1022 sd=14
conn=1022 fd=14 closed (TLS negotiation failure)
Однако, когда я печатаю параметры $ldap непосредственно перед привязкой, кажется, что все правильно:

Код: Выделить всё

Option LDAP_OPT_DEREF: 'LDAP_DEREF_SEARCHING (Searching)'
Option LDAP_OPT_SIZELIMIT: 0
Option LDAP_OPT_TIMELIMIT: 25
Option LDAP_OPT_NETWORK_TIMEOUT: 25
Option LDAP_OPT_PROTOCOL_VERSION: '3 (LDAPv3)'
Option LDAP_OPT_ERROR_NUMBER: -1
Option LDAP_OPT_ERROR_STRING: Unable to retrieve value
Option LDAP_OPT_REFERRALS: '0 (Disable)'
Option LDAP_OPT_RESTART: '0 (Disable)'
Option LDAP_OPT_HOST_NAME: 'ldap.test.local:636'
Option LDAP_OPT_MATCHED_DN: Unable to retrieve value
Option LDAP_OPT_SERVER_CONTROLS: Unable to retrieve value
Option LDAP_OPT_CLIENT_CONTROLS: Unable to retrieve value
Option LDAP_OPT_X_KEEPALIVE_IDLE: 0
Option LDAP_OPT_X_KEEPALIVE_PROBES: 0
Option LDAP_OPT_X_KEEPALIVE_INTERVAL: 0
Option LDAP_OPT_X_TLS_CACERTDIR: '/var/run/certs'
Option LDAP_OPT_X_TLS_CACERTFILE: '/var/run/certs/f03dd1db.crt'
Option LDAP_OPT_X_TLS_CERTFILE: '/var/run/certs/229c13f4.crt'
Option LDAP_OPT_X_TLS_CIPHER_SUITE: Unable to retrieve value
Option LDAP_OPT_X_TLS_CRLCHECK: 'LDAP_OPT_X_TLS_CRL_NONE (No CRL Checking)'
Option LDAP_OPT_X_TLS_CRLFILE: Unable to retrieve value
Option LDAP_OPT_X_TLS_DHFILE: Unable to retrieve value
Option LDAP_OPT_X_TLS_KEYFILE: '/var/run/certs/229c13f4.key'
Option LDAP_OPT_X_TLS_PACKAGE: 'OpenSSL'
Option LDAP_OPT_X_TLS_PROTOCOL_MIN: 'LDAP_OPT_X_TLS_PROTOCOL_SSL2 (SSLv2)'
Option LDAP_OPT_X_TLS_REQUIRE_CERT: 'LDAP_OPT_X_TLS_HARD (Hard)'
Option LDAP_OPT_X_TLS_RANDOM_FILE: Unable to retrieve value
Но почему-то мой PHP явно делает что-то не так. Если я верю этому комментарию пользователя из руководства по PHP или этому комментарию из проекта github php, это должно сработать. Я не понимаю, в чем здесь проблема.

Подробнее здесь: https://stackoverflow.com/questions/792 ... s-with-php
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»