微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在远程Couchdb实例上使用带自签名证书的cloudant的问题

如何解决在远程Couchdb实例上使用带自签名证书的cloudant的问题

我正在尝试设置一个访问远程CouchDB实例的android应用。我正在使用本地数据库,并使用cloudant同步数据存储将数据从本地数据库复制到远程CouchDB实例。

到目前为止,我们使用http来访问CouchDB。一切都很好。最近,我们移至https。我通过在CouchDB服务器上设置自签名证书并设置CouchDB来进行https访问来做到这一点。 我通过在https上打开CouchDB控制台进行了验证,并确保它可以正常工作。 (Chrome浏览器会警告您使用不太安全的连接,但是一旦您接受,它就会打开控制台)

但是在Android上,我总是收到CouchException:来自https:// IP:6984 / _session的反序列化响应时出错。

然后,我查找了以下页面,并使用了其中给出的代码示例:https://developer.android.com/training/articles/security-ssl

只是稍作更改,以便创建SSLContext并使用它来创建SSLCustomizerInterceptor,该对象可在构建复制器对象时用作请求拦截器。

这是我使用的代码

// Load CAs from an InputStream
// (Could be from a resource or ByteArrayInputStream or ...)
CertificateFactory cf = CertificateFactory.getInstance("X.509");
// From https://www.washington.edu/itconnect/security/ca/load-der.crt
InputStream caInput = new BufferedInputStream(new FileInputStream("load-der.crt"));
Certificate ca;
try {
    ca = cf.generateCertificate(caInput);
    System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
} finally {
    caInput.close();
}

// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null,null);
keyStore.setCertificateEntry("ca",ca);

// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);

// Create an SSLContext that uses our TrustManager
SSLContext context = SSLContext.getInstance("TLS");
context.init(null,tmf.getTrustManagers(),null);

SSLSocketFactory mSSLSocketFactory = context.getSocketFactory();
if (mSSLSocketFactory != null)
      SSLCustomizerInterceptor mSSLInterceptor = new SSLCustomizerInterceptor(mSSLSocketFactory);

完成后,我将此拦截器加载到列表中,并在创建复制器对象时将其传递。

List<httpconnectionRequestInterceptor> interceptorList = new ArrayList<>();
            interceptorList.add((httpconnectionRequestInterceptor) mSSLInterceptor);

Replicator replicator = ReplicatorBuilder.push().from(mDocumentStore).to(mUri).filter(mpushFilter).username("admin").password("password").addRequestInterceptors(interceptorList).build();

我希望这能拦截每个发送到长沙发数据库的https请求,然后使用我提供的SSL证书。但这是行不通的。我总是收到一个CouchException错误:无法从https://:6984 / _session

读取服务器响应

一些问题:

  1. 以上添加SSL请求拦截器的方法是否正确,以将https请求发送到https CouchDB服务器?如果没有,怎么办?

  2. 是否需要更改CouchDB设置?我遵循了https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=48203146中给出的说明。在这里,他们提到了在Couchdb设置中需要执行哪些操作才能打开ssl并能够读取ssl证书。

上一页看,这似乎是与CouchDB相关的设置或问题。如果我的SSL设置或证书有问题,则很可能引发了SSLHandshakeException或类似事件。自从我收到CouchException以来,这告诉我该应用程序能够读取证书并能够访问远程https服务器,但在那里出现异常。

建议。

谢谢 嗯

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。