SlideShare uma empresa Scribd logo
Autenticação em APIs
Marcelo Milhomem
Agenda
Agenda
• HTTP REST API
• Autenticação
• SSL / Autoridade Certificadora / Certificados
• Aplicação em Mobile
Autenticação x Autorização
401 vs 403
• 401 Unauthorised - Não autenticado
Eu preciso saber quem você é
• 403 Forbidden - Não autorizado
Eu sei quem você é mas, você não tem direito
Autenticação hoje
HTTP Basic
(Usuário e Senha)
• Cleartext
• Precisa de SSL
• Fácil de "crackear"
• Usuário preguiçoso (mesma senha / senha fraca)
• Mesma senha em vários sistemas
OAuth
(Autenticação + Autorização)
Token / JWT
1 {
2 "sub": "1234567890",
3 "name": "John Doe",
4 "admin": true
5 }
1 HMACSHA256(
2 base64UrlEncode(header) + "." +
3 base64UrlEncode(payload),
4 secret)
1 eyJhbGciOiJIUzI1NiIsInR
2 5cCI6IkpXVCJ9.
3 eyJzdWIiOiIxMjM0NTY3ODk
4 wIiwibmFtZSI6IkpvaG4gRG
5 9lIiwiYWRtaW4iOnRydWV9.
6 TJVA95OrM7E2cBab30RMHrH
7 DcEfxjoYZgeFONFh7HgQ
Todos usam SSL
Por que o SSL?
Certificados
• Par de chaves assimétricas (Pública e Privada)
• Oferece a mesma coisa que o SSL
• Autentica o cliente através da assinatura digital
• Requer um `round trip` extra
Autoridade Certificadora (CA)
• Self signed (todo CA é)
• CA intermediário (cadeias de CA) - boa prática para evitar perda total em caso de
comprometimento da chave privada
• Você é a autoridade :0 dona da verdade
• Utilizar CA intermediários como ACL
Show Case
Ingredientes
Keystore
Certificado do Cliente Certificado do Servidor
Keystore
CA
Gerar certificado do cliente
Gerar certificado - PHP
Gerando par de chaves do cliente
1 /**
2 * Chave privada
3 */
4 $clientPrivateKey = new Crypt_RSA();
5 $clientPrivateKey->setPassword($password);
6 $generatedKeyPair = $clientPrivateKey->createKey();
7 $clientPrivateKey->loadKey($generatedKeyPair['privatekey']);
8 /**
9 * Chave pública
10 */
11 $clientPublicKey = new Crypt_RSA();
12 $clientPublicKey->loadKey($generatedKeyPair['publickey']);
13 $clientPublicKey->setPublicKey();
Gerar certificado - PHP
Par de chaves do CA
1 /**
2 * Chave privada do CA necessária para assinar
3 */
4 $privateKeyIntermediateCA = new Crypt_RSA();
5 $privateKeyIntermediateCA->setPassword('Intermediate CA password');
6 $privateKeyIntermediateCA->loadKey(file_get_contents($privateCAKeyPath));
7 /**
8 * Certificado do CA
9 */
10 $certificateIntermediateCA = new File_X509();
11 $certificateIntermediateCA->setPrivateKey($privateKeyIntermediateCA);
12 $certificateIntermediateCA->loadX509(file_get_contents($certificateCAKeyPath));
Certificado do Cliente - PHPAssinando o certificado
1 /**
2 * CSR - Requisição de certificado
3 */
4 $certificateSigningRequest = new File_X509();
5 $certificateSigningRequest->setDN($certificateIntermediateCA->getDN());
6 $certificateSigningRequest->setPublicKey((object)$clientPublicKey);
7 $certificateX509 = new File_X509();
8 $certificateX509->setEndDate('+1 month');
9 /**
10 * Assinatura do CA
11 */
12 $clientCertificate =
13 $certificateX509->sign($certificateIntermediateCA, $certificateSigningRequest);
14 /**
15 * Resultado chave privada + certificado do cliente
16 */
17 echo $clientPrivateKey->getPrivateKey();
18 echo PHP_EOL;
19 echo $certificateX509->saveX509($clientCertificate);
Certificado do Cliente - Android
1 /**
2 * Certificado do cliente + chave privada empacotados em um arquivo PFX
3 */
4 KeyStore keyStore = KeyStore.getInstance("PKCS12");
5 FileInputStream clientCertificateContent =
6 new FileInputStream("/path/to/publicAndPrivateKey.p12");
7 keyStore.load(clientCertificateContent, "private key password".toCharArray());
8 KeyManagerFactory keyManagerFactory =
9 KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
10 keyManagerFactory.init(keyStore, "private key password".toCharArray());
Embarcar CA
1 -----BEGIN CERTIFICATE-----
2 MIIDnzCCAwigAwIBAgIJAJZTKp0w82kyMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYD
3 VQQGEwJCUjETMBEGA1UECBQKU8OjbyBQYXVsbzETMBEGA1UEBxQKU8OjbyBQYXVs
4 bzERMA8GA1UEChMIRWFzeVRheGkxETAPBgNVBAsTCEVhc3lUYXhpMQswCQYDVQQD
5 EwJFVDEmMCQGCSqGSIb3DQEJARYXY29udGF0b0BlYXN5dGF4aS5jb20uYnIwHhcN
6 MTYwMTE4MTYwNDQ2WhcNMzYwMTEzMTYwNDQ2WjCBkjELMAkGA1UEBhMCQlIxEzAR
7 BgNVBAgUClPDo28gUGF1bG8xEzARBgNVBAcUClPDo28gUGF1bG8xETAPBgNVBAoT
8 CEVhc3lUYXhpMREwDwYDVQQLEwhFYXN5VGF4aTELMAkGA1UEAxMCRVQxJjAkBgkq
9 hkiG9w0BCQEWF2NvbnRhdG9AZWFzeXRheGkuY29tLmJyMIGfMA0GCSqGSIb3DQEB
10 AQUAA4GNADCBiQKBgQDTny6B8fbG1UXEtMYYFKfODKduzYTovLIUzXKFrX9wHEsC
11 lTOLqtvKsvkLkjXsC3R/HedWoRbFXJbaaw723csPlxrxuBqfkNBJB25ihccwVWbP
12 WpEaDluL2btsBdW2uuDshpXk2z6Gf5xcePnmf24iWpvJs1uBJWkEGRR2TzEi8wID
13 AQABo4H6MIH3MB0GA1UdDgQWBBRMm/EjlWrvxXTtUmotq+kwN52u3zCBxwYDVR0j
14 BIG/MIG8gBRMm/EjlWrvxXTtUmotq+kwN52u36GBmKSBlTCBkjELMAkGA1UEBhMC
15 QlIxEzARBgNVBAgUClPDo28gUGF1bG8xEzARBgNVBAcUClPDo28gUGF1bG8xETAP
16 BgNVBAoTCEVhc3lUYXhpMREwDwYDVQQLEwhFYXN5VGF4aTELMAkGA1UEAxMCRVQx
17 JjAkBgkqhkiG9w0BCQEWF2NvbnRhdG9AZWFzeXRheGkuY29tLmJyggkAllMqnTDz
18 aTIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOBgQAEcW5DO0ODdWd0kZzU
19 6eSg8ckDPImveTiKpFU5a96WxlVmwU8IlwAZ695w6ciIwDjys6BUNUBayTczhJbO
20 83Ykrt+b62+ksqKKFrCcba10R8QSjhYZSy7Yv08m/6+OiP+rUb2Jg4zVdAPhaaVn
21 lb1Nff1EgOdWIdjTKpPzHRjY4g==
22 -----END CERTIFICATE-----
Autoridade Certificadora Aplicativo Mobile
Requisição OkHttp - Android
1 OkHttpClient client = new OkHttpClient();
2 client.setSslSocketFactory(sslContext.getSocketFactory());
3 client.newCall(new Request.Builder()
4 .url("https://easytaxi.com.br")
5 .build()
6 ).execute();
Adicionando Cabeçalhos
1 GET /passenger/56edfd08756f458a6f0041ad HTTP/1.1
2 Host: api.easytaxi.com.br
3 User-Agent: curl/7.43.0
4 X-SSL: 1
5 X-SSL-Client-Verify: 0
6 X-SSL-Client-SHA1: "a01b894d12579d88efce97d27107f380b05f5968"
7 X-SSL-Client-CN: "56edfd08756f458a6f0041ad"
8 X-SSL-Issuer: "/C=BR/OU=EasyTaxi/emailAddress=contato@easytaxi.com.br”
9 X-SSL-Client-Not-Before: "120101100030Z"
10 X-SSL-Client-Not-After: "160101100030Z"
11 Accept: */*
Use Cases
Validade
• Todo certificado tem validade
• Demonstração
• Teste gratuito temporário
• Revalidação de login
Grupos e Cadeias
• Você pode criar vários CAs intermediários
• Criar intermediário e assinar os usuários do grupo com ele
• Revogar um intermediário e todos certificados abaixo dele
• Intermediários também possuem validade
Integridade
• Benefício da autenticação mútua (2WAY)
Assinatura digital
• Não repúdio - Garantia da que o portador assinou
• Assinar documentos digitalmente
• Certificado digital
Offload
Descentralizado
• Servidores conseguem validar o certificado offline
• Precisam apenas compartilhar as chaves do CA
• Ideal para microserviços
Emissão on-demand
• Emissão de certificados dinamicamente
• Let’s Encrypt faz isso para certificado de servidores
• Crie sua PKI para emitir certificados para clientes
Autorização Simples - 403
1 #GET /passenger/56edfd08756f458a6f0041ad HTTP/1.1
2 $uri = current(explode('?', getenv('REQUEST_URI')));
3 preg_match('#[a-zA-Z0-9-]+(/)?$#', $uri, $matches);
4 $passengerId = $matches[0];
5 if ($request->headers->get('X-SSL-Client-CN') != $passengerId) {
6 return new Response('Forbidden', 403);
7 }
Gerar certificado - PHPAssinando o certificado
1 /**
2 * CSR - Requisição de certificado
3 */
4 $certificateSigningRequest = new File_X509();
5 $certificateSigningRequest->setDN($certificateIntermediateCA->getDN());
6 $certificateSigningRequest->setDNProp('uniqueidentifier', 'my unique ID');
7 $certificateSigningRequest->setPublicKey((object)$clientPublicKey);
8 $certificateX509 = new File_X509();
9 $certificateX509->setEndDate('+1 month');
10 /**
11 * Assinatura do CA
12 */
13 $clientCertificate =
14 $certificateX509->sign($certificateIntermediateCA, $certificateSigningRequest);
Por que ninguém ta usando isso?
Perguntas?
Vamos manter contato!
https://legacy.joind.in/17491
https://gist.github.com/milhomem

