Я могу заставить браузер активировать аутентификацию с помощью смарт-карты, например, ID-карты, когда файл php защищен SSLVerifyClient в apache conf.
Теперь мне нужно отображать index.php, как правило, без проверки подлинности смарт-карт, и иногда эта же страница должна быть аутентифицирована пользователем.
doStuff(); if ($needed==1) authenticateUser(); doMoreStuff(); 
Что должно быть authenticateUser () содержать так, чтобы вызвать его заставляет браузер запрашивать PIN-код смарт-карты?
  Вы смешиваете вещи немного. 
 authenticateUser();  выполняется на сервере, тогда как проверка подлинности происходит на клиенте.  Вы не можете остановиться в середине запуска PHP-скрипта для проверки подлинности клиента, а затем продолжить запуск PHP-скрипта. 
В качестве решения вашего вопроса это может работать в вашем случае:
 if(authenticationNeeded) { // redirect to a page that requires authentication that does what index was supposed to do. redirect('index_ssl.php'); } 
  Используя .htaccess вы можете определить, что SSLVerifyClient require только для некоторых каталогов / файлов. 
  Ключевым моментом является то, что ваш веб-сервер (в данном случае Apache) требует сертификата клиента для предоставления доступа к любым каталогам / файлам, для которых SSLVerifyClient require указать SSLVerifyClient require . 
В заключение, нет никакого способа делать то, что вы хотите. У вас могут быть только файлы / каталоги, которые требуют или не требуют сертификата клиента. Нет смысла останавливаться в середине файла PHP, чтобы требовать сертификат клиента, но вы можете перенаправить на тот, который требует его.