Como posso dizer ao Apache para forçar a autenticação do cliente, mas para autorizar com base em um listado de certificados confiáveis em vez de uma CA?

1

Estou tentando criar um servidor Apache SSL para ser usado em testes de pré-produção e que, mesmo na produção, seria acessado por menos de 5 usuários. Por causa da pequena base de usuários, senti que a maneira mais fácil de gerenciar certificados seria autonegá-los e informar explicitamente ao Apache para confiar apenas no pequeno número de certificados que criamos. Pelo que posso dizer, parece que o Apache precisa de uma CA, embora eu esteja esperando que haja uma maneira de contornar isso.

Além disso, no que diz respeito ao desenvolvimento, eu costumo conhecer minhas coisas, mas sou muito mais novo em ser um administrador de sistemas, então quanto mais simples, melhor em termos de soluções.

Como nota lateral, também vi este post: aqui que eu acho que é semelhante ao que eu estou pedindo, mas não é bem uma solução que estou procurando. Idealmente, eu poderia apenas usar o openSSL para gerar certs autoassinados rapidamente e adicionar cópias deles a um diretório, então quando eles forem usados para acessar o servidor, o Apache permitirá que a conexão seja criada.

    
por themaestro 28.07.2010 / 17:29

2 respostas

2

Existem duas coisas que você precisa fazer.

Primeiro, você precisa gerar certificados para os navegadores que você vai conectar.

Em seguida, você precisa definir o Apache para exigir esses certificados para alguma pasta.

A parte do apache é simples - basta adicionar isso ao seu /etc/apache2/sites-enabled/your_apache_file.conf:

<Location /path/to/folder>
SSLVerifyClient require
SSLVerifyDepth 1
</Location>

Agora, supondo que você tenha configurado seu SSL do Apache assim:

SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
SSLCACertificateFile /etc/apache2/ssl/ca.crt

SSLVerifyClient optional
SSLOptions +StdEnvVars +ExportCertData

Você também precisa se configurar como uma autoridade de certificação.

Aqui está um trecho do código Python que usamos para gerar certificados de clientes - isso deve dar uma boa ideia do que você precisa fazer a partir daqui:

commonname = "name_of_client_machine"


serial_file = open('/usr/local/my/web/certs/ca.srl','r')
serial = serial_file.read().strip()

cert_folder = '/usr/local/my/web/certs/clients/%s_%s' % (serial,commonname)

try:

    os.makedirs(cert_folder, 0755)

except OSError:
    pass



commands.getstatusoutput("sed s/hostname/%s/ /usr/local/my/web/certs/client.tpl > %s/client.tpl" % (commonname,cert_folder))

commands.getstatusoutput("openssl genrsa -des3 -passout pass:mypassword -out %s/web_client.key 4096" % cert_folder)

commands.getstatusoutput("openssl req -new -key %(cert_folder)s/web_client.key -out %(cert_folder)s/web_client.csr -config %(cert_folder)s/client.tpl -passin pass:mypassword" % ({'cert_folder':cert_folder}))

commands.getstatusoutput("openssl x509 -req -days 3650 -in %(cert_folder)s/web_client.csr -CA /usr/local/my/web/certs/ca.crt -CAkey /usr/local/my/web/certs/ca.key -out %(cert_folder)s/web_client.crt -passin pass:mypassword"  % ({'cert_folder':cert_folder}))

commands.getstatusoutput("openssl pkcs12 -export -clcerts -in %(cert_folder)s/web_client.crt -inkey %(cert_folder)s/web_client.key -out %(cert_folder)s/web_client.P12 -passin pass:mypassword -passout pass:mypassword" % ({'cert_folder':cert_folder}))

Agora, pegue o arquivo .p12 e importe-o no navegador do cliente. Você será perguntado pela senha (que acima era apenas 'mypassword'), e então ela estará instalada e pronta para ser usada.

    
por 28.07.2010 / 17:58
0

Depois de muita luta, finalmente encontramos uma solução. Não é totalmente ideal, mas agora que estamos no lugar, parece estar funcionando bem.

No Apache, primeiro precisávamos ativar o mod_ssl, requerer a autenticação do cliente e, em seguida, definir a profundidade da verificação como 1. Então tivemos que definir o certificado e a chave do servidor para algo gerado e assinado por nossa CA ( em um minuto) e defina SSLCACertificateFile para o certificado da CA. Na medida em que a criação da sua CA, este guia foi bem detalhada e eu achei muito preciso. Além de modificar ligeiramente alguns caminhos de diretório para que funcionasse com o Ubuntu, ou seja, usando / etc / ssl, funcionou bem. Criamos uma CA e, em seguida, geramos um certificado de CA. Em seguida, geramos uma chave do servidor e uma solicitação do servidor e assinamos a solicitação com a CA. Em seguida, definimos o Apache para usar o novo certificado e chave do servidor. Nesse ponto, você conseguiu fazer a autenticação do servidor, mas não a autenticação do cliente. Para fazer a parte posterior, acabamos de construir alguns dos exemplos já no link acima. O processo para criar / assinar combinações de teclas cert é genérico, ou seja, você pode usar o combo em um servidor ou um cliente. Então, apenas repetimos o processo para criar um certificado de cliente (e poderíamos fazer isso de novo e de novo para criar mais). Uma vez tivemos que convertemos os dois arquivos em um .pk12

# openssl pkcs12 -export -in certs/client.crt -inkey private/client.key -out ~/clientcred.p12

E finalmente importamos o cred para o firefox. Também adicionamos nossa nova CA à lista interna de CAs confiáveis do firefox. Espero que isso ajude qualquer outra pessoa que esteja tentando algo semelhante.

    
por 29.07.2010 / 21:33