Você está procurando a tag keygen . Veja a página da Mozilla .
Talvez seja melhor deixar o EJBCA fazer isso, já que lida com as peculiaridades do navegador usando o componente external-ra (eu fiz :)).
Essencialmente, construa duas instâncias de ejbca. Um para atuar como seu ca por trás de sua rede segura. Outra instância como o frontend ra que será usado para registrar seus usuários. O ca consulta o ra consultando o banco de dados MySQL do ra (arquivo de configuração externalra.properties), seleciona quaisquer CSRs pendentes, assina-os e depois retorna certificados.
Para você inscrever um usuário:
- Você deve pré-criar o usuário no destino (End entity como são chamados. O que significa que você deve criar um ca, caprofile, etc)
- Faça login na interface externalra com as credenciais da entidade final e envie o formulário.
- O navegador do cliente começará a exibir um ícone ocupado.
- O CSR atinge o ra db, e aguarda o ca para pegar o csr e soltar um certificado. Uma vez que o certificado atinge o ra db, é apresentado ao usuário.
Aqui está um script de criação do ejbca que usei . Não vai funcionar logo de cara, mas deve funcionar. Atualizar: Veja também esta pergunta e este link para uso do certificado de cliente no Apache