1

我想使用双向 SSL 保护 Java REST 后端服务,以防止未经授权的访问。

Android APK 需要签名才能工作,是否可以在我的 REST 服务和此 APK 之间创建“信任”,而无需在客户端代码中使用来自 APK 证书的硬编码密码?

主要思想是将服务器双向 SSL 配置为仅信任来自 APK 证书的连接。

4

3 回答 3

1

为了执行双向 TLS/SSL,您需要在客户端设备上拥有带有私钥的证书。用于签署 APK 的证书将生成设备上证书的公钥,而不是私钥。您可能希望避免将此私钥放在设备上,因为它会允许其他人像您一样签署 APK。

您应该考虑使用可能在初始注册过程中为每个设备生成的单独证书,而不是为双向 TLS/SSL 使用 APK 签名证书。该证书将安装到 Android KeyStore,并且该证书的公钥需要安装在托管后端 REST 服务的服务器上。然后,此证书将以与分配给设备的用户名/密码对类似的方式充当客户端凭据。

有关在 Android 上使用客户端证书的示例,请参阅:http ://chariotsolutions.com/blog/post/https-with-client-certificates-on/

于 2015-01-03T00:39:18.917 回答
1

是否可以在我的 REST 服务和此 APK 之间创建“信任”,而无需在客户端代码中使用来自 APK 证书的硬编码密码?

并不真地。您在 APK 中的公钥与密码一样“硬编码”。任何人都可以进入并使用该信息来访问您的 REST 服务。

于 2015-01-02T21:26:42.293 回答
0

我认为您可以尝试使用此处的答案并使用您用来签署 apk 的密钥的 SHA ..

它是这样说的:

// Add code to print out the key hash
  try {
  PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
  for (Signature signature : info.signatures) {
  MessageDigest md = MessageDigest.getInstance("SHA");
  md.update(signature.toByteArray());
  Log.e("MY KEY HASH:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
      }
  } catch (NameNotFoundException e) {

  } catch (NoSuchAlgorithmException e) {

  }

您可以将密钥保存在服务器端。我认为这就是 Facebook 或 Google 所做的事情。

于 2015-01-02T21:09:07.277 回答