Couchbase Mobile 2.0 suporta a fixação de certificados em todas as plataformas móveis do Couchbase. A fixação de certificado é uma técnica usada por aplicativos para "fixar" um host em seu certificado/chave pública. A comunicação entre o Couchbase Lite e o Sync Gateway é criptografada e protegida usando SSL/TLS. O protocolo SSL/TLS se baseia em uma infraestrutura de chave pública (PKI) usando um mecanismo Certificado X.509 para estabelecer a identidade do servidor do Sync Gateway. Normalmente, o certificado é emitido/assinado por uma Autoridade de Certificação confiável e é instalado no Sync Gateway.
Em um ambiente de desenvolvimento, esse certificado pode ser autoassinado.
Se a confiabilidade do certificado for comprometida de alguma forma ou se você estiver usando um certificado autoassinado, a identidade do servidor não poderá ser estabelecida de forma confiável e não haverá garantias de confidencialidade na comunicação entre o cliente e o servidor. Para aliviar esses problemas, o Couchbase Lite oferece suporte a fixação de certificados. Para realizar a fixação do certificado, o certificado de chave pública é normalmente entregue ao aplicativo cliente por meio de um canal fora de banda e empacotado com o aplicativo cliente. Ao fixar o certificado, o aplicativo cliente verificador não precisa mais depender de uma CA de terceiros para verificar a assinatura. Essa técnica também é necessária para a comunicação com o Sync Gateway configurado com certificados autoassinados.
Esta postagem discutirá como fixar certificados em seu Coucbase Lite Versão 2.0 aplicativo Android habilitado. Versão 1.4 do Couchbase Lite só suportava a fixação de certificados no iOS e isso foi discutido neste postagem no blog.
Você pode baixar as últimas versões de pré-lançamento do Couchbase Mobile 2.0 em aqui.
Histórico
Se você estiver familiarizado com SSL/TLS ou tiver lido este postagem no blogSe você não estiver usando o Couchbase Mobile, pode pular para a seção "Suporte à fixação de certificados com o Couchbase Mobile" desta postagem do blog.
A comunicação entre o Couchbase Lite e o Sync Gateway é criptografada usando SSL/TLSEm um nível muito alto, o protocolo TLS funciona da seguinte forma.
Um certificado X.509 contendo a chave pública e a identidade do servidor é instalado no Sync Gateway. Esse certificado de chave pública pode ser assinado por uma Autoridade de Certificação de terceiros confiável ou pode ser autoassinado, sendo este último o caso mais comum em ambientes de desenvolvimento.
Durante o estabelecimento da conexão, o aplicativo cliente que executa o Couchbase Lite verifica a identidade do Sync Gateway usando o certificado do servidor. O Couchbase Lite usa o certificado raiz da CA confiável para validar o certificado. Uma vez verificado, o cliente prossegue com a troca de chaves secretas. O segredo compartilhado é então usado para criptografar a comunicação entre o cliente e o Sync Gateway.
Consulte o RFC para obter informações específicas sobre o protocolo SSL/TLS.
Há alguns problemas com essa abordagem :-.
- Embora, na maioria das circunstâncias, seja razoável confiar na confiabilidade da CA, é possível que a própria CA seja comprometida. Se isso acontecer, não haverá uma maneira confiável de autenticar o Sync Gateway porque a CA usada para a verificação em si não é confiável!
- A comunicação cliente-servidor pode estar sujeita a um ataque MiTM (Man-in-the-Middle), por meio do qual um servidor desonesto que se faz passar por Sync Gateway pode emitir um certificado falso representando o Sync Gateway, assinado por uma CA falsa. Se, de alguma forma, o cliente for induzido a incluir o certificado da CA falsa em seu armazenamento de autoridade de certificação raiz confiável, o cliente confiará no certificado falso assinado pela CA falsa. Isso fará com que o cliente se comunique com um Sync Gateway falso.
- Se você estiver usando certificados autoassinados em seu ambiente de desenvolvimento, não há como o cliente validar de forma confiável a identidade do servidor.
Fixação de certificados
Uma maneira comum de lidar com os problemas listados acima é "fixar" o servidor Sync Gateway em seu certificado/chave pública. Nessa técnica, o Couchbase Lite é pré-configurado com o certificado confiável do Sync Gateway. Portanto, durante o estabelecimento da conexão, o Couchbase Lite usa esse certificado pré-configurado para verificar a identidade do servidor. Isso elimina a dependência de uma CA externa de terceiros para a verificação do certificado.
O Site da OWASP é uma boa referência sobre a fixação de certificados.
Advertência
É importante observar que, como os aplicativos são fornecidos com o certificado, toda vez que o certificado expira, o aplicativo precisa ser atualizado com o novo certificado. Isso pode ser um pouco mais desafiador em ambientes móveis, onde o ônus de atualizar os aplicativos recai sobre os usuários. Portanto, esteja ciente de quando os certificados expiram e faça planos apropriados para publicar os aplicativos com os novos certificados antes da expiração do certificado.
Suporte à fixação de certificados com o Couchbase Mobile
Esta publicação pressupõe que você esteja familiarizado com o desenvolvimento de aplicativos Android e com a configuração do seu aplicativo para usar o Couchbase Lite 2.0. Caso contrário, leia este artigo Primeiros passos guia. Usaremos Gateway de sincronização 1.5 na nuvem com o suporte de um Servidor Couchbase persistindo os dados na nuvem. O Couchbase Server não é relevante para as discussões desta postagem.
Instalação do certificado no Sync Gateway
Siga as instruções na seção Portal do desenvolvedor do Couchbase para gerar/instalar o certificado de servidor relevante em seu Sync Gateway
Alguns pontos a serem observados durante a geração do certificado
- O certificado e a chave privada correspondente devem estar no formato .pem
- Instale os certificados em um local acessível ao Sync Gateway. Se isso não for feito, ocorrerá um erro quando você iniciar o Sync Gateway com o arquivo de configuração.
1 2 3 4 5 |
2017-12-10T16:05:21.303-05:00 Usando metadados purgar intervalo de 3.00 dias para lápide compactação. 2017-12-10T16:05:21.305-05:00 Início administrador servidor em 127.0.0.1:4985 2017-12-10T16:05:21.310-05:00 Início servidor em :4984 ... 2017-12-10T16:05:21.310-05:00 HTTP: Protocolos habilitado: [http/1.1] em 127.0.0.1:4985 2017-12-10T16:05:21.311-05:00 FATAL: Falha para iniciar HTTP servidor em 127.0.0.1:4985: aberto certificado.pem: não tais arquivo ou diretório - descanso.(*ServerConfig).Servir() em configuração.go:716 |
- Se você estiver gerando um certificado autoassinadoProvavelmente, o campo mais importante é o
CommonName
. Deve ser o FQDN de seu Sync Gateway. Se o seu Sync Gateway não tiver um, você deverá especificar use10.0.2.2
para localhost ou o endereço IPA estático do seu Sync Gateway.
Arquivo de configuração do gateway de sincronização
Confirme se o arquivo de configuração do Sync Gateway inclui as seguintes propriedades
1 2 |
"SSLCert": "ssl/cert.pem", "SSLKey": "ssl/privkey.pem", |
Verificação da configuração de SSL em seu Sync Gateway
Para verificar se você pode se conectar ao Sync Gateway por SSL, execute o seguinte enrolar
em um comando de terminal. Substituir localhost no comando abaixo com o endereço IP de seu Sync Gateway.
1 |
enrolar -k -X OBTER https://localhost:4984 -H 'cache-control: no-cache' -verbose |
Se a configuração estiver correta, você deverá ver algo como isto na saída
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
* Reconstruído URL para: https://localhost:4984 / * Tentando ::1... * TCP_NODELAY definir * Conectado para localhost (::1) porto 4984 (#0) * ALPN, oferta http/1.1 * Cifra seleção: TODOS:!EXPORTAÇÃO:!EXPORTAÇÃO40:!EXPORTAÇÃO56:!aNULL:!BAIXO:!RC4:@FORÇA * com sucesso definir certificado verificar locais: * CAfile: /Usuários/priya.rajagopal/anaconda/ssl/cacert.pem CApath: nenhum * TLSv1.2 (SAÍDA), TLS cabeçalho, Certificado Status (22): * TLSv1.2 (SAÍDA), TLS aperto de mão, Cliente Olá (1): * TLSv1.2 (IN), TLS aperto de mão, Servidor Olá (2): * TLSv1.2 (IN), TLS aperto de mão, Certificado (11): * TLSv1.2 (IN), TLS aperto de mão, Servidor chave troca (12): * TLSv1.2 (IN), TLS aperto de mão, Servidor concluído (14): * TLSv1.2 (SAÍDA), TLS aperto de mão, Cliente chave troca (16): * TLSv1.2 (SAÍDA), TLS mudança cifra, Cliente Olá (1): * TLSv1.2 (SAÍDA), TLS aperto de mão, Finalizado (20): * TLSv1.2 (IN), TLS mudança cifra, Cliente Olá (1): * TLSv1.2 (IN), TLS aperto de mão, Finalizado (20): * SSL conexão usando TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 * ALPN, servidor aceito para uso http/1.1 * Servidor certificado: * assunto: C=EUA; ST=Michigan; O=Couchbase; CN=localhost * iniciar data: Dez 8 14:00:33 2017 GMT * expirar data: Dez 7 14:00:33 2020 GMT * emissor: C=EUA; ST=Michigan; O=Couchbase; CN=localhost * SSL certificado verificar resultado: autônomo assinado certificado (18), contínua De qualquer forma. > OBTER / HTTP/1.1 > Anfitrião: localhost:4984 > Usuário-Agente: enrolar/7.52.1 > Aceitar: / > cache-controle: não-cache > < HTTP/1.1 200 OK < Conteúdo-Comprimento: 130 < Conteúdo-Tipo: aplicativo/json < Servidor: Couchbase Sincronização Gateway/1.5.1 < Data: Sex, 08 Dez 2017 14:27:07 GMT < * Curl_http_done: chamado prematuro == 0 * Conexão #0 para o host localhost permaneceu intacto {"couchdb":"Bem-vindo","vendor" (fornecedor):{"name" (nome):"Gateway de sincronização do Couchbase","versão":1.5},"versão":"Couchbase Sync Gateway/1.5.1(4;cb9522c)"} |
- Converta o certificado PEM no formato der usando o comando abaixo
1 |
openssl x509 -informar PEM -em certificado.pem -forma exterior DER -fora certificado.cer |
Você pode consultar este Folha de dicas sobre SSL para obter detalhes sobre os vários comandos do openSSL.
- Copiar o
cert.pem
em seu arquivo Ativos pasta. Sua pasta de projeto do Android Studio deve ser semelhante a esta
- Fixação do certificado do servidor Sync Gateway
- Para fixar o certificado, devemos primeiro carregar o certificado que vem junto com o Ativos pasta.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
privado byte[] getPinnedCertFile(Contexto contexto) { Gerenciador de ativos gerenciador de ativos = contexto.getAssets(); InputStream é = nulo; byte[] bytes = novo byte[0]; tentar { é = gerenciador de ativos.aberto("cert.cer"); retorno (IOUtils.toByteArray(é)); } captura (IOException e) { e.printStackTrace(); } retorno nulo; } |
Neste exemplo, estamos usando as classes de utilitários IOUtils do [Apache Commons IO] (https://commons.apache.org/proper/commons-io/description.html) para converter o certificado lido do fluxo de entrada do arquivo em byte
array. Você pode escolher qualquer outra ferramenta/método para a conversão.
- Configurar o Replicador
com o certificado fixado. Em um aplicativo real, você deverá fazer uma verificação de nulidade no certificado antes de defini-lo. Omitir as verificações aqui por questões de brevidade.
1 2 3 4 5 6 7 8 9 10 |
ReplicatorConfiguration configuração = novo ReplicatorConfiguration(banco de dados, novo URLEndpoint(url)); configuração.setReplicatorType(ReplicatorConfiguration.ReplicatorType.PUSH_AND_PULL); configuração.setContinuous(verdadeiro); configuração.setAuthenticator(novo BasicAuthenticator(nome de usuário, senha)); // Obter o certificado incluído no aplicativo byte[] pinnedServerCert = este.getPinnedCertFile(contexto); // Definir certificado fixado. configuração.setPinnedServerCertificate(pinnedServerCert); Replicador replicador = novo Replicador(configuração); |
É isso aí! Com apenas algumas etapas, você pode ativar a fixação de certificados em seu aplicativo Android com o Couchbase Mobile 2.0.
O que vem a seguir
Esta postagem do blog discutiu os benefícios da fixação de certificados em seus aplicativos móveis e como você pode ativar a fixação de certificados com o Couchbase Lite 2.0. O exemplo discutiu um aplicativo Android, mas a abordagem também seria semelhante em outras plataformas.
Se tiver dúvidas ou comentários, deixe um comentário abaixo ou entre em contato comigo pelo Twitter @rajagp ou envie-me um e-mail priya.rajagopal@couchbase.com. O Fóruns do Couchbase são outro bom lugar para entrar em contato com perguntas.