Articles of openssl

符合我的Android项目的FIPS

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

SSL / TLS协议和密码套件与AndroidHttpClient

编辑:道歉,如果我原来的职位措辞不佳。 这引起了一些混乱,以原文的评论为代表。 所以让我再试一次: 我从一个问题开始。 我想解决Android上的一个问题,但不知道如何。 我花了很多时间在networking上寻找解决scheme,但没有发现任何关于这个问题的讨论。 尽pipe如此,包括StackOverflow线程在内的一些讨论让我看到了一种看起来很有前途的技术。 我解决了这个问题。 但是解决scheme有一点涉及。 所以我决定在这里提出这个问题,思考a)必须有一个更好的解决scheme,希望有人知道并张贴在这里回答; 或者b)也许这是一个很好的解决scheme,因为我没有在networking上的其他任何地方find这个问题的讨论,也许我对这个问题的解决scheme对其他人试图做同样的事情是有用的。 无论哪种方式,结果将是一个新的贡献StackOverflow:一个问题是没有回答其他地方,最终,正确的答案是这样或那样。 实际上,StackOverflow甚至邀请我通过分享我最初发布的知识来回答我自己的问题。 事实上,这是我的一部分动机。 即使这件事情的事实并不是我find的任何地方。 所以: 问:使用AndroidHttpClient通过HTTPS发出REST请求时,如何指定要使用的SSL协议和密码? 这个很重要。 很重要的一点是,在服务器上可以做很多事情,但是有限制。 同一台服务器必须提供浏览器,包括旧的,以及其他客户端。 这意味着服务器必须支持各种协议和密码。 即使在Android中,如果你必须支持很多不同的版本,你将不得不支持一些不同的协议和密码。 更重要的是,默认情况下,在SSL握手期间,OpenSSL尊重客户端的密码首选项, 而不是服务器的首选项。 例如,看到这个post ,说你可以通过设置SSL_OP_CIPHER_SERVER_PREFERENCE覆盖客户端的行为。 这个选项甚至可以在Java中的SSLSocket上设置,这并不完全清楚。 即使可以,您也可以自己设置密码列表,或者告诉客户端遵守服务器列表。 否则,你会得到Android的默认值,无论它运行在哪个版本上(不是你链接的版本)。 如果采取默认设置,客户端通过Jellybean 4.2+客户端发送到服务器的首选项列表可以在这里看到,从第504行开始。默认的协议列表始于620行左右。虽然Jellybean 4.2+支持OpenSSL 1.0.1,特别是TLSv1.1和TLSv1.2,这些协议默认是不启用的。 如果你不做类似我所做的事情,那么尽pipe事实上TLSv1.2的支持是在最新版本的Android上公布的,但你不能利用TLSv1.2的支持。 当你回顾以前的Android版本时,细节差别很大。 至less,您可能希望仔细看看所有受支持版本的默认值,并查看您的客户端实际在做什么。 你可能会感到惊讶。 关于对各种协议和密码的支持还有很多。 问题是,有时可能需要在客户端更改这些设置。 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,因为它的构造函数是私有的。 这是不幸的,因为它提供了一些其他的好东西,比如确保你正确closures而不是泄露资源。 DefaultHttpClient工作得很好。 我从AndroidHttpClient(第105行)借用了newInstance方法。 […]

Android HttpsUrlConnection javax.net.ssl.SSLException当使用本地信任库时,由对等握手错误closures的连接

