Para uma prova de desenvolvimento de conceito, eu tenho um servidor HAProxy em execução na minha máquina local (OSX) que espera fazer um TLS bidirecional com qualquer cliente e depois encaminhar esse cliente para um servidor da Web.
Eu segui este tutorial para obter a configuração de autenticação e este tutorial para criar meus próprios certificados. Meu arquivo de configuração haproxy é assim:
global
log 127.0.0.1 local1 notice
frontend intranet
mode http
log-format %T\ %t\ %U
log global
bind *:2000 ssl crt both.pem ca-file myCA.pem verify required
default_backend helpdesk
backend helpdesk
mode http
server helpdesk 127.0.0.1:9000 check
both.pem
tem a chave RSA privada usada para gerar a CA raiz e o próprio certificado, e myCA.pem
é apenas o certificado. Isso funciona, mas se houver uma maneira melhor de fazer isso, por favor me avise. Parece desnecessariamente repetitivo incluir o certificado duas vezes.
Eu posso me conectar ao servidor usando openssl s_client -connect 127.0.0.1:2000 -cert ./derived.crt -key ./derived.key
. Também posso conectar substituindo o certificado e a chave derivados pelo certificado raiz e pela chave. Ambas as formas, recebo um handshake de sucesso e uma conexão com o servidor web na porta 9000 (posso enviar GET e receber de volta o html). Para sanidade, também gerou uma segunda CA raiz não relacionada que não consegue fazer o handshake.
Eu tentei adicionar a CA derivada e a CA raiz aos meus certificados, seguindo as instruções do segundo tutorial. Eles são adicionados e confiáveis, mas o Safari ainda não consegue se conectar ao servidor. Ele me diz que o servidor descartou inesperadamente a conexão (suponho que isso significa que o handshake falhou ou possivelmente nem foi tentado). O Chrome diz que recebeu uma resposta vazia.
Eu vou tentar com o carteiro para ver se eu posso voltar a mesma resposta que o openssl recebe quando eu falhar (explicitamente me diz que o handshake falhou), mas eu queria perguntar isso aqui no caso de estar faltando alguma coisa Simples que um de vocês conhece. Qualquer ajuda é muito apreciada.
UPDATE: vejo que precisei adicionar https: // ao início do endereço. Agora o navegador me pede para escolher qual certificado usar. Mas, ele mostra apenas dois certificados que estão disponíveis por padrão no sistema (certificados do trabalho) e não o meu novo, que aparece na lista de chaves.
UPDATE 2: Existem duas seções diferentes no chaveiro para certificados. Um é apenas chamado de "Certificados". É para onde meus certificados vão quando eu os importo. O outro é chamado "Meus Certificados" e parece ser um subconjunto dos "Certificados". Eu estou pensando se eu puder encontrar uma maneira de adicionar meu certificado personalizado aqui, então eu posso usá-lo.