Mais conteúdo relacionado

Mais procurados

Certificados Digitais
Certificados DigitaisCertificados Digitais
Certificados Digitais
Humberto Bruno Pontes Silva
 
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EEJavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
Leonardo Zanivan
 
Inversão de Controlo e Injecção de Dependência na .NET Framework
Inversão de Controlo e Injecção de Dependência na .NET FrameworkInversão de Controlo e Injecção de Dependência na .NET Framework
Inversão de Controlo e Injecção de Dependência na .NET Framework
C. Augusto Proiete
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Vitor Ciaramella
 
PHP robusto com Zend Framework
PHP robusto com Zend FrameworkPHP robusto com Zend Framework
PHP robusto com Zend Framework
Jaime Neto
 
Palestra de segurança em PHP - Hacking
Palestra de segurança em PHP - HackingPalestra de segurança em PHP - Hacking
Palestra de segurança em PHP - Hacking
Luis Gustavo Almeida
 
Principais ameças à Aplicações Web - Como explorá-las e como se proteger.
Principais ameças à Aplicações Web - Como explorá-las e como se proteger. Principais ameças à Aplicações Web - Como explorá-las e como se proteger.
Principais ameças à Aplicações Web - Como explorá-las e como se proteger.
Clavis Segurança da Informação
 

