Autenticação SSL Bidirecional com Apache 2.2 e OpenSSL 1.0.1e-fips

1

Eu tenho um servidor CentOS 6 executando o Apache 2.2.15 com o OpenSSL 1.0.1e-fips. Estou tentando configurar a autenticação SSL bidirecional para um local específico na minha raiz da web. Uma terceira parte forneceu um certificado público (texto sem formatação) e privado (binário).

Preciso de algumas orientações sobre como incluir os certificados públicos e privados para que o handshaking funcione, pois estou recebendo o seguinte erro:

Re-negotiation handshake failed: Not accepted by client!?

Aqui está o que eu tenho no meu arquivo /etc/httpd/conf.d/ssl.conf que pertence a esta seção:

<Location /api/path/>
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCACertificateFile /etc/pki/tls/private/public.cer
SSLVerifyClient require
SSLVerifyDepth 10
SSLOptions +StdEnvVars +ExportCertData +OptRenegotiate
</Location>

É verdade que não sou especialista em SSL. Eu sei o suficiente para obter certs instalados e funcionando. Eu virei o logginf para o nível 'debug'. Eu tentei seguir estes guias:

link

link

Obrigado antecipadamente!

Arquivo completo do ssl.conf:

LoadModule ssl_module modules/mod_ssl.so
Listen 443

SSLPassPhraseDialog  builtin

SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300

SSLMutex default

SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
#SSLRandomSeed startup file:/dev/random  512
#SSLRandomSeed connect file:/dev/random  512
#SSLRandomSeed connect file:/dev/urandom 512

SSLCryptoDevice builtin
#SSLCryptoDevice ubsec
<VirtualHost *:443>
DocumentRoot "/var/www/html/staging-site"
ServerName staging.site.com:443
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel debug

SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW

SSLCertificateFile /etc/pki/tls/certs/cert.crt
SSLCertificateKeyFile /etc/pki/tls/private/private.key
#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
SSLCACertificateFile /etc/pki/tls/certs/rapidssl.crt

#SSLVerifyClient require
#SSLVerifyDepth  10

#   Access Control:
#<Location />
#SSLRequire (    %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
#            and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
#            and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
#            and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
#            and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20       ) \
#           or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/
#</Location>

<Location /path/api/>
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCACertificateFile /etc/pki/tls/private/3rdpartyprivate.cer
    SSLVerifyClient require
    SSLVerifyDepth 10
    SSLOptions +StdEnvVars +ExportCertData +OptRenegotiate
</Location>

#   SSL Engine Options:
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

#   SSL Protocol Adjustments:
SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

#   Per-Server Logging:
CustomLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
    
por Joel F. 05.10.2017 / 18:49

2 respostas

0

Acho que você não está usando os certificados corretos no lugar correto. Você deve usar o certificado do servidor emitido por uma CA confiável no SSLCertificateFile (certificado no formato PEM), SSLCertificateKeyFile (chave no formato PEM correspondente ao certificado) e SSLCertificateChainFile (certificados a partir do emissor do certificador host) certificado até e incluindo o certificado raiz no formato PEM).

Em SSLCACertificateFile , você precisa usar o certificado (também no formato PEM) da autoridade de certificação que assinou os certificados dos clientes.

Veja um exemplo completo, lembre-se de que estou usando um certificado de servidor assinado pela mesma autoridade de certificação que assina os certificados dos clientes para isso. Ajuste se suas necessidades forem diferentes.

  • Gerando os certs openssl genrsa -des3 -out ca.key 4096 openssl req -new -x509 -days 365 -key ca.key -out ca.crt -subj "/C=US/ST=Some State/L=FancyTown/O=SomeOrg/CN=Self-Signed CA" openssl genrsa -out client.key 4096 openssl req -new -key client.key -out client.csr -subj "/C=US/ST=Some State/L=FancyTown/O=SomeOrg/CN=client" openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt openssl genrsa -out server.key 4096 openssl req -new -key server.key -out server.csr -subj "/C=US/ST=Some State/L=FancyTown/O=SomeOrg/CN=server" openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out server.crt

  • Movendo-os para um local mais conveniente mkdir /etc/ssl_ ; mv * /etc/ssl_

  • Instale o servidor da Web e mod_ssl yum install -y httpd mod_ssl

  • Limpar configuração TLS padrão truncate -s0 /etc/httpd/conf.d/ssl.conf

  • Configuração comum do TLS para todos os VHosts, /etc/httpd/conf.d/00-ssl.conf '' ' LoadModule ssl_module modules / mod_ssl.so