我在使用HttpsUrlConnection对象获取Android连接到一个简单的OpenSSL服务器时遇到了麻烦(我已经通过StackOverflow和一些在线教程进行了梳理,并且非常HttpsUrlConnection线路的示例,我仍然无法弄清楚为什么当我使用我的本地信任库时我的信息被破坏了)。 我目前有一个Android活动,尝试连接到一个简单的OpenSSL server (我可以使用OpenSSL客户端连接到我的服务器),一旦HttpsUrlConnection.connect()被调用,我收到一个“ javax.net.ssl.SSLException: Connection closed by peer" error during the SSL handshake. 也许我正在设置我的示例服务器不正确? 注意事项: 目前没有客户授权 加载默认信任存储时,能够连接到https://www.google.com 无法使用自签名证书连接到本地主机上的服务器 不想相信所有的证书 不想使用Apache HttpClient 只想使用本地信任库 与充气城堡创build当地的信任存储 我能够正确加载信任库 在代理防火墙后面,在我的android虚拟设备上设置代理 AVD设置为Android 4.1 API 16 。 我已经尝试过的事情: 连接到127.0.0.1 and 10.0.2.2 使用新的SecureRandom() with the SSLContext.init() 使用'URL u = new URL("https", "10.0.2.2", 443, "/");'创buildURL 'URL u = new URL("https", "10.0.2.2", 443, "/");' […]

在Android上通过jni传递byte 到C的问题

我在Java中有一个byte[] ,它的长度是256字节,我把它传递给C中的一个本地函数。 当我试图从这个数组中获取数据时,这是完全错误的,当我把它打印出来的时候,它与我在传递给C之前打印出来的数据不匹配。 我尝试了一些方法来访问数据,包括GetByteArrayRegion和GetByteArrayElements但似乎没有给我所期望的数据。 在我调查的时候,我试图看看JNI认为jbyteArray的长度是在GetArrayLength的长度 – 它报告的长度是1079142960,远远超过了我预期的256个字节。 每次函数被调用时,值也不同,例如GetArrayLength另一次返回1079145720。 这里是我用来访问数组的代码: JNIEXPORT jbyteArray function(JNIEnv* env, jbyteArray array) { int length = (*env)->GetArrayLength(env, array); jbyte data[256]; (*env)->GetByteArrayRegion(env, array, 0, 256, data); //also tried //jbyte *data = (jbyte*) (*env)->GetByteArrayElements(env, array, NULL); } 这看起来很简单,所以我不确定发生了什么事情。 这个数组在Java中看起来很好,但是它是在C中生成的,并且传回来了,所以我想在这里Java可以不关心,但是当它返回到C时会中断数组。 以下是我用来生成数组并将其传回给Java的代码: //there is some openSSL stuff here that sets up a pointer to an RSA […]

在Android NDK上构buildOpenSSL

我想在Android 2.1 / 2.2上使用JNI使用DTLS(在OpenSSL上)。 有人可以帮助我开始(教程,howto,指针等)与build设OpenSSL Android(2.1 / 2.2)使用Android NDK? 任何重要的事情,我应该在做之前知道。 谢谢。

CertificateException – OpenSSLX509CertificateFactory $ ParsingException

我有我的Android项目中的连接到安全服务器的以下代码。 我得到parsing错误。 [粘贴下面]。如果有人知道这个例外,请让我知道。 提前致谢。 代码片段 CertificateFactory cf = CertificateFactory.getInstance("X.509"); InputStream caInput = new BufferedInputStream(new FileInputStream("/storage/emulated/0/cert.p12")); Certificate ca; try { ca = cf.generateCertificate(caInput); // error at this line System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN()); } finally { caInput.close(); } 错误 01-15 17:01:00.107: W/System.err(14932): java.security.cert.CertificateException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 01-15 17:01:00.107: W/System.err(14932): at com.android.org.conscrypt.OpenSSLX509CertificateFactory.engineGenerateCertificate(OpenSSLX509CertificateFactory.java:272) 01-15 17:01:00.107:W […]

使用PHP openssl进行应用内购买签名validation

在试图遵循一些在应用程序内购买的安全指导: http : //developer.android.com/guide/market/billing/billing_best_practices.html我想在服务器上做签名validation,而不是在应用程序。 我最好喜欢使用PHP的openssl库,它看起来像下面的代码应该工作: $public_key_str = file_get_contents("./pubKey/out"); $public_key_str = trim($public_key_str); $key = openssl_get_publickey($public_key_str); if(!$key) { echo 'Can\'t get public key'; } $signature = base64_decode( $signature ); $ok = openssl_verify($data, $signature, $key); var_dump($ok); 我知道我的签名和公钥都是正确的,但$ ok是0! 我尝试使用的签名是应用程序购买包中的string。 猜猜我的钥匙是否正确,问题出在签名上。 当我尝试从base64解码它:openssl enc -base64 -d -in signature -A> signature.bin,我有与base64_decode()相同的string。 有任何想法吗 ? UPD:我也没有真正地理解我应该通过openssl_verify()作为$ data传递什么? 我的数据如下所示: $data = '{"nonce":5550262978898439313,"orders":[{"notificationId":"android.test.purchased","orderId":"transactionId.android.test.purchased","packageName":"com.ads.testbilling","productId":"android.test.purchased","purchaseTime":1308224646237,"purchaseState":0}]}';

Libcurl证书钉在iPhone上,但不是在Android上

这是我在Obj-C和JAVA项目中使用的C ++代码。 string readBuffer; string certificateBeingUsed; CURL *curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); curl_easy_setopt(curl, CURLOPT_URL, "https://apiServer"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 120); curl_easy_setopt(curl, CURLOPT_ENCODING, GZIP); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER , true); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST , 2); curl_easy_setopt(curl, CURLOPT_CAINFO,certificateBeingUsed); CURLcode res; res = curl_easy_perform(curl); ————————————————– —————— 在Xcode中,我有我的ceritificate“certificatePinning.der”存储在资源/证书文件夹。 要使用上面的代码,我将certificateBeingUsed设置为我的证书path: certificateBeingUsed = "/Users/graceo/Library/Developer/CoreSimulator/Devices/1BB154CB-276B-4DDC-86C8-4975213D7E3B/data/Containers/Bundle/Application/4819EC2A-CA18-46BF-815F-445B5E3E519F/TestStoryBoardWithLibraryAndSwift.app/certificatePinning.der" 并且res包含从服务器发送的响应的readBuffer返回成功。 ————————————————– —————— 在Android Studio中,我有我的ceritificate“certificatePinning.der”存储在assets文件夹中。 […]