Mais procurados (7)

Certificados Digitais
Certificados DigitaisCertificados Digitais
Certificados Digitais
 
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EEJavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
 
Inversão de Controlo e Injecção de Dependência na .NET Framework
Inversão de Controlo e Injecção de Dependência na .NET FrameworkInversão de Controlo e Injecção de Dependência na .NET Framework
Inversão de Controlo e Injecção de Dependência na .NET Framework
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows Azure
 
PHP robusto com Zend Framework
PHP robusto com Zend FrameworkPHP robusto com Zend Framework
PHP robusto com Zend Framework
 
Palestra de segurança em PHP - Hacking
Palestra de segurança em PHP - HackingPalestra de segurança em PHP - Hacking
Palestra de segurança em PHP - Hacking
 
Principais ameças à Aplicações Web - Como explorá-las e como se proteger.
Principais ameças à Aplicações Web - Como explorá-las e como se proteger. Principais ameças à Aplicações Web - Como explorá-las e como se proteger.
Principais ameças à Aplicações Web - Como explorá-las e como se proteger.
 

Destaque

CTOTalks: Escalando de 0 a 1 bilhão de requests com uma infra enxuta
CTOTalks: Escalando de 0 a 1 bilhão de requests com uma infra enxutaCTOTalks: Escalando de 0 a 1 bilhão de requests com uma infra enxuta
CTOTalks: Escalando de 0 a 1 bilhão de requests com uma infra enxuta
Roger Mattos
 
Estudo e medicao do consumo de energia de algoritmos criptograficos do mi bench
Estudo e medicao do consumo de energia de algoritmos criptograficos do mi benchEstudo e medicao do consumo de energia de algoritmos criptograficos do mi bench
Estudo e medicao do consumo de energia de algoritmos criptograficos do mi bench
Edward David Moreno
 
