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
- Baixe ou exporte o certificado do seu servidor.
- Arraste o arquivo do certificado (geralmente em formato
.cer
ou.pem
) para o seu projeto no Xcode. - 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
- Realizando Solicitações: O método
realizarSolicitacaoDeRede
inicia uma solicitação de rede para seu servidor seguro. - Delegando o Handshake SSL: O método
urlSession(_:didReceive:completionHandler:)
é chamado sempre que o handshake SSL ocorre. - 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
- Certificados Autoassinados: Se você estiver usando certificados autoassinados, certifique-se de que eles estejam devidamente incluídos no pacote da sua aplicação.
- 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.
- 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.