Android上HTTPS连接的未知协议错误

我正在Android应用程序上使用HTTPS调用REST服务。 我已经有了这个工作代码,但现在我正在使用托pipeREST服务的新安装的服务器,我不能再build立连接。 这是一个例外: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x15b7768: Failure in SSL library, usually a protocol error error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x402e5cc3:0x00000000) 应用程序使用Apache类与REST服务进行交互。 即使使用接受任何种类的证书的虚拟TrustManager,我也会得到这个错误。 当从Android导航器调用REST服务时,连接成功build立并正常工作。 Android手机是从HTC运行最新的4.0.3 Android。 REST服务是Apache上的一个托pipe的mod_perl应用程序,configuration了SSL支持。 浏览https://github.com/android/platform_external_openssl/blob/ics-mr0/ssl/s23_clnt.c中的OpenSSL源代码,除了低级别的问题之外,没有提供任何提示。 任何build议如何进一步debugging?

使用php OpenSSL进行Android应用内购买服务器签名validation

在试图遵循一些在应用程序内购买的安全指南: http : //developer.android.com/guide/market/billing/billing_best_practices.html 我正在尝试在服务器上而不是在应用程序中进行签名validation。 我最好喜欢使用PHP的openssl库,它看起来像下面的代码应该工作: <?php // $data and $signature are assumed to contain the data and the signature // fetch public key from certificate and ready it $fp = fopen("/src/openssl-0.9.6/demos/sign/cert.pem", "r"); $cert = fread($fp, 8192); fclose($fp); $pubkeyid = openssl_get_publickey($cert); // state whether signature is okay or not $ok = openssl_verify($data, $signature, $pubkeyid); if […]