Implementacao e desempenho da virtualizacao no dcomp ufs
Implementacao e desempenho da virtualizacao no dcomp ufsImplementacao e desempenho da virtualizacao no dcomp ufs
Implementacao e desempenho da virtualizacao no dcomp ufs
Edward David Moreno
 
Jai2008 energia-capitulo
Jai2008 energia-capituloJai2008 energia-capitulo
Jai2008 energia-capitulo
Edward David Moreno
 
Implementacao e teste de sistemas criptograficos
Implementacao e teste de sistemas criptograficosImplementacao e teste de sistemas criptograficos
Implementacao e teste de sistemas criptograficos
Edward David Moreno
 
Criptografia em hardware emicro se - nov 15 2012
Criptografia em hardware   emicro se - nov 15 2012Criptografia em hardware   emicro se - nov 15 2012
Criptografia em hardware emicro se - nov 15 2012
Edward David Moreno
 
Microservices: Utilizando o Twitter como Plataforma
Microservices: Utilizando o Twitter como PlataformaMicroservices: Utilizando o Twitter como Plataforma
Microservices: Utilizando o Twitter como Plataforma
Juliana Chahoud
 
Autenticação com Json Web Token (JWT)
Autenticação com Json Web Token (JWT)Autenticação com Json Web Token (JWT)
Autenticação com Json Web Token (JWT)
Ivan Rosolen
 
Livro - Projeto, Desempenho e Aplicacoes de Sistemas Digitais em FPGAs
Livro - Projeto, Desempenho e Aplicacoes de Sistemas Digitais em FPGAsLivro - Projeto, Desempenho e Aplicacoes de Sistemas Digitais em FPGAs
Livro - Projeto, Desempenho e Aplicacoes de Sistemas Digitais em FPGAs
Edward David Moreno
 
Autenticação e controlo de acessos
Autenticação e controlo de acessosAutenticação e controlo de acessos
Autenticação e controlo de acessos
Luis Batista
 
Controle de Acesso
Controle de AcessoControle de Acesso
Controle de Acesso
Cassio Ramos
 

Destaque (11)

CTOTalks: Escalando de 0 a 1 bilhão de requests com uma infra enxuta
CTOTalks: Escalando de 0 a 1 bilhão de requests com uma infra enxutaCTOTalks: Escalando de 0 a 1 bilhão de requests com uma infra enxuta
CTOTalks: Escalando de 0 a 1 bilhão de requests com uma infra enxuta
 
Estudo e medicao do consumo de energia de algoritmos criptograficos do mi bench
Estudo e medicao do consumo de energia de algoritmos criptograficos do mi benchEstudo e medicao do consumo de energia de algoritmos criptograficos do mi bench
Estudo e medicao do consumo de energia de algoritmos criptograficos do mi bench
 
Implementacao e desempenho da virtualizacao no dcomp ufs
Implementacao e desempenho da virtualizacao no dcomp ufsImplementacao e desempenho da virtualizacao no dcomp ufs
Implementacao e desempenho da virtualizacao no dcomp ufs
 
Jai2008 energia-capitulo
Jai2008 energia-capituloJai2008 energia-capitulo
Jai2008 energia-capitulo
 
Implementacao e teste de sistemas criptograficos
Implementacao e teste de sistemas criptograficosImplementacao e teste de sistemas criptograficos
Implementacao e teste de sistemas criptograficos
 
Criptografia em hardware emicro se - nov 15 2012
Criptografia em hardware   emicro se - nov 15 2012Criptografia em hardware   emicro se - nov 15 2012
Criptografia em hardware emicro se - nov 15 2012
 
Microservices: Utilizando o Twitter como Plataforma
Microservices: Utilizando o Twitter como PlataformaMicroservices: Utilizando o Twitter como Plataforma
Microservices: Utilizando o Twitter como Plataforma
 
Autenticação com Json Web Token (JWT)
Autenticação com Json Web Token (JWT)Autenticação com Json Web Token (JWT)
Autenticação com Json Web Token (JWT)
 
Livro - Projeto, Desempenho e Aplicacoes de Sistemas Digitais em FPGAs
Livro - Projeto, Desempenho e Aplicacoes de Sistemas Digitais em FPGAsLivro - Projeto, Desempenho e Aplicacoes de Sistemas Digitais em FPGAs
Livro - Projeto, Desempenho e Aplicacoes de Sistemas Digitais em FPGAs
 
Autenticação e controlo de acessos
Autenticação e controlo de acessosAutenticação e controlo de acessos
Autenticação e controlo de acessos
 
Controle de Acesso
Controle de AcessoControle de Acesso
Controle de Acesso
 

Semelhante a Autenticacao em APIs com SSL

