chave SSH para HTTP

1

É possível definir algo como chaves SSH para tráfego HTTP, de modo que um navegador deve ter a chave correspondente para acessar?

    
por Jay West 17.09.2013 / 21:11

2 respostas

4

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:

OpenSSL documentação on-line e Apache

    
por 17.09.2013 / 21:29
2

Sim, ele é chamado de "Autenticação de certificado de cliente" e é frequentemente usado com cartões inteligentes e afins.

Pode ser complicado correr bem, dependendo do produto desejado.

    
por 17.09.2013 / 21:16