Olá,
Estou com dúvidas quanto a utilização de certificados digitais, já pesquisei a respeito, mas estou um pouco confuso quanto aos arquivos de certificado e chaves públicas e privadas, a questão é a seguinte, gerei um certificado teste.jks utilizando o keytool.exe da JDK do Java, então utilizei em minha aplicação, no meu servidor, utilizei o teste.jks, para um cliente poder utilizar um serviço em meu servidor, queria que este cliente também tivesse um certificado, eu acredito que teria que gerar um outro arquivo, com base neste teste.jks para poder gerar um certificado para um ou mais clientes com uma chave simétrica correspondente a chave do teste.jks, é isto mesmo que devo fazer?
como funciona os esquemas de chaves públicas, e privadas, e as criptografias, por exemplo, pelo que entendi um pouco, o servidor tem uma chave pública, e o cliente tem uma simétrica, e com base nesta é feita a criptografia, como funciona exatamente o fluxo?
Antes de mais nada, o que você quer dizer com “serviço”?
Se forem web services, o github do meu livro SOA Aplicado tem exemplos de uso de web services com segurança (tanto WS-* quanto REST). Mas preciso entender sua necessidade primeiro.
[]'s
sim, estava vendo no seu livro, no capítulo 6, mas na verdade os serviços não ficam expostos para os clientes, os usamos internamente, estou utilizando um protocolo de troca de mensagens, o quickfixj, e nele é possível fazer a troca de mensagens de servidor e clientes, e vice versa, e é possível utilizar SSL (Secure socket layer). Estamos desenvolvendo uma aplicação onde o cliente que contrata um serviço pode baixar dados de tributação de produtos diretamente no ERP, a preocupação é que clientes não autorizados obtenham tributações de forma ilícita, referente ao cliente ter um certificado, no livro diz:
“Da mesma forma, estes certificados também podem ser levantados pelo cliente para que o servidor confirme a identidade do cliente - mais ou menos da mesma forma que a autenticação utilizando usuário e senha. Esta forma no entanto é a mais complicada de ser utilizada na internet, e em geral é apenas utilizado em casos muito específicos.” (p. 137,138)
Eu preciso identificar a identidade de um cliente, vendo seu livro, até pensei em utilizar um Base64 para criptografar os dados trocados pelo servidor e cliente, mas acontece que o cliente vai possuir um aplicativo para intermediar estra troca até chegar na base do sistema, se outro cliente copiar este aplicativo, acredito eu que não valerá de nada a criptografia, neste caso, se um cliente mal intencionado copiar o arquivo de certificado de um outro, acredito que poderá também obter os dados.
O uso de um certificado digital indica apenas que o cliente que tem o certificado digital está de posse da chave privada, e que conhece a chave dessa chave privada.
Se ele copiou o arquivo .jks para um outro computador, e passou a senha para outra pessoa, não há como você saber se isso ocorreu, já que a chave privada pode ser obtida com sucesso.
Uma forma de evitar a cópia de certificados é usar um certificado instalado em hardware (como um smartcard ou uma USB Key). Dessa forma, mesmo que a outra pessoa conheça a senha, é necessário o tal hardware para efetivar a assinatura digital, ou seja, efetuar a conexão SSL.
Não se esqueça: base64 não criptografa absolutamente nada. Ela serve para permitir que bytes que não são imprimíveis possam ser trafegados como texto.
O pessoal nessa thread do stack overflow deu uma boa passada na teoria da coisa. A parte prática varia razoavelmente de servidor para servidor, mas se você der uma googlada por “jaas client cert authentication” ou “java client cert authentication” você deve achar umas coisas interessantes.
[]'s