【问题标题】:java sardine over sslssl 上的 java 沙丁鱼
【发布时间】:2011-12-18 10:12:20
【问题描述】:

我正在尝试 sardine 制作 webdav 客户端,但它无法连接到我的 https 服务器。 在使用指南中说这个关于 ssl http://code.google.com/p/sardine/wiki/UsageGuide#SSL 但我不知道如何为我的自定义 Http 客户端提供我的密钥库。

我收到此错误。

线程“主”javax.net.ssl.SSLPeerUnverifiedException 中的异常:对等体未通过身份验证 在 com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(未知来源) 在 org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128) 在 org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:397) 在 org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148) 在 org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149) 在 org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121) 在 org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573) 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425) 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:941) 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:919) 在 com.googlecode.sardine.impl.SardineImpl.execute(SardineImpl.java:684) 在 com.googlecode.sardine.impl.SardineImpl.list(SardineImpl.java:339) 在 com.googlecode.sardine.impl.SardineImpl.getResources(SardineImpl.java:326) 在 sardine.main(sardine.java:15)

我该如何设置?

【问题讨论】:

  • 我对 Sardine over SSL 的 Android 实现也没有任何运气。我也收到“对等证书错误”。我有一个 BouncyCastle 格式 (BKS) 的密钥库,现在需要它而不是我读过的 JKS。它保存在 res/raw/ 目录中。我似乎无法弄清楚在哪里覆盖已经提到的 HTTP CLIENT。看起来该库使用 ABSTRACT HTTP CLIENT。哪里会覆盖 HTTP CLIENT?还有其他例子吗?编辑:对于它的价值。我注意到使用模拟器进行测试从未奏效,但是当我在真实设备上进行测试时,我感到很糟糕

标签: android ssl https webdav sardine


【解决方案1】:

将密钥库存储为原始资源,加载它们并使用它们来初始化SSLSocketFactory。您可以使用它来实例化HttpClient。要插入 Sardine,您需要覆盖他们在 Wiki 中指定的方法以返回您自定义的 HttpClient 实例。

【讨论】:

  • 阅读我上面链接的 SSLSocketFactory,它有关于创建和使用密钥库的信息。
  • 这很糟糕,很糟糕,很糟糕。我希望人们不要再写他们不理解的东西了。此代码将接受任何和所有证书,并有效地使 SSL 无效。您可能会将您的东西发布到恶意服务器,而您永远不会知道。请创建您自己的信任库并正确安装。
【解决方案2】:

很简单的例子(http://mydrive.net 和 Linux):

  • 使用 OpenSSL 从 mydrive.net 下载证书
    • openssl s_client -connect webdav.mydrive.ch:443 > mydrive.net.crt
  • 删除 mydrive.net.crt 文件中除 BEGIN 和 END(包括)之间的所有内容
  • 生成新的密钥库:
    • keytool -genkey -alias dummy -keyalg RSA -keystore /etc/ssl/certs/java/yourKeyStore.jks -keysize 2048
    • 使用安全密码
    • 删除未使用的生成证书
      • keytool -delete -alias dummy -keystore /etc/ssl/certs/java/yourKeyStore.jks
  • 从 mydrive.net 导入证书
    • keytool -import -trustcacerts -alias mydrive.net -keystore /etc/ssl/certs/java/kyourKeyStore.jks -file ./mydrive.net.crt
  • 验证导入:
    • keytool -list -keystore /etc/ssl/certs/java/yourKeyStore.jks
  • 为密钥库添加 Java 参数
    • JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.trustStore=/etc/ssl/certs/java/yourKeyStore.jks"
  • 重启JVM

现在您无需覆盖或重新实现方法即可使用 Sardine。只需使用

Sardine sardine = SardineFactory.begin(username, password);
List<DavResource> resources = sardine.list("https://webdav.mydrive.ch/");

提示: 确保使用正确的证书。例如,MyDrive 有几个证书

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    相关资源
    最近更新 更多