Если кто-нибудь когда-нибудь сталкивался с этим ... Я решил это и буду рад ответить на вопросы, если это поможет другим.
Оказывается, проблема не в Spring Security, а в том, как мы настроили коннекторы Tomcat.
Нам нужно было:
Правильно настройте хранилище доверенных сертификатов для Spring Boot Tomcat Secure Connector, используя приведенные ниже вызовы методов, совместимые с org.apache.coyote.http11.Http11NioProtocol
.
Также (и это важно) - установите для свойства "ClientAuth "значение" правда".
Ужасно, я копался в исходном коде для Tomcat-embed-core
, но есть ряд строк, которые эквивалентны «заставляют клиента отправлять сертификат как часть Запрос". Это следующие строки: «true», «yes», «require», «required». Они все делают одно и то же, поэтому мы просто использовали «истину».
protocol.setTruststoreFile(truststorePath); // local directory path
protocol.setTruststoreType(truststoreType); // a string of either PKCS12 or JKS
protocol.setTruststorePass(truststorePass); // whatever password you set on your Keystore
protocol.setClientAuth("true"); // Makes the client provide cert in Request over HTTPS
Соединители Tomcat плохо документированы. Есть вызов метода:
protocol.setSSLCACertificateFile(trustStorePath);
, который ничего не делает при org.apache.coyote.http11.Http11NioProtocol
.
Очевидно, он предназначен для работы с org.apache.coyote.http11.Http11AprProtocol
(Apache Portable Runtime). Для нас это была красная селедка, мы вызывали этот метод, но на самом деле он не настраивал наше хранилище доверенных сертификатов.