После некоторого обширного расследования мы нашли проблему маршрута...
У клиента был дополнительный индекс на таблице, которая бросала все из синхронизации, но только на их сервере. При локальном тестировании, или резервное копирование LDF/MDF или восстановление на новую базу данных - проблема не была показана.
На клиентской машине, на исходном mdf/mdf, будучи сохраненным и восстановленный, или на новой базе данных, которая была восстановлена на, проблема показана 100% надежно.
Как доказательство, что индекс был причиной, мы могли удалить и повторно добавить индекс и видеть нежелательное поведение произойти и затем не произойти.
Вы можете создать файл CA из всех ваших сертификатов клиентов, и это должно работать.
Однако вы больше не сможете доверять сертификату CN для аутентификации отдельных пользователей.
Если вы не хотите перезапускать Apache, вы все равно сможете сделать это, используя каталог CA вместо пакета CA с помощью директивы SSLCACertificatePath (вам нужно будет создать символическую ссылку или переименовать сертификаты, чтобы доступны по хешу)
Вы можете это сделать, в Apache Httpd нет ничего для нормальной аутентификации. Вам понадобится некоторый код в вашем приложении, чтобы справиться с этим (т.е. выполнить аутентификацию на уровне PHP / CGI / Java): это более или менее исключает простые файлы (HTML, JS, ...), к сожалению.
Для этого ,
SSLVerifyClient optional_no_ca
, чтобы разрешить принятие любого сертификата (что касается уровня SSL / TLS Apache Httpd); SSLCADNRequestFile
на файл с пустой строкой: это заставит CertificateRequest
отправить пустой список certificate_authorities
, который будет указывать клиенту, что он потенциально может отправить что угодно (не то чтобы он гарантирует, что сервер будет принять это). Такое поведение явно разрешено TLS 1. 1 (а предыдущие версии умалчивают об этом). На практике он работает с SSLv3 и TLS 1.0 с большинством браузеров. Это позволит представить и принять любой сертификат во время подтверждения SSL / TLS. К сожалению, это также удаляет любые аутентификации, которые Apache Httpd сделал бы, поэтому ни одна из директив, проверяющих CN или другие части сертификата, не будет иметь никакого смысла (поскольку вы не можете доверять содержимому сертификата).
Все, что вы знаете на этом этапе, это то, что у клиента есть закрытый ключ для открытого ключа в сертификате, который был представлен (в противном случае шаг TLS CertificateVerify
завершился бы ошибкой). Вы даже не можете доверять предмету этого сертификата. Этот сертификат будет в SSL_CLIENT_CERT
. Вам понадобится код, чтобы прочитать его и извлечь его открытый ключ, прежде чем сравнивать его с вашим известным списком открытых ключей. (Это также может работать, если вы передадите этот сертификат клиента через mod_proxy
, например, на внутренний сервер Java.) Существуют библиотеки в PHP, Perl, Python, Java (выберите язык, который вы предпочитаете) для анализа содержимое сертификата, но это потребует некоторого программирования и, конечно, будет аутентифицировать только запросы, которые обрабатываются таким приложением.