Articles of openssl

无法在Windows / Cygwin上为Android NDK构建外部OpenSSL库

我需要为Android应用程序构建最新的OpenSSL(1.0.0g)。 我试图按照https://github.com/fries/android-external-openssl给出的例子,但我无法建立它。 我正在运行带有完整且最近的Cygwin的Windows 7 Professional(64位)。 我已经安装了Android SDK和NDK,我可以成功构建并运行NDK的hello-jni示例应用程序。 我创建了一个名为hello-openssl的新示例NDK应用程序。 在其jni目录中,我创建了一个openssl目录。 在那里,我解压缩了https://github.com/fries/android-external-openssl/zipball/master ,它在c:\ android \ android-ndk \ samples \ hello-openssl下给了我这个树结构: jni +- openssl +- apps +- crypto +- include +- openssl +- ssl 然后我修改了jni目录中的Android.mk文件,试图包含OpenSSL文件: subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \ openssl \ )) include $(subdirs) 现在,当我执行ndk-build时,它会编译几个.c文件,但很快就会失败: Compile thumb : crypto <= cryptlib.c In file included from jni/openssl/crypto/cryptlib.c:117: […]

如何使用ndk8在Windows上构建Openssl for Android?

我尝试下载OpenSSL-Android 。 然后运行ndk-build,在这种情况下是ndk8c。 我收到错误: process_begin: CreateProcess(NULL, pwd, …) failed. d:/Development/android/android-ndk-r8d/build/gmsl/__gmsl:512: *** non-numeric second argument to `wordlist’ function: ”. Stop. 当我将修复应用于__gsml时,如此处所述 我收到错误: Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: /Android.mk d:/Development/android/android-ndk-r8c/build/core/add-application.mk:165: *** Android NDK: Aborting… . Stop. 或者我可以下载二进制文件吗? 我基本上只需要libcrypto.so。 这是我正在使用的Android.mk: LOCAL_PATH := $(call my-dir) subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \ crypto \ ssl \ […]

显示Android证书

我有一个简短的问题:这个电话是什么回复? context.getPackageManager().getPackageInfo(context.getPackageName(), GET_SIGNATURES).signatures[0].toByteArray(); 我知道它会返回应用程序的第一个应用程序证书,即META-INF文件夹中的CERT.RSA,但它返回的是什么? 只是一个字节数组,它将整个证书表示为文件或其他字节数组? 我真的不太了解证书的结构和它们包含的数据,所以我真的没有任何线索。 最好的答案是openssl的指令,我从上面的代码行得到返回的值。

从KeyStore传输PrivateKey,在OpenSSL中使用JNI

我有使用WebRTC的Android应用程序。 一切都很完美。 但现在,主要问题是加密。 为了拨打电话和转接数据,WebRTC为每次通话创建并使用一个KeyPair 。 但我想使用KayPair自定义AndroidKeyStore 。 对于这个问题,我需要将自己的KeyPair发送到OpenSSL共享对象才能工作。 修复程序将在NATIVE OpenSSL代码中,其中WebRTC使用此函数获取加密数据的OpenSSL上下文( opensslidnetity.cc ): bool OpenSSLIdentity::ConfigureIdentity { … } 如何将PK从AndroidKeyStore转移到WebRTC本机代码? 另一种情况,如何为WebRTC加密设置自定义PK工作? AndroidKeyStore 在Java中,我可以打开KeyStore( AndroidKeyStore )并获取准备传输的公钥(具有方法的密钥字节 – getEncoded() )。 此外,我可以获取加密数据的私钥,但我无法以字节为单位发送此密钥,因为getEncoded()返回null。 在这种情况下,我想,我可以获取PublicKey abd PrivateKey并将它们保存在bytes数组中。 然后,在本机代码中调用准备好的方法。 更新 :google.source.chromium中有类似的内容。 他们从Android KeyStore获取密钥并在本机代码中创建OpenSSL上下文。 用于获取和使用AndroidKeyStore for TLS的本机类 – 链接1和链接2 。

Android的SSL问题

我的Android上有一个非常具体的SSL问题。 如果我尝试通过代码访问特定网站,我会收到以下错误: SSL handshake failure: Failure in SSL library, usually a protocol error error:140773F2:SSL routines:SSL23_GET_SERVER_HELLO: sslv3 alert unexpected message (external/openssl/ssl/s23_cInt.c:500 0xaf076228:0x00000000) 无论构建如何,我都会得到这个…我已经在API级别1.5,1.6,2.2和4.0上尝试过它,并且每次都得到相同的结果。 经过一些故障排除我试图通过浏览器访问该网站,我收到以下错误: Data connectivity problem A secure connection could not be established. 但事情是这样的……网站在Windows浏览器上打开就好了(在Firefox,IE和Chrome上测试过)。 它也可以在iOS设备上打开,它使用与Android相同的webkit,这很奇怪。 该网站在Opera Mini浏览器上也可以正常运行。 这是网站。 我已经尝试过将客户端证书添加到密钥库并忽略无效的客户端证书而没有结果的解决方法。 但是看起来证书本身不是问题。 我陷入了僵局。 任何人都可以就如何让它发挥作用提供任何指导吗?

如何在ANDROID应用程序中使用openSSL库

我正在尝试使用Android NDK在我的Android应用程序中嵌入openssl库,但我不知道如何使用该库,所以请任何人都可以告诉我如何使用它请发送源代码供我参考… …. 相关: 如何在Android / Linux上构建OpenSSL?

我的Android项目的FIPS合规性

我正在开发一个与安全相关的项目,并且必须确保它符合FIPS标准。 根据我的理解,FIPS合规性是硬件和软件级别的合规性。 目前有2款三星Android设备符合FIPS标准,即它们在硬件和软件级别都具有合规性。 我的问题如下: – 1)如果我想让我的Android应用程序符合FIPS标准,如果我在我的项目FIPS兼容中使用了唯一的加密模块,这就够了吗? Android SDK提供的加密模块是BouncyCastle库,不符合FIPS标准。 我按照stackoverflow 链接在我的项目中使用符合FIPS标准的OpenSSL库 我使用OpenSSL库构建了我的项目库,即使用FIPS模块配置的libssl.a和libcrypto.a。 2)根据用于Android 文档的FIPS OpenSSL模块,该模块已经在armv7架构的不同Android设备上进行了测试。 Android硬件不符合FIPS标准吗? 3)AES算法符合FIPS标准。 这是否意味着如果我在Java代码中使用AES算法而不是使用符合FIPS标准的OpenSSL库,那么它不符合FIPS标准。 如果AES符合FIPS标准,那么它与AES或C#的AES实现有什么关系。 他们都必须通过CMVP吗? 请赐教。

使用AndroidHttpClient的SSL / TLS协议和密码套件

编辑:道歉,如果我的原始post措辞不好。 它引起了一些混乱,以对原始post的评论为代表。 那么让我再试一次: 我开始提问。 我想在Android上解决问题,但不知道如何。 我花了很多时间在网上寻找解决方案,但没有find任何关于此事的单一讨论。 尽管如此,包括StackOverflow线程在内的一些讨论让我看到了一种前景看好的技术。 我解决了这个问题。 但解决方案有点牵扯。 所以我决定在这里发布这个问题,思考a)必须有一个更好的解决方案,并希望有人知道并在这里发布答案; 或者b)也许这是一个很好的解决方案,因为我发现网上其他任何地方都没有讨论过这个问题,也许我对这个问题的解决方案对于其他试图做同样事情的人来说也是有用的。 无论哪种方式,结果都将是对StackOverflow的新贡献:一个在其他地方无法回答的问题,最终会以某种方式回答正确答案。 事实上,StackOverflow甚至邀请我在我最初发布它时通过分享我的知识来回答我自己的问题。 事实上,那是我动机的一部分。 即使是这件事的事实也没有收集到我发现的任何地方。 所以: 问:使用AndroidHttpClient通过HTTPS发出REST请求时,如何指定要使用的SSL协议和密码? 这个很重要。 很明显,服务器上可以做很多事情,但是有限制。 同一台服务器必须提供浏览器,包括旧浏览器以及其他客户端。 这意味着服务器必须支持广泛的协议和密码。 即使在Android中,如果你必须支持许多不同的版本,你将不得不支持许多不同的协议和密码。 更重要的是,默认情况下,OpenSSL在SSL握手期间尊重客户端的密码首选项, 而不是服务器密码首选项。 例如,请参阅此文章 ,其中说明您可以通过设置SSL_OP_CIPHER_SERVER_PREFERENCE来覆盖客户端中的该行为。 目前还不完全清楚这个选项是否可以在Java中的SSLSocket上设置。 即使可以,您也可以自己设置密码列表或告诉客户端尊重服务器列表。 否则,您将获得Android默认值,无论您运行的版本是什么(不是您链接的版本)。 如果采用默认值,可以在此处看到客户端通过Jellybean 4.2+客户端发送到服务器的首选项列表,从第504行开始。默认的协议列表从第620行开始。虽然Jellybean 4.2+包含对OpenSSL的支持1.0.1,特别是TLSv1.1和TLSv1.2,默认情况下不启用这些协议。 如果你不做我做过的事情,你就无法利用TLSv1.2支持,尽管在最新版本的Android上宣传了对TLSv1.2的支持。 回顾以前的Android版本,细节会有很大差异。 至少,您可能希望仔细查看所有受支持版本的默认值,并查看您的客户端实际在做什么。 你可能会感到惊讶。 关于对各种协议和密码的支持,你可以说更多。 关键是,有时可能需要在客户端中更改这些设置。 A.使用自定义SSLSocketFactory 这对我来说效果很好,最后,代码并不多。 但由于以下几个原因,它有点棘手: 有两种不同的SSLSocketFactory类。 客户端需要一个org.apache.http.conn.ssl.SSLSocketFactory,但OpenSSL返回一个javax.net.ssl.SSLSocketFactory。 这绝对令人困惑。 我使用委托让一个人打电话给另一个,没有太多问题。 注意OpenSSLContextImpl和SSLContextImpl之间的区别。 一个只是包装另一个,但它们不可互换。 当我使用SSLContextImpl.engineGetSocketFactory方法时 – 我忘记了究竟发生了什么,但是有些东西悄然失败了。 一定要使用OpenSSLContextImpl来获取套接字工厂,而不是SSLContextImpl。 您也可以使用javax.net.ssl.SSLSocketFactory.getDefault(),但我不确定。 你不能轻易地将AndroidHttpClient子类化,因为它的构造函数是私有的。 这是不幸的,因为它提供了一些其他不错的好东西,比如确保正确关闭它而不是泄漏资源。 DefaultHttpClient工作得很好。 […]

编译适用于Android的OpenSSL 1.1.0

我正在尝试通过cygwin在Android上编译openssl-1.1.0遵循以下指南: 编译最新的OpenSSL for Android 但它失败了,这是错误: crypto/aes/aes_ecb.c:10:20: fatal error: assert.h: No such file or directory #include 我使用的是Android-ndk-r12b,Win10,cygwin 64位。 这是我在编译之前的预配置: export NDK=~/android-ndk-r12b $NDK/build/tools/make-standalone-toolchain.sh –platform=android-21 –toolchain=arm-linux-androideabi-4.9 –install-dir=`pwd`/android-toolchain-arm export TOOLCHAIN_PATH=`pwd`/android-toolchain-arm/bin export TOOL=arm-linux-androideabi export NDK_TOOLCHAIN_BASENAME=${TOOLCHAIN_PATH}/${TOOL} export CC=$NDK_TOOLCHAIN_BASENAME-gcc export CXX=$NDK_TOOLCHAIN_BASENAME-g++ export LINK=${CXX} export LD=$NDK_TOOLCHAIN_BASENAME-ld export AR=$NDK_TOOLCHAIN_BASENAME-ar export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib export STRIP=$NDK_TOOLCHAIN_BASENAME-strip export ARCH_FLAGS=”-mthumb” export ARCH_LINK= export CPPFLAGS=” ${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector […]

如何将OpenSSL指向Android设备上的根证书?

我已经设法为ARMv6交叉编译OpenSSL以与Android NDK一起使用并让它在我的应用程序中运行。 但是,在尝试与知名主机(例如https://google.com )建立HTTPS连接时,我始终收到错误“SSL证书无效”。 但是,我可以在任何设备的浏览器(股票浏览器,Chrome,Firefox等)中显示安全页面。 因此,我只能假设OpenSSL没有find存储在设备上的根证书。 然后,我的问题分为两个非常相关的子问题: Android在哪里存储根证书? 我怎样才能将OpenSSL指向他们?