Autenticação de certificado do Salesforce.com por meio de um proxy reverso

2

Estou tentando permitir que o Salesforce.com se conecte a uma instância do biztalk que fica dentro da nossa rede corporativa. No meio, é um proxy reverso e uma série de firewalls.

Quando uma solicitação HTTP padrão é feita contra o proxy reverso, o servidor biztalk responde corretamente. É importante observar que o próprio proxy reverso parece estar funcionando corretamente.

O que preciso fazer é ativar a segurança, limitando o acesso a esse serviço da Web a clientes autorizados. Inicialmente, isso é apenas Salesforce.com.

A salesforce.com forneceu seu certificado SSL para autenticação e eu coloquei esse certificado no arquivo httpd.conf com a diretiva SSLCACertificateFile.

    SSLVerifyClient require
    SSLVerifyDepth 1
    SSLCACertificateFile /opt/apache/veri/auth.crt

Quando SalesForce se conecta e essas diretivas estão em uso, o erro "javax.net.ssl.SSLPeerUnverifiedException: par não autenticado" é gerado.

A remoção do SSLVerifyClient requer a retomada das operações normais.

    
por user176514 04.06.2013 / 20:52

2 respostas

0

A autenticação SSL requer o CA Chain inteiro , incluindo a CA raiz no CAfile ou no CApath. A suposição feita por mim era que a CA raiz na loja de certificados do OpenSSL era adequada - não era.

A adição da autoridade de certificação raiz verisign permitiu que o certificado fosse verificado

<Location />
 SSLVerifyClient optional
 SSLVerifyDepth 10
 SSLRequire (%{SSL_CLIENT_S_DN_CN} eq "<Partner CN name>")
 SSLCACertificatePath /opt/apache/veri/CA
</Location>

Não se esqueça de refazer o caminho / opt / apache / veri / CA se você estiver usando a diretiva SSLCACertificatePath.

    
por 12.06.2013 / 18:13
1

Aqui está o problema:

SSLCACertificateFile /opt/apache/veri/auth.crt

Como você pode ver em a documentação do apache , SSLCACertificateFile significa o caminho para o certificado da CA para o certificado do cliente, não para o próprio certificado do cliente. Não há como exigir um certificado de cliente específico como tal. O que você pode fazer, no entanto, é exigir que o certificado seja emitido por uma determinada autoridade de certificação e, em seguida, verificar o CN do certificado.

Então, você precisa pedir ao seu cliente para enviar a parte pública do certificado que assinou o certificado. Você também precisa verificar qual CN seu certificado contém:

$ openssl x509 -in path/to/clientcert.crt  -noout -text|grep Subject|grep CN
        Subject: C=US, ST=Something, L=Something, O=Organization Name, OU=SomeOU, CN=host.name.example.com

Em seguida, altere sua configuração para ficar assim:

SSLVerifyClient require
SSLRequire %{SSL_CLIENT_S_DN_CN} eq "host.name.example.com" 
SSLVerifyDepth 1
SSLCACertificateFile /opt/apache/veri/auth.crt

Isso diz ao Apache que ele aceitará uma conexão SSL, mas somente se o nome do host no certificado for host.name.example.com e o certificado tiver sido assinado pela autoridade de certificação cujo certificado está em /opt/apache/veri/auth.crt .

Há mais informações em a documentação do mod_ssl no Apache com vários exemplos de como você pode usar SSLRequire para testar variáveis em certificados de clientes.

    
por 05.06.2013 / 09:27