SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
01.12.2024

Aula 193: Segurança em Redes e SSL Pinning

No cenário digital de hoje, a segurança é de suma importância, especialmente quando se trata de redes. Como desenvolvedores, é nossa responsabilidade proteger dados sensíveis e manter a confiança dos usuários. Nesta aula, exploraremos a segurança em redes, com foco particular no SSL pinning em aplicações Swift.

Compreendendo SSL e TLS

Transport Layer Security (TLS) e seu predecessor, Secure Sockets Layer (SSL), são protocolos que garantem a comunicação segura em uma rede de computadores. O TLS criptografa os dados transmitidos entre um cliente e um servidor, dificultando a interceptação ou adulteração dos dados por atacantes.

Por que usar SSL Pinning?

Embora o TLS ofereça uma camada de segurança, há cenários em que medidas adicionais são necessárias. O SSL pinning é uma técnica que aprimora a segurança ao restringir os certificados que um cliente aceita. Com o SSL pinning:

  • O aplicativo aceita apenas um conjunto pré-definido de certificados.
  • Isso ajuda a proteger contra ataques de man-in-the-middle (MITM), onde um ator malicioso poderia interceptar as comunicações.

Implementando SSL Pinning em Swift

Agora vamos ver como implementar SSL pinning em uma aplicação Swift usando URLSession e um URLSessionDelegate personalizado.

Passo 1: Configurando seu Projeto

Crie um novo projeto em Swift no Xcode. Certifique-se de que você tenha um servidor com um certificado SSL válido para fins de teste. Se você estiver usando um certificado autoassinado, precisará incluí-lo em seu projeto.

Passo 2: Adicionando o Certificado

  1. Baixe ou exporte o certificado do seu servidor.
  2. Arraste o arquivo do certificado (geralmente em formato .cer ou .pem) para o seu projeto no Xcode.
  3. Certifique-se de selecionar "Copiar itens se necessário" quando solicitado.

Passo 3: Criando a Configuração do URLSession

É necessário configurar seu URLSession com um delegate que implemente o SSL pinning.

import UIKit

class ViewController: UIViewController, URLSessionDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        realizarSolicitacaoDeRede()
    }

    func realizarSolicitacaoDeRede() {
        let url = URL(string: "https://seu-servidor-seguro.com")!

        let sessao = URLSession(configuration: .default, delegate: self, delegateQueue: nil)
        let tarefa = sessao.dataTask(with: url) { (dados, resposta, erro) in
            if let erro = erro {
                print("Erro: \(erro)")
                return
            }
            if let dados = dados {
                print("Dados da resposta: \(String(data: dados, encoding: .utf8) ?? "")")
            }
        }
        tarefa.resume()
    }

    func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
            if let serverTrust = challenge.protectionSpace.serverTrust {
                // Carrega o certificado local
                let certificadoLocal = Bundle.main.path(forResource: "seu_certificado", ofType: "cer")!
                let dadosCertificadoLocal = NSData(contentsOfFile: certificadoLocal)!

                // Obtém o certificado do servidor
                let certificadoServidor = SecTrustGetCertificateAtIndex(serverTrust, 0)!

                // Compara os certificados
                if let dadosCertificadoServidor = SecCertificateCopyData(certificadoServidor) {
                    if dadosCertificadoServidor as Data == dadosCertificadoLocal as Data {
                        let credencial = URLCredential(trust: serverTrust)
                        completionHandler(.useCredential, credencial)
                        return
                    }
                }
            }
        }
        completionHandler(.cancelAuthenticationChallenge, nil)
    }

}

Explicação do Código

  1. Realizando Solicitações: O método realizarSolicitacaoDeRede inicia uma solicitação de rede para seu servidor seguro.
  2. Delegando o Handshake SSL: O método urlSession(_:didReceive:completionHandler:) é chamado sempre que o handshake SSL ocorre.
  3. Validação do Certificado:
    • O aplicativo compara o certificado do servidor com o certificado armazenado localmente.
    • Se eles corresponderem, a sessão continua. Caso contrário, o desafio é cancelado, rejeitando o certificado inválido.

Considerações Importantes

  1. Certificados Autoassinados: Se você estiver usando certificados autoassinados, certifique-se de que eles estejam devidamente incluídos no pacote da sua aplicação.
  2. Atualizações de Certificado: Se seu certificado mudar, você precisará atualizar o certificado pinado em seu aplicativo. Considere usar um sistema de integração contínua para facilitar a implantação do certificado.
  3. Testes: Teste de forma abrangente, pois o SSL pinning mal configurado pode levar a erros inesperados.

Conclusão

A segurança em redes é crucial para construir confiança em aplicações modernas. Implementar SSL pinning adiciona uma camada importante de segurança, garantindo que apenas certificados confiáveis sejam aceitos. Ao seguir os exemplos acima, você pode integrar efetivamente o SSL pinning em suas aplicações Swift e aprimorar sua segurança.

Mantenha-se sempre informado sobre as melhores práticas de segurança, pois os avanços e as ameaças à segurança de redes evoluem ao longo do tempo. Mantenha os dados dos seus usuários seguros e você manterá a confiança deles.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!