SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 14 day free trial to unlock unlimited reading.
PHP Experience 2016 - [Palestra] Autenticação em APIs
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
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
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);
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.
Descentralizado
• Servidores conseguem validar o certificado offline
• Precisam apenas compartilhar as chaves do CA
• Ideal para microserviços
31.
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