GUJavaSC - Protegendo Microservices em Java
GUJavaSC - Protegendo Microservices em JavaGUJavaSC - Protegendo Microservices em Java
GUJavaSC - Protegendo Microservices em Java
Rodrigo Cândido da Silva
 
TDC 2015 - Segurança em Recursos RESTful com OAuth2
TDC 2015 - Segurança em Recursos RESTful com OAuth2TDC 2015 - Segurança em Recursos RESTful com OAuth2
TDC 2015 - Segurança em Recursos RESTful com OAuth2
Rodrigo Cândido da Silva
 
JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2
JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2
JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2
Rodrigo Cândido da Silva
 
[DTC21] Rodrigo Branas - Segurança na Web: Será que o seu sistema está realme...
[DTC21] Rodrigo Branas - Segurança na Web: Será que o seu sistema está realme...[DTC21] Rodrigo Branas - Segurança na Web: Será que o seu sistema está realme...
[DTC21] Rodrigo Branas - Segurança na Web: Será que o seu sistema está realme...
Deep Tech Brasil
 
Além do HTTPS - Como (tentar) Aumentar a Segurança de seu Website e Aplicação...
Além do HTTPS - Como (tentar) Aumentar a Segurança de seu Website e Aplicação...Além do HTTPS - Como (tentar) Aumentar a Segurança de seu Website e Aplicação...
Além do HTTPS - Como (tentar) Aumentar a Segurança de seu Website e Aplicação...
Jeronimo Zucco
 
Desenvolvimento seguro - WorkSec 2019
Desenvolvimento seguro - WorkSec 2019Desenvolvimento seguro - WorkSec 2019
Desenvolvimento seguro - WorkSec 2019
Alcyon Ferreira de Souza Junior, MSc
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7
Helder da Rocha
 
Testando a integração com APIs - RSonRails/11
Testando a integração com APIs - RSonRails/11Testando a integração com APIs - RSonRails/11
Testando a integração com APIs - RSonRails/11
Rafael Souza
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8
Helder da Rocha
 
A Biblioteca cURL
A Biblioteca cURLA Biblioteca cURL
A Biblioteca cURL
ricardophp
 
Joomla!, SSL e um pouco sobre segurança
Joomla!, SSL e um pouco sobre segurançaJoomla!, SSL e um pouco sobre segurança
Joomla!, SSL e um pouco sobre segurança
Fernando Soares
 
Configurando servidor web https no apache2 ed
Configurando servidor web https no apache2 edConfigurando servidor web https no apache2 ed
Configurando servidor web https no apache2 ed
Carlos Melo
 
Zabbix e KACE, uma boa ideia, e porque não!
Zabbix e KACE, uma boa ideia, e porque não!Zabbix e KACE, uma boa ideia, e porque não!
Zabbix e KACE, uma boa ideia, e porque não!
Fabio Vieira Mello
 
Proteja sua aplicação com o zend framework 2
Proteja sua aplicação com o zend framework 2Proteja sua aplicação com o zend framework 2
Proteja sua aplicação com o zend framework 2
Cyrille Grandval
 
TDC2017 | São Paulo - Trilha Microservices Coaching I How we figured out we h...
TDC2017 | São Paulo - Trilha Microservices Coaching I How we figured out we h...TDC2017 | São Paulo - Trilha Microservices Coaching I How we figured out we h...
TDC2017 | São Paulo - Trilha Microservices Coaching I How we figured out we h...
tdc-globalcode
 
OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...
OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...
OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...
Mauro Risonho de Paula Assumpcao
 
Segurança em Angular SPA
Segurança em Angular SPASegurança em Angular SPA
Segurança em Angular SPA
Fernando Piancastelli
 
Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...
Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...
Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...
Alcyon Ferreira de Souza Junior, MSc
 
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014
OAuth2: Uma abordagem para segurança de aplicações e APIs REST  - Devcamp 2014OAuth2: Uma abordagem para segurança de aplicações e APIs REST  - Devcamp 2014
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014
Tiago Marchetti Dolphine
 
Design de APIs REST
Design de APIs RESTDesign de APIs REST
Design de APIs REST
Leonel Morais
 

Semelhante a Autenticacao em APIs com SSL (20)

GUJavaSC - Protegendo Microservices em Java
GUJavaSC - Protegendo Microservices em JavaGUJavaSC - Protegendo Microservices em Java
GUJavaSC - Protegendo Microservices em Java
 
TDC 2015 - Segurança em Recursos RESTful com OAuth2
TDC 2015 - Segurança em Recursos RESTful com OAuth2TDC 2015 - Segurança em Recursos RESTful com OAuth2
TDC 2015 - Segurança em Recursos RESTful com OAuth2
 
JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2
JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2
JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2
 
[DTC21] Rodrigo Branas - Segurança na Web: Será que o seu sistema está realme...
[DTC21] Rodrigo Branas - Segurança na Web: Será que o seu sistema está realme...[DTC21] Rodrigo Branas - Segurança na Web: Será que o seu sistema está realme...
[DTC21] Rodrigo Branas - Segurança na Web: Será que o seu sistema está realme...
 
Além do HTTPS - Como (tentar) Aumentar a Segurança de seu Website e Aplicação...
Além do HTTPS - Como (tentar) Aumentar a Segurança de seu Website e Aplicação...Além do HTTPS - Como (tentar) Aumentar a Segurança de seu Website e Aplicação...
Além do HTTPS - Como (tentar) Aumentar a Segurança de seu Website e Aplicação...
 
Desenvolvimento seguro - WorkSec 2019
Desenvolvimento seguro - WorkSec 2019Desenvolvimento seguro - WorkSec 2019
Desenvolvimento seguro - WorkSec 2019
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7
 
Testando a integração com APIs - RSonRails/11
Testando a integração com APIs - RSonRails/11Testando a integração com APIs - RSonRails/11
Testando a integração com APIs - RSonRails/11
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8
 
A Biblioteca cURL
A Biblioteca cURLA Biblioteca cURL
A Biblioteca cURL
 
Joomla!, SSL e um pouco sobre segurança
Joomla!, SSL e um pouco sobre segurançaJoomla!, SSL e um pouco sobre segurança
Joomla!, SSL e um pouco sobre segurança
 
Configurando servidor web https no apache2 ed
Configurando servidor web https no apache2 edConfigurando servidor web https no apache2 ed
Configurando servidor web https no apache2 ed
 
Zabbix e KACE, uma boa ideia, e porque não!
Zabbix e KACE, uma boa ideia, e porque não!Zabbix e KACE, uma boa ideia, e porque não!
Zabbix e KACE, uma boa ideia, e porque não!
 
Proteja sua aplicação com o zend framework 2
Proteja sua aplicação com o zend framework 2Proteja sua aplicação com o zend framework 2
Proteja sua aplicação com o zend framework 2
 
TDC2017 | São Paulo - Trilha Microservices Coaching I How we figured out we h...
TDC2017 | São Paulo - Trilha Microservices Coaching I How we figured out we h...TDC2017 | São Paulo - Trilha Microservices Coaching I How we figured out we h...
TDC2017 | São Paulo - Trilha Microservices Coaching I How we figured out we h...
 
OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...
OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...
OWASP AppSec 2010 BRAZIL Information Extraction Art of Testing Network Periph...
 
Segurança em Angular SPA
Segurança em Angular SPASegurança em Angular SPA
Segurança em Angular SPA
 
Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...
Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...
Aula 01 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...
 
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014
OAuth2: Uma abordagem para segurança de aplicações e APIs REST  - Devcamp 2014OAuth2: Uma abordagem para segurança de aplicações e APIs REST  - Devcamp 2014
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014
 
Design de APIs REST
Design de APIs RESTDesign de APIs REST
Design de APIs REST
 

