O que você está procurando é chamado de Autenticação SSL Mútua .
No caso de um servidor da Web comumente implantado como Apache e uma implementação SSL / TLS comumente implantada como OpenSSL , os passos seriam os seguintes:
Existe um script útil distribuído ao lado de openssl
, CA.sh
para fazer a maior parte deste material. Sua localização é específica da distribuição. No Debian e derivados você pode localizá-lo usando:
# apt-file search CA.sh
openssl: /usr/lib/ssl/misc/CA.sh
E RedHat e derivados o equivalente (aproximado) é:
# yum provides */CA
1:openssl-1.0.1e-4.fc18.x86_64 : Utilities from the general purpose cryptography library with TLS implementation
Repo : @updates
Matched from:
Filename : /etc/pki/tls/misc/CA
Este é um script bash muito simples que facilita a criação da estrutura de diretório necessária para gerenciar uma CA (isso é descrito na seção [ CA_default ]
do openssl.cnf). Eu recomendo que você use e veja o código para saber o que ele está realmente fazendo.
# ./CA.sh -help
usage: ./CA.sh -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify
Esse script usará os padrões fornecidos em openssl.cnf e / ou você pode fornecer um arquivo de configuração como um argumento para a openssl $command
usando a opção -config
, se não estiver usando CA.sh
.
A localização do arquivo openssl.cnf
também é específica da distribuição e você pode usar os mesmos comandos acima para encontrá-lo. Aquele que você quer é aquele fornecido pelo pacote openssl
.
Você provavelmente deseja modificar as seguintes seções:
[ CA_default ]
default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
[ req ]
default_bits = 2048
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = AU
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Some-State
localityName = Locality Name (eg, city)
0.organizationName = Organization Name (eg, company)
0.organizationName_default = Internet Widgits Pty Ltd
#1.organizationName = Second Organization Name (eg, company)
#1.organizationName_default = World Wide Web Pty Ltd
organizationalUnitName = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
- Gerar a CA
Depois de ter editado openssl.cnf
para atender às suas necessidades, você pode gerar um certificado de CA. Dependendo se você precisa dessa CA assinada por uma AC de terceiros reconhecida ou não, você pode gerar uma CA autoassinada ou uma CSR para ser enviada para assinatura.
./CA.sh -newca
Você será solicitado interativamente a fazer algumas perguntas, os padrões aparecerão entre colchetes. Você reconhecerá as opções modificadas em openssl.cnf
aqui.
- Gerar um certificado para o servidor
Você pode criar uma solicitação de certificado para o servidor usando o mesmo script:
./CA.sh -newreq
Mais uma vez, você será solicitado a fazer várias perguntas, o mais importante é o Nome Comum do certificado, que deve corresponder ao nome DNS resolvível para o IP do servidor (ou você pode usar outros meios, como /etc/hosts
, não recomendado, difícil de manter e dimensionar)
O que você obterá é uma Solicitação de Assinatura de Certificado (CSR abreviada). Isso será assinado pela autoridade de certificação (CA) que você criou antes.
./CA.sh -sign
- Gerar certificados para os clientes
Repita as etapas de criação de um CSR e recebimento da assinatura pela CA. Ao fazer isso, preste muita atenção em como você preenche os campos Nome Comum, Organização e Unidade Organizacional, pois eles serão necessários posteriormente para configurar o servidor.
Uma maneira simples de distribuir os certificados do cliente junto com suas respectivas chaves privadas e o certificado de CA está usando pacotes configuráveis p12:
openssl pkcs12 -export -in Certificates/client.pem -inkey client.key -certfile CA.pem
-out clientcert.p12
- Configurar o servidor
Vamos supor que o servidor a que você está se referindo seja um servidor web Apache. Depois de ter o certificado do servidor, você configura o VHOST
apropriado para veicular qualquer conteúdo que será protegido pela autenticação mútua de SSL. Um exemplo pode ser este phpmyadmin
hosts virtuais. Isso está funcionando em um servidor Apache 2.4, então, por favor, não o use como está e cuidadosamente revise e teste para adaptá-lo às suas necessidades.
Listen 443 https
<VirtualHost 120.120.120.120:443>
DocumentRoot "/srv/www/html"
ServerAdmin [email protected]
SSLCACertificateFile /etc/pki/CA/cacert.pem
SSLCertificateFile /etc/pki/tls/private/company.com/newcert.pem
SSLCertificateKeyFile /etc/pki/tls/private/company.com/newkey.pem
SSLCARevocationCheck chain
SSLCARevocationFile /etc/pki/CA/crl/crl.pem
SSLEngine on
SSLStrictSNIVHostCheck on
SSLVerifyClient require
SSLVerifyDepth 5
ServerName phpmyadmin.company.com
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteCond %{HTTPS} !=on
RewriteRule . - [F]
ErrorLog "|/usr/sbin/rotatelogs -L /var/log/httpd/foo/error.log -f /var/log/httpd/foo/error.log.%Y%m%d 86400"
CustomLog "|/usr/sbin/rotatelogs -L /var/log/httpd/foo/access.log -f /var/log/httpd/foo/access.log.%Y%m%d 86400" logstash_json
<Directory /usr/share/bar/>
Require ssl
Require ssl-verify-client
SSLRequireSSL
SSLOptions +FakeBasicAuth +StrictRequire
SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 256
SSLRequire %{SSL_CLIENT_S_DN_O} eq "Awesome Company" \
and %{SSL_CLIENT_S_DN_OU} eq "Development" \
and %{SSL_CLIENT_S_DN_CN} in {"John Doe", "Jane Doe"}
SSLRenegBufferSize 131072
</Directory>
</VirtualHost>
Você pode usar quantos controles de acesso por diretório forem necessários. A parte importante é que os certificados de clientes mostrados devem estar em conformidade com as restrições impostas pelas diretivas SSLRequire
, ou seja, devem corresponder à Organização, Unidade Organizacional e Condições de nome comum (ou outros campos do certificado como você vê o ajuste). Esses campos são obtidos dos certificados do cliente.
- Gerar uma lista de revogação de certificados
Para poder revogar o acesso a um certificado de cliente, você precisa gerar uma CRL. O comando para fazer isso (fornecido no topo da estrutura de diretórios da CA):
openssl ca -config /path/to/openssl.cnf -gencrl -out crl/crl.pem
Depois disso, você revoga os certificados do cliente conforme necessário, usando:
openssl ca -config /path/to/openssl.cnf -revoke clientcert.pem
Referências: