如何使用Android的自签名证书(How to use a self signed SSL cer

2019-07-29 16:16发布

这事已至此窃听我几天。 我读过许多关于这整个问题的其他问题,仍然没有能够继续进行。

我创建了一个简单的测试应用程序只是为了测试Android上的SSL。 该应用程序只有一个按钮,点击时应用程序试图在我的测试服务器,然后使用完全相同的词组响应SSL加密连接发送的“Hello World”。

首先,我创建了使用OpenSSL的我的服务器的测试重点和​​测试证书。 然后,我已经按照指示在显示疯狂Bob的博客 。 我从充气城堡的网站得到了充气城堡供应商直接建立信任的密钥存储在疯狂Bob的博客如图所示,右在这一点上,我相信得到的一切。

当我试图运行我的代码,我得到了异常“IOException异常:密钥存储的版本错误。” 然后我发现这个问题在计算器上。 目前有人建议我应该尝试使用旧的充气城堡供应商,而不是最新的bcprov-jdk15on-147.jar。 我又考虑到这一点,实际上结束了从jdk13-146想尽一切bcprovider到jdk16-146。 不过每次我得到了相同的“IOExcpetion:错版密钥存储的。” 例外。

然后我发现了另一个问题,关于在计算器上类似的问题。 目前有人用512位大小的关键,而不是1024大小的关键设法摆脱异常。 嗯,我给它一个尝试,一无所获,但相同的异常。

所以在这里我现在,不知道下一步该怎么做。 我几乎运行的想法和谷歌的搜索结果。

我的网页代码是1对疯狂的鲍勃的代码复印件1份,此外,该应用程序只能只处理该按钮的活动类。 我想实现这个API上的7级。

任何帮助将不胜感激。 谢谢。

Answer 1:

2种选择:

  1. 你可以做你做什么,并创建自己的密钥存储和我已经做了,这里是从我的代码指令,我存储(因为它是如此耗费时间得到它的工作):

    为了产生PKS:

    1. 在IIS7中创建的证书,然后导出为PFX。 按照第SelfSSL指令: http://www.robbagby.com/iis/self-signed-certificates-on-iis-7-the-easy-way-and-the-most-effective-way/ 1A。 下载工具: http://cid-3c8d41bb553e84f5.skydrive.live.com/browse.aspx/SelfSSL 1B。 运行:SelfSSL / N:CN = mydomainname / V:1000 / S:1 / P:8081我使用端口8181上我的服务器装置1c。 从IIS管理器导出到cert.pfx
    2. 在SSL运行命令行文件转换成X.509:OpenSSL的PKCS12 -in C:\ cert.pfx退房手续C:\ cert.cer -nodes
    3. 编辑文件,并删除所有除----- BEGIN .... END CERTIFICATE -----重要! 这是工作的时候我得到了正确的(5)短线量,并把标签和数据在不同的行
    4. 使用密钥工具。 C:\ Java的\ JDK \ bcprov.jar被单独下载C:\用户>的keytool -import -v -alias -trustcacerts -file key_alias C:\ cert.cer -keystore C:\ mystore.bks -storetype BKS -provider组织.bouncycastle.jce.provider.BouncyCastleProvider -providerpath C:\ Java的\ JDK \ bcprov.jar -storepass 123456
  2. 建立信任所有密钥库和忘掉这一切。 基本上,你可以使用任何SSL没有错误。 只需禁用它在生产中,如果你真的关心。 下面是代码,我用它来获取SSL客户端准备(假设你使用Apache HTTP客户端)

     private HttpClient getHttpClient() { HttpParams params = new BasicHttpParams(); //Set main protocol parameters HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET); HttpProtocolParams.setUseExpectContinue(params, true); // Turn off stale checking. Our connections break all the time anyway, and it's not worth it to pay the penalty of checking every time. HttpConnectionParams.setStaleCheckingEnabled(params, false); // FIX v2.2.1+ - Set timeout to 30 seconds, seems like 5 seconds was not enough for good communication HttpConnectionParams.setConnectionTimeout(params, 30 * 1000); HttpConnectionParams.setSoTimeout(params, 30 * 1000); HttpConnectionParams.setSocketBufferSize(params, 8192); // Don't handle redirects -- return them to the caller. Our code often wants to re-POST after a redirect, which we must do ourselves. HttpClientParams.setRedirecting(params, false); // Register our own "trust-all" SSL scheme SchemeRegistry schReg = new SchemeRegistry(); try { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(null, null); TrustAllSSLSocketFactory sslSocketFactory = new TrustAllSSLSocketFactory(trustStore); sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); Scheme sslTrustAllScheme = new Scheme("https", sslSocketFactory, 443); schReg.register(sslTrustAllScheme); } catch (Exception ex) { LogData.e(LOG_TAG, ex, LogData.Priority.None); } ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params,schReg); return new DefaultHttpClient(conMgr, params); } 


Answer 2:

这是类似我的问题 ,当我试图请求EWS。 您可以参考这个链接并下载示例源代码然后修改它像我的答案。 希望这可以帮助!

更新
下面的命令为我工作(我尝试了大约2个月前):

  C:\OpenSSL-Win32\bin>keytool -importcert -v -trustcacerts -file "d:/cer.cer" 
  -alias parkgroup_restful -keystore "D:/parkgroup-ws-client.bks" 
  -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath 
 "D:/bcprov-jdk16-145.jar" -storetype BKS -storepass 1234567

  .... /**It should show the result here**/

   Trust this certificate? [no]:  yes
   Certificate was added to keystore
   [Storing D:/parkgroup-ws-client.bks]

   C:\OpenSSL-Win32\bin>keytool -list -keystore "D:/parkgroup-ws-client.bks" -provi
   der org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "D:/bcprov-
   jdk16-145.jar" -storetype BKS -storepass 1234567

   Keystore type: BKS
   Keystore provider: BC

   Your keystore contains 1 entry

   parkgroup_restful, Apr 10, 2012, trustedCertEntry,
   Certificate fingerprint (MD5): 36:47:88:62:23:1C:F3:52:17:BE:7A:A9:94:56:19:18

你可以看到,我使用bcprov-jdk16-145.jar和OpenSSL库。 你可以尝试一下。
另一种工具来创建密钥库: http://portecle.sourceforge.net/



Answer 3:

嗯,我也面临这个同样的情况,并解决它,我把从同一个博客帖子求助( http://nelenkov.blogspot.in/2011/12/using-custom-certificate-trust-store-on.html )由R4J简称。 以下是涉及的步骤:

  1. 创建自定义trustore:我用Portecle创建密钥库和进口公钥证书从我的服务器到它。
  2. 密钥工具-genkeypair -alias采样-keyalg RSA -sigalg SHA1withRSA -dname “CN =戒灵,OU =攻击,O =索伦企业,L =魔多,ST =中间地球,C = ME” -keypass welcome123: 用密钥对创建定制密钥库 -validity 365 -storetype PKCS12 -keystore克:\ mordor_key_store.pfx -storepass welcome123 -keysize 2048
  3. 然后,把它们用作nelkov的博客中提到。 您可能还需要建立的情况下,自己的自定义AbstractVerifier你的土地到那里证书为abc.com颁发的形势和验证拒绝www.abc.com
  4. 最后,以创建安全了HTTPClient,你可以这样做:

      public static DefaultHttpClient getSecureHttpClient(){ SchemeRegistry schemeRegistry = new SchemeRegistry(); SSLContext sslContext = null; try { sslContext = createSslContext(true); } catch (GeneralSecurityException e) { e.printStackTrace(); } final X509HostnameVerifier delegate = new BrowserCompatHostnameVerifier(); MySSLSocketFactory socketFactory = new MySSLSocketFactory(sslContext, delegate); schemeRegistry.register(new Scheme("https", socketFactory, 443)); DefaultHttpClient client = new DefaultHttpClient(); HttpParams params = client.getParams(); client = new DefaultHttpClient(new ThreadSafeClientConnManager(params, schemeRegistry), params){ protected HttpParams determineParams(HttpRequest req) { HttpParams params = req.getParams(); // req is an HttpRequest object HttpConnectionParams.setSoTimeout(params, 60000); HttpConnectionParams.setConnectionTimeout(params, 60000); return params; } }; return client; } 

对于我的选择详细原因可以参考这篇文章http://fuking-android.quora.com/Implement-HTTPS-for-android-apps-a-novices-tale 。



文章来源: How to use a self signed SSL certificate in Android