Java 掴;找不到证书路径的信任锚点“;

Java 掴;找不到证书路径的信任锚点“;,java,android,ssl,xmpp,smack,Java,Android,Ssl,Xmpp,Smack,我正在尝试从Android连接到localhost中的ApacheVysperXMPP服务器。我正在使用框架执行XMPP操作: AbstractXMPPConnection connection = new XMPPTCPConnection("bigdestroyer", "", ip); try { connection.setPacketReplyTimeout(10000); connection.connect(); } catch (S

我正在尝试从Android连接到localhost中的ApacheVysperXMPP服务器。我正在使用框架执行XMPP操作:

AbstractXMPPConnection connection = new XMPPTCPConnection("bigdestroyer", "", ip);
  try {
      connection.setPacketReplyTimeout(10000);        
      connection.connect();
  } catch (SmackException e) {
      e.printStackTrace();
  } catch (IOException e) {
      e.printStackTrace();
  } catch (XMPPException e) {
      e.printStackTrace();
  }
但我得到了这个错误:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidator异常:的信任锚 找不到证书路径

我想这与SSL证书有关,但我不知道我必须做什么。你能帮我吗

我已尝试将
cert
文件(与服务器相同)放入
assets
文件夹,并通过以下方式创建连接:

  XMPPTCPConnectionConfiguration connectionConfiguration = configuration.setConnectTimeout(10000)
                    .setUsernameAndPassword("admin", "admin")
                    .setHost(ip)
                    .setServiceName(ip)
                    .setKeystorePath("file:///android_asset/bogus_mina_tls.cert")
                    .build();

XMPPTCPConnection connection = new XMPPTCPConnection(connectionConfiguration);

但它仍然不起作用。有什么建议吗?

有两种方法可以解决您的问题:

  • 通过让可信的第三方对服务器的证书进行签名来修复服务器

  • 有你的客户

  • 也许可以解决这个问题:

    验证服务器证书时出现的常见问题可能有多种原因,包括:
  • 颁发服务器证书的CA未知
  • 服务器证书不是由CA签名的,而是自签名的
  • 服务器配置缺少中间CA
  • 以下各节将讨论如何解决这些问题 保持与服务器的连接安全

    未知证书颁发机构 在这种情况下,发生SSLHandshakeException是因为您有一个CA 这是系统不信任的。可能是因为你有一个 来自新CA的证书,该CA尚未被Android或您的 应用程序在没有CA的旧版本上运行。CA通常是 未知,因为它不是公共CA,而是由 组织,如政府、公司或教育机构 供自己使用的机构

    幸运的是,您可以教会HttpsURLConnection信任特定的集合 中科院院士。这个过程可能有点复杂,所以下面是一个例子 从InputStream中获取特定CA的示例,将其用于 创建密钥库,然后用于创建和初始化 信托经理。信任管理器是系统用来验证的工具 来自服务器的证书,并通过使用 一个或多个CA—这些CA将是唯一受其信任的CA 信托经理

    给定新的TrustManager,该示例初始化一个新的SSLContext 它提供了一个SSLSocketFactory,可用于覆盖默认值 来自HttpsURLConnection的SSLSocketFactory。这样,连接将 使用您的CA进行证书验证

    下面是使用来自的组织CA的完整示例 华盛顿大学:< /P> 使用了解您的CA的自定义TrustManager,系统将 能够验证您的服务器证书是否来自受信任的 发行人

    注意:许多网站都描述了一个糟糕的替代解决方案,即 安装不执行任何操作的TrustManager。如果你这样做,你可能会 最好不要加密你的通信,因为任何人都可以 使用DNS技巧在公共Wi-Fi热点攻击您的用户 通过用户自己的代理发送用户流量,该代理假装 做你的服务器。然后,攻击者可以记录密码和其他信息 个人资料。这是因为攻击者可以生成 证书,并且没有实际验证该证书的TrustManager 证书来自您的应用可能正在谈论的可信来源 对任何人。所以不要这样做,即使是暂时的。你随时都可以 你的应用程序信任服务器证书的颁发者,所以就这么做吧


    该页面继续提供其他可能性,但这一个似乎是最相关的。

    keystrepath应该指向密钥库,而不是简单的证书。Android默认使用KeystoreType BKS,因此您应该创建一个并将您的证书导入其中:

    keytool -importcert -v -trustcacerts \
      -file "[YOUR_PUBLIC_CERTIFICATE_PATH]" \
      -alias [YOUR_ALIAS] -keystore "[BKS_TARGET_PATH]" \
      -provider org.bouncycastle.jce.provider.BouncyCastleProvider \
      -providerpath "[BOUNCY_CASTLE_JAR_PATH]" -storetype BKS \
      -storepass [YOUR_PASSWORD]
    
    如果您不想弄乱命令行,也可以使用Portecle()来实现这一点

    要获取证书文件,可以使用openssl s_客户端命令:

    openssl s_client -showcerts -connect <SERVER_URL>:<SERVER_PORT>  </dev/null
    

    openssl s_客户端-showcerts-connect:您的问题解决了吗?链接断开了。你可以发布其他链接或实际步骤吗?
    
    openssl s_client -showcerts -connect <SERVER_URL>:<SERVER_PORT>  </dev/null