我正在开发RPC服务,供开发人员使用,但是我希望确保我能够区分另一个应用程序的调试密钥和其公共密钥。是否有一种方法可以检查另一个应用程序的密钥并确定它是否为调试密钥而不是已发布的应用程序密钥?
这样做的目的是为了能够知道他们的应用程序处于开发还是发布状态,因为我需要确定他们是否应该访问我的开发服务器还是生产服务器。
这样做的目的是为了能够知道他们的应用程序处于开发还是发布状态,因为我需要确定他们是否应该访问我的开发服务器还是生产服务器。
notAfter
日期和时间最多只有1年 - Android Market不接受如此短的值 - 您可以使用该值来区分开发人员签名的版本?或者...您可以检查应用程序使用的公钥-请让他们使用其应用程序的android.content.pm.Signature对RPC请求进行签名?
PackageInfo pkgInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
for (Signature appSignature : pkgInfo.signatures) { // javax.security - NOT java.security! X509Certificate appCertificate = X509Certificate.getInstance(appSignature.toByteArray()); // appCertificate.getNotAfter() 可以给出证书过期的日期和时间 // appCertificate.getPublicKey() 可以提供您用于签署RPC请求的公钥。 // appCertificate.getSubjectDN() 将为任何未被开发人员手工制作的调试证书提供名为“CN = Android Debug,O = Android,C = US”的主体。 }
static final String DEBUGKEY =
" key ";
public static boolean signedWithDebugKey(Context context, Class<?> cls)
{
boolean result = false;
try {
PackageInfo pinfo = context.getPackageManager().getPackageInfo("your package name",PackageManager.GET_SIGNATURES);
Signature sigs[] = pinfo.signatures;
Log.d(TAG,sigs[0].toCharsString());
if (DEBUGKEY.equals(sigs[0].toCharsString())) {
result = true;
Log.d(TAG,"package has been signed with the debug key");
} else {
Log.d(TAG,"package signed with a key other than the debug key");
}
} catch (android.content.pm.PackageManager.NameNotFoundException e) {
return false;
}
return result;
}
首次使用debugkey运行此代码,它将始终返回false,但您将在Logcat中获得编码的密钥。复制该编码密钥,并替换DEBUGKEY中的“key”值,它就可以正常工作。