Por fim, o certificado será enviado usando o mecanismo no X509KeyManager
usado no SSLContext
usado pelo SSLSocket
/ SSLEngine
usado pelo cliente.
O SSLContext
padrão inicializa seu gerenciador de chaves usando as propriedades do sistema javax.net.ssl.keyStore*
. (Veja esta resposta SO para a diferença entre "keystore" e "trust store": ambos usam a API "keystore" / formato de armazenamento.)
O mais simples é configurar a JVM executando o Tomcat, dentro do qual seu cliente / webapp está em execução, com essas javax.net.ssl.keyStore*
properties. O padrão SSLContext
vai buscá-lo e é usado por padrão para conexões HTTPS (até mesmo bibliotecas HTTPS de terceiros tendem a usá-lo).
Se você precisar de algo mais específico para solicitações específicas, talvez seja necessário alterar o código da webapp para usar um keystore específico (ou pelo menos escolher um certificado específico) em um determinado SSLContext
para essa solicitação.
Como você configura a JVM que está executando o Tomcat dependerá do script de inicialização. Se no Windows, esta pergunta deve ajudar caso contrário, eu suspeito que há uma linha em algum lugar em catalina.sh
onde você poderia definir as propriedades do sistema.
Se você configurar o global javax.net.ssl.keyStore*
para isso, isso afetará a VM inteira, incluindo os conectores. Para evitar que seus conectores Tomcat usem esse keystore, certifique-se de que a configuração <Connector />
especifique seus próprios atributos keyStore*
(para não usar os valores das propriedades do sistema).
Se houver vários certificados (com chave privada) em seu keystore, a escolha deve ser feita automaticamente de acordo com a lista de CAs enviada pelo servidor dentro de sua mensagem CertificateRequest
. Por padrão, o gerenciador de chaves selecionará o primeiro certificado encontrado no keystore configurado que é emitido por uma CA nessa lista (ou CA intermediária). Se você precisar de algo mais específico (em particular, se houver vários candidatos válidos em seu keystore), você precisará implementar seu próprio X509KeyManager
, coloque a lógica em chooseClientAlias
, inicialize um SSLContext
com ele e faça qualquer API que faça com que esses pedidos o usem.