我希望使用双向SSL保护Java REST后端服务,以防止未经授权的访问。
Android APK需要签名才能工作,有可能创建一个"信任"我的REST服务和这个APK之间没有使用客户端代码中的APK证书的硬编码密码?
主要思想是将服务器双向SSL配置为仅信任来自APK证书的连接。
答案 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所做的事情..