使用APK证书创建SSL上下文

时间:2015-01-02 21:03:13

标签: android security ssl backend trust

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

Android APK需要签名才能工作,有可能创建一个"信任"我的REST服务和这个APK之间没有使用客户端代码中的APK证书的硬编码密码?

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

3 个答案:

答案 0 :(得分:1)

  

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

我认为您可以尝试使用here的答案并使用您用来签署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所做的事情..