Ouça 443 https SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt SSLStaplingCache shmcb: / run / httpd / stapling_cache (128.000) SSLUseStapling off

SSLPassPhraseDialog exec: / usr / libexec / httpd-ssl-pass-dialog SSLSessionCache shmcb: / run / httpd / sslcache (512000) SSLSessionCacheTimeout 300 Arquivo de inicialização SSLRandomSeed: / dev / urandom 256 Conexão SSLRandomSeed integrada SSLCryptoDevice embutido

SSLStrictSNIVHostCheck desativado SSLProtocol + TLSv1.2-TLSv1.1-TLSv1 -SSLv3 SSLHonorCipherOrder em

SSLCompression off SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384: ECDHE-RSA-AES256-SHA384: ECDHE-RSA-AES128-GCM-SHA256: ECDHE-RSA-AES128-SHA256: -ECDHE-RSA-RC4-SHA: ECDHE-RSA- AE S256-SHA: DHE-RSA-AES256-GCM-SHA384: DHE-RSA-AES256-SHA256: DHE-RSA-AES128-GCM-SHA256: DHE-RSA-AES128-SHA256: DHE-RSA-AES256-SHA: DHE- RSA-AES128-SHA: -RC4-SHA: AES256- GCM-SHA384: AES256-SHA256: CAMELLIA256-SHA: ECDHE-RSA-AES128-SHA: AES128-GCM-SHA256: AES128-SHA256: AES128-SHA: CAMELLIA128-SHA '' '

  • Configuração do VHost /etc/httpd/conf.d/50-ssl-vhost.conf

'' '         ServerAlias localhost.localdomain localhost         Servidor ServerName         SSLEngine on         SSLCertificateFile /etc/_ssl/server.crt         SSLCertificateKeyFile /etc/_ssl/server.key         SSLCertificateChainFile /etc/_ssl/ca.crt         SSLCACertificateFile /etc/_ssl/ca.crt

    SSLVerifyClient require
    SSLVerifyDepth  10

    DocumentRoot /var/www/html

    <Directory /var/www/html>
            Require all granted
    </Directory>

    ErrorLog logs/ssl_error_log
    TransferLog logs/ssl_access_log

'' '

  • Crie um arquivo index.html para teste echo 'It works\!' > /var/www/html/index.html

  • Inicie o httpd

systemctl enable --now httpd

  • Adicionar nome do host

echo '127.0.1.1 server' >> /etc/hosts

  • Teste

Isso funciona (auth ok): ( echo -en 'GET / HTTP/1.1\r\nHost: server\r\n\r\n' ; sleep 2) | openssl s_client -CAfile /etc/_ssl/ca.crt -cert /etc/_ssl/client.crt -key /etc/_ssl/cli ent.key -connect server:443 -servername server

Isso não, nós não fornecemos um certificado correto:

( echo -en 'GET / HTTP/1.1\r\nHost: server\r\n\r\n' ; sleep 2) | openssl s_client -CAfile /etc/_ssl/ca.crt -connect server:443 -servername server

    
por 06.10.2017 / 15:05
0

Para nossa situação, acabamos fazendo três alterações:

  1. SSLCertificateChainFile não-personalizado e configure-o para o arquivo da cadeia de certificados do RapidSSL (quem emitiu nosso certificado).

  2. Alterou SSLCACertificateFile para o arquivo de cadeia CA do emissor do terceiro (que emite seu certificado).

  3. Removeu o SSLCACertificateFile da diretiva.

Depois que os alteramos e reiniciados, a autenticação bidirecional funcionou e eles conseguiram acessar a API.

Obrigado ao @fuero pela ajuda.

    
por 10.10.2017 / 19:43