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 Using metadata purge interval of 3.00 days for tombstone compaction. 2017–12–10T16:05:21.305–05:00 Starting admin server on 127.0.0.1:4985 2017–12–10T16:05:21.310–05:00 Starting server on :4984 … 2017–12–10T16:05:21.310–05:00 HTTP: Protocols enabled: [http/1.1] on 127.0.0.1:4985 2017–12–10T16:05:21.311–05:00 FATAL: Failed to start HTTP server on 127.0.0.1:4985: open cert.pem: no such file or directory – rest.(*ServerConfig).Serve() at config.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.2para 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 |
curl -k -X GET 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 |
* Rebuilt URL to: https://localhost:4984 / * Trying ::1… * TCP_NODELAY set * Connected to localhost (::1) port 4984 (#0) * ALPN, offering http/1.1 * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH * successfully set certificate verify locations: * CAfile: /Users/priya.rajagopal/anaconda/ssl/cacert.pem CApath: none * TLSv1.2 (OUT), TLS header, Certificate Status (22): * TLSv1.2 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS handshake, Certificate (11): * TLSv1.2 (IN), TLS handshake, Server key exchange (12): * TLSv1.2 (IN), TLS handshake, Server finished (14): * TLSv1.2 (OUT), TLS handshake, Client key exchange (16): * TLSv1.2 (OUT), TLS change cipher, Client hello (1): * TLSv1.2 (OUT), TLS handshake, Finished (20): * TLSv1.2 (IN), TLS change cipher, Client hello (1): * TLSv1.2 (IN), TLS handshake, Finished (20): * SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 * ALPN, server accepted to use http/1.1 * Server certificate: * subject: C=US; ST=Michigan; O=Couchbase; CN=localhost * start date: Dec 8 14:00:33 2017 GMT * expire date: Dec 7 14:00:33 2020 GMT * issuer: C=US; ST=Michigan; O=Couchbase; CN=localhost * SSL certificate verify result: self signed certificate (18), continuing anyway. > GET / HTTP/1.1 > Host: localhost:4984 > User-Agent: curl/7.52.1 > Accept: / > cache-control: no-cache > < HTTP/1.1 200 OK < Content-Length: 130 < Content-Type: application/json < Server: Couchbase Sync Gateway/1.5.1 < Date: Fri, 08 Dec 2017 14:27:07 GMT < * Curl_http_done: called premature == 0 * Connection #0 to host localhost left intact {"couchdb":"Welcome","vendor":{"name":"Couchbase Sync Gateway","version":1.5},"version":"Couchbase Sync Gateway/1.5.1(4;cb9522c)"} |
- Converta o certificado PEM no formato der usando o comando abaixo
|
1 |
openssl x509 -inform PEM -in cert.pem -outform DER -out cert.cer |
Você pode consultar este Folha de dicas sobre SSL para obter detalhes sobre os vários comandos do openSSL.
- Copiar o
cert.pemem 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 |
private byte[] getPinnedCertFile(Context context) { AssetManager assetManager = context.getAssets(); InputStream is = null; byte[] bytes = new byte[0]; try { is = assetManager.open("cert.cer"); return (IOUtils.toByteArray(is)); } catch (IOException e) { e.printStackTrace(); } return null; } |
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 config = new ReplicatorConfiguration(database, new URLEndpoint(url)); config.setReplicatorType(ReplicatorConfiguration.ReplicatorType.PUSH_AND_PULL); config.setContinuous(true); config.setAuthenticator(new BasicAuthenticator(username, password)); // Get the certificate bundled in with the app byte[] pinnedServerCert = this.getPinnedCertFile(context); // Set pinned certificate. config.setPinnedServerCertificate(pinnedServerCert); Replicator replicator = new Replicator(config); |
É 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.