【发布时间】:2011-08-17 09:46:55
【问题描述】:
我正在尝试通过 NDK 在 C 中的 Android 上制作最基本的 x509 公钥证书文件。我用来自https://github.com/guardianproject/openssl-android 的东西构建了 libcrypto 和 libssl(虽然我目前只使用 libcrypto 的东西)。
由于我在让它工作时遇到了一些问题,我最终让它在 linux 中工作,在那里我有一个更愉快的调试设置。我在我的 linux 机器上工作的代码如下:
void x509(RSA *rsa_keys) {
EVP_PKEY *evp = EVP_PKEY_new();
X509 *x509 = X509_new();
EVP_PKEY_assign_RSA(evp, rsa_keys);
X509_gmtime_adj(X509_get_notBefore(x509),0);
X509_gmtime_adj(X509_get_notAfter(x509), (long) 60*60*24*365);
X509_set_pubkey(x509, evp);
unsigned char *out = NULL;
int length = i2d_X509(x509, &out);
FILE *x509_file = fopen("cert.cer", "w");
fwrite(out, 1, length, x509_file);
}
这段代码运行良好,并写出一个由 openssl 解析的文件
openssl x509 -inform DER -text -in cert.cer
当我在 Android 上的 NDK 中运行相同的代码时,我得到了 X509_set_pubkey(x509, evp) 调用(由打印输出调试确定),没有 ERR_get_error() 报告的任何 openssl 错误,然后得到一个信号 11 (SIGSEGV ),代码 1 (SEGV_MAPPER) 有一个大堆栈跟踪
从堆栈跟踪中唯一看起来非常有用的是崩溃发生在 libcrypto.so 的深处
08-17 01:40:41.261: INFO/DEBUG(10354): #00 pc 00041d1a /system/lib/libcrypto.so
08-17 01:40:41.261: INFO/DEBUG(10354): #01 pc 000357c6 /system/lib/libcrypto.so
08-17 01:40:41.261: INFO/DEBUG(10354): #02 pc 000337ba /system/lib/libcrypto.so
08-17 01:40:41.261: INFO/DEBUG(10354): #03 pc 000338c8 /system/lib/libcrypto.so
08-17 01:40:41.268: INFO/DEBUG(10354): #04 pc 000339e6 /system/lib/libcrypto.so
08-17 01:40:41.268: INFO/DEBUG(10354): #05 pc 00033f00 /system/lib/libcrypto.so
08-17 01:40:41.268: INFO/DEBUG(10354): #06 pc 00033b20 /system/lib/libcrypto.so
08-17 01:40:41.268: INFO/DEBUG(10354): #07 pc 00033f44 /system/lib/libcrypto.so
08-17 01:40:41.268: INFO/DEBUG(10354): #08 pc 00033f9c /system/lib/libcrypto.so
08-17 01:40:41.268: INFO/DEBUG(10354): #09 pc 000770e6 /system/lib/libcrypto.so
08-17 01:40:41.268: INFO/DEBUG(10354): #10 pc 00076fec /system/lib/libcrypto.so
08-17 01:40:41.268: INFO/DEBUG(10354): #11 pc 00036b68 /system/lib/libcrypto.so
08-17 01:40:41.268: INFO/DEBUG(10354): #12 pc 0007ed1a /system/lib/libcrypto.so
我唯一能想到的是我构建的 Openssl 存在问题,但这似乎不太可能,有什么想法吗?
谢谢
【问题讨论】:
标签: android c java-native-interface openssl android-ndk