Certificado Digital no Linux (PFX ou PEM)

Fala ae galera!

Vamos lá… estou com uma aplicação web no Glassfish que utiliza certificado digital A1. Quando uso o Windows, não tenho problemas com o arquivo PFX, onde nem preciso instalar o certificado no no servidor. Tudo que preciso e ter um .jks do glassfish (no domain que utilizo) com os certificados públicos dos endereços que irei acessar.

O problema ocorre quando uso o Linux (Já testei no Fedora e Ubuntu), assim que executo o processo da aplicação que utiliza o certificado, ele me dá erro de que não pode encontrar o certificado digital, sendo que aponto para o arquivo PFX com permissão 777.

Li que no linux devemos usar o certificado de extensão PEM, usando o OpenSSL para converter PFX em PEM. Fiz a conversão e tentei apontar para o arquivo PEM no lugar do PFX e nada também. Cheguei em um ponto de instalar o certificado no servidor, assim como no Windows, seria esse o caminho? Alguém sabe como instalar o certificado PEM no Linux?

Vlw

PadrE,

No linux deveria funcionar da mesma forma. Basta você possuir o JKS que tenha os certifcados (PEM`s) dos parceiros ao qual você irá se conectar.
Ajudaria se você postasse o erro que ocorreu (stacktrace resolveria). Já vi muitos erros parecidos com o seu onde o problema era o path do arquivo JKS que você está utilizando no código, visto que paths no linux são diferentes do windows ( uso de “”, “file:///”, entre outros).

[]'s

opa… eae rafa

O erro que fica se repetindo é:

[#|2011-01-14T09:03:18.074-0200|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=19;_ThreadName=pool-5-thread-1;| StatusSoapService Erro ao validar acesso java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)|#]

O JKS que modifiquei para ter as chaves é do prórpio glassfish, que fica na pasta config do domain.

O detalhe que me veio a mente é que esse cacerts foi feito no windows, será que isso pode afetar o conteúdo do cacerts?

É … isso “implementation (algorithm: Default” soa estranho. O que você possui como base para gerar o certificado? Digo, você está conectando com um outro servidor. Qual arquivo este servidor lhe forneceu para que você importasse em seu JKS ? chave publica ? certificado ?

– abordagem alternativa

Caso voce mesmo tenha gerado o proprio certificado e chaves tanto para o servidor, como para o cliente, tente gerar a chaves e certificados do zero no linux utilizando o openssl e keytool. Caso você queira realizar esta abordagem, se preferir, te passo os comandos passo a passo.

[]'s

Está tudo no mesmo servidor, aplicação, certificados etc.
O JKS foi me passado pelo pessoal responsável pela aplicação e pela aplicação faço uma referência a um certificado PFX.

O JKS que foi modificado foi o do Glassfish que fica dentro da pasta config do domain.

No aruqivo JKS estariam as chaves publicas para acesso aos webservice que a aplicação precisa.

Vou pesquisar os comandos do keytool, mas se você tiver fácil os comandos, agradeço!

Vlw

Abaixo seguem os passos quando se deseja construir do zero a parte do servidor (chave privada) e do cliente (parte publica da coisa). No seu caso, se o servidor (maquina na qual vc ira se conectar) ja possuir a privada, voce soh executara a partir do passo 4, a partir do certificado que o parceiro (dono da maquina que vc ira se conectar) lhe forneceu.

  1. Cria a chave privada com X bits
    openssl genrsa -des3 -out {nome_chave_privada.pem} 2048

2.a Cria um certificado auto assinado
openssl req -new -x509 -key {chave privada criada} -out {nome_certificado_autoassinado.pem} -days 1095

  1. importa uma chave privada + certificado assinado em um JKS keystore (para o servidor Java utilizar)
    openssl pkcs12 -export -inkey {chave privada} -in {chave publica/certificado auto-assinado} -out {saida .p12} -name {identificacao do certificado entre aspas duplas}

java PKCS12Import {input.p12} {output.jks}

  1. cria um JKS truststore a partir de um certificado assinado OU A PARTIR DO CERTIFICADO QUE O PARCEIRO LHE FORNECEU
    keytool -storepass changeit -keystore {nome_do_truststore_a_ser_gerado.jks} -importcert -alias alias_do_ceritificao_dentro_do_jks -file {certificado_autoassinado_ou_fornecido.pem} -trustcacerts

Depois de ter o trustore.jks é só adicioná-lo no glassfish e é para funcionar.

Qualquer duvida estamos ae.

[]`s

Vamos lá… o que fiz até agora…

Tenho um certificado p7b que o servidor onde irei acessar me forneceu. Então converti esse p7b em um pem com o comando abaixo:

openssl pkcs7 -inform DER -outform PEM -in SEFAZSP_homologacao.p7b -out SEFAZSP_homologacao.pem -print_certs

O próximo passo foi importá-lo para dentro do cacerts.jks:

keytool -storepass changeit -keystore meucacerts.jks -importcert -file SEFAZSP_homologacao.pem -trustcacerts

E esse último gerou o erro:
error: java.lang.Exception: Input not an X.509 certificate

Executei esses comando no Win. No linux deu erro logo no primeiro:
openssl pkcs7 -inform DER -outform PEM -in SEFAZSP_homologacao.p7b -out SEFAZSP_homologacao.pem -print_certs
unable to load PKCS7 object
3508:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1316:
3508:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:380:Type=PKCS7

Tentei executar como root tb…