Autenticacao em APIs com SSL

  • 3. Agenda • HTTP REST API • Autenticação • SSL / Autoridade Certificadora / Certificados • Aplicação em Mobile
  • 5. 401 vs 403 • 401 Unauthorised - Não autenticado Eu preciso saber quem você é • 403 Forbidden - Não autorizado Eu sei quem você é mas, você não tem direito
  • 7. HTTP Basic (Usuário e Senha) • Cleartext • Precisa de SSL • Fácil de "crackear" • Usuário preguiçoso (mesma senha / senha fraca) • Mesma senha em vários sistemas
  • 9. Token / JWT 1 { 2 "sub": "1234567890", 3 "name": "John Doe", 4 "admin": true 5 } 1 HMACSHA256( 2 base64UrlEncode(header) + "." + 3 base64UrlEncode(payload), 4 secret) 1 eyJhbGciOiJIUzI1NiIsInR 2 5cCI6IkpXVCJ9. 3 eyJzdWIiOiIxMjM0NTY3ODk 4 wIiwibmFtZSI6IkpvaG4gRG 5 9lIiwiYWRtaW4iOnRydWV9. 6 TJVA95OrM7E2cBab30RMHrH 7 DcEfxjoYZgeFONFh7HgQ
  • 11. Por que o SSL?
  • 12. Certificados • Par de chaves assimétricas (Pública e Privada) • Oferece a mesma coisa que o SSL • Autentica o cliente através da assinatura digital • Requer um `round trip` extra
  • 13. Autoridade Certificadora (CA) • Self signed (todo CA é) • CA intermediário (cadeias de CA) - boa prática para evitar perda total em caso de comprometimento da chave privada • Você é a autoridade :0 dona da verdade • Utilizar CA intermediários como ACL
  • 15. Ingredientes Keystore Certificado do Cliente Certificado do Servidor Keystore CA
  • 17. Gerar certificado - PHP Gerando par de chaves do cliente 1 /** 2 * Chave privada 3 */ 4 $clientPrivateKey = new Crypt_RSA(); 5 $clientPrivateKey->setPassword($password); 6 $generatedKeyPair = $clientPrivateKey->createKey(); 7 $clientPrivateKey->loadKey($generatedKeyPair['privatekey']); 8 /** 9 * Chave pública 10 */ 11 $clientPublicKey = new Crypt_RSA(); 12 $clientPublicKey->loadKey($generatedKeyPair['publickey']); 13 $clientPublicKey->setPublicKey();
  • 18. Gerar certificado - PHP Par de chaves do CA 1 /** 2 * Chave privada do CA necessária para assinar 3 */ 4 $privateKeyIntermediateCA = new Crypt_RSA(); 5 $privateKeyIntermediateCA->setPassword('Intermediate CA password'); 6 $privateKeyIntermediateCA->loadKey(file_get_contents($privateCAKeyPath)); 7 /** 8 * Certificado do CA 9 */ 10 $certificateIntermediateCA = new File_X509(); 11 $certificateIntermediateCA->setPrivateKey($privateKeyIntermediateCA); 12 $certificateIntermediateCA->loadX509(file_get_contents($certificateCAKeyPath));
  • 19. Certificado do Cliente - PHPAssinando o certificado 1 /** 2 * CSR - Requisição de certificado 3 */ 4 $certificateSigningRequest = new File_X509(); 5 $certificateSigningRequest->setDN($certificateIntermediateCA->getDN()); 6 $certificateSigningRequest->setPublicKey((object)$clientPublicKey); 7 $certificateX509 = new File_X509(); 8 $certificateX509->setEndDate('+1 month'); 9 /** 10 * Assinatura do CA 11 */ 12 $clientCertificate = 13 $certificateX509->sign($certificateIntermediateCA, $certificateSigningRequest); 14 /** 15 * Resultado chave privada + certificado do cliente 16 */ 17 echo $clientPrivateKey->getPrivateKey(); 18 echo PHP_EOL; 19 echo $certificateX509->saveX509($clientCertificate);
  • 20. Certificado do Cliente - Android 1 /** 2 * Certificado do cliente + chave privada empacotados em um arquivo PFX 3 */ 4 KeyStore keyStore = KeyStore.getInstance("PKCS12"); 5 FileInputStream clientCertificateContent = 6 new FileInputStream("/path/to/publicAndPrivateKey.p12"); 7 keyStore.load(clientCertificateContent, "private key password".toCharArray()); 8 KeyManagerFactory keyManagerFactory = 9 KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 10 keyManagerFactory.init(keyStore, "private key password".toCharArray());
  • 21. Embarcar CA 1 -----BEGIN CERTIFICATE----- 2 MIIDnzCCAwigAwIBAgIJAJZTKp0w82kyMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYD 3 VQQGEwJCUjETMBEGA1UECBQKU8OjbyBQYXVsbzETMBEGA1UEBxQKU8OjbyBQYXVs 4 bzERMA8GA1UEChMIRWFzeVRheGkxETAPBgNVBAsTCEVhc3lUYXhpMQswCQYDVQQD 5 EwJFVDEmMCQGCSqGSIb3DQEJARYXY29udGF0b0BlYXN5dGF4aS5jb20uYnIwHhcN 6 MTYwMTE4MTYwNDQ2WhcNMzYwMTEzMTYwNDQ2WjCBkjELMAkGA1UEBhMCQlIxEzAR 7 BgNVBAgUClPDo28gUGF1bG8xEzARBgNVBAcUClPDo28gUGF1bG8xETAPBgNVBAoT 8 CEVhc3lUYXhpMREwDwYDVQQLEwhFYXN5VGF4aTELMAkGA1UEAxMCRVQxJjAkBgkq 9 hkiG9w0BCQEWF2NvbnRhdG9AZWFzeXRheGkuY29tLmJyMIGfMA0GCSqGSIb3DQEB 10 AQUAA4GNADCBiQKBgQDTny6B8fbG1UXEtMYYFKfODKduzYTovLIUzXKFrX9wHEsC 11 lTOLqtvKsvkLkjXsC3R/HedWoRbFXJbaaw723csPlxrxuBqfkNBJB25ihccwVWbP 12 WpEaDluL2btsBdW2uuDshpXk2z6Gf5xcePnmf24iWpvJs1uBJWkEGRR2TzEi8wID 13 AQABo4H6MIH3MB0GA1UdDgQWBBRMm/EjlWrvxXTtUmotq+kwN52u3zCBxwYDVR0j 14 BIG/MIG8gBRMm/EjlWrvxXTtUmotq+kwN52u36GBmKSBlTCBkjELMAkGA1UEBhMC 15 QlIxEzARBgNVBAgUClPDo28gUGF1bG8xEzARBgNVBAcUClPDo28gUGF1bG8xETAP 16 BgNVBAoTCEVhc3lUYXhpMREwDwYDVQQLEwhFYXN5VGF4aTELMAkGA1UEAxMCRVQx 17 JjAkBgkqhkiG9w0BCQEWF2NvbnRhdG9AZWFzeXRheGkuY29tLmJyggkAllMqnTDz 18 aTIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOBgQAEcW5DO0ODdWd0kZzU 19 6eSg8ckDPImveTiKpFU5a96WxlVmwU8IlwAZ695w6ciIwDjys6BUNUBayTczhJbO 20 83Ykrt+b62+ksqKKFrCcba10R8QSjhYZSy7Yv08m/6+OiP+rUb2Jg4zVdAPhaaVn 21 lb1Nff1EgOdWIdjTKpPzHRjY4g== 22 -----END CERTIFICATE----- Autoridade Certificadora Aplicativo Mobile
  • 22. Requisição OkHttp - Android 1 OkHttpClient client = new OkHttpClient(); 2 client.setSslSocketFactory(sslContext.getSocketFactory()); 3 client.newCall(new Request.Builder() 4 .url("https://easytaxi.com.br") 5 .build() 6 ).execute();
  • 23. Adicionando Cabeçalhos 1 GET /passenger/56edfd08756f458a6f0041ad HTTP/1.1 2 Host: api.easytaxi.com.br 3 User-Agent: curl/7.43.0 4 X-SSL: 1 5 X-SSL-Client-Verify: 0 6 X-SSL-Client-SHA1: "a01b894d12579d88efce97d27107f380b05f5968" 7 X-SSL-Client-CN: "56edfd08756f458a6f0041ad" 8 X-SSL-Issuer: "/C=BR/OU=EasyTaxi/emailAddress=contato@easytaxi.com.br” 9 X-SSL-Client-Not-Before: "120101100030Z" 10 X-SSL-Client-Not-After: "160101100030Z" 11 Accept: */*
  • 25. Validade • Todo certificado tem validade • Demonstração • Teste gratuito temporário • Revalidação de login
  • 26. Grupos e Cadeias • Você pode criar vários CAs intermediários • Criar intermediário e assinar os usuários do grupo com ele • Revogar um intermediário e todos certificados abaixo dele • Intermediários também possuem validade
  • 27. Integridade • Benefício da autenticação mútua (2WAY)
  • 28. Assinatura digital • Não repúdio - Garantia da que o portador assinou • Assinar documentos digitalmente • Certificado digital
  • 30.
  • 31.
  • 32.
  • 33. Descentralizado • Servidores conseguem validar o certificado offline • Precisam apenas compartilhar as chaves do CA • Ideal para microserviços
  • 34. Emissão on-demand • Emissão de certificados dinamicamente • Let’s Encrypt faz isso para certificado de servidores • Crie sua PKI para emitir certificados para clientes
  • 35. Autorização Simples - 403 1 #GET /passenger/56edfd08756f458a6f0041ad HTTP/1.1 2 $uri = current(explode('?', getenv('REQUEST_URI'))); 3 preg_match('#[a-zA-Z0-9-]+(/)?$#', $uri, $matches); 4 $passengerId = $matches[0]; 5 if ($request->headers->get('X-SSL-Client-CN') != $passengerId) { 6 return new Response('Forbidden', 403); 7 }
  • 36. Gerar certificado - PHPAssinando o certificado 1 /** 2 * CSR - Requisição de certificado 3 */ 4 $certificateSigningRequest = new File_X509(); 5 $certificateSigningRequest->setDN($certificateIntermediateCA->getDN()); 6 $certificateSigningRequest->setDNProp('uniqueidentifier', 'my unique ID'); 7 $certificateSigningRequest->setPublicKey((object)$clientPublicKey); 8 $certificateX509 = new File_X509(); 9 $certificateX509->setEndDate('+1 month'); 10 /** 11 * Assinatura do CA 12 */ 13 $clientCertificate = 14 $certificateX509->sign($certificateIntermediateCA, $certificateSigningRequest);
  • 37. Por que ninguém ta usando isso?