[英]HTTPS GET (SSL) with Android and self-signed server certificate
我查看了有關如何通過 Android 上的HTTPS
從使用自簽名證書的服務器檢索某些內容的各種帖子。 但是,它們似乎都不起作用 - 它們都無法刪除
javax.net.ssl.SSLException:不受信任的服務器證書消息。
修改服務器以獲得可信證書不是一個選項,也不是使服務器證書與服務器的 IP 地址匹配的選項。
請注意,服務器將沒有 DNS 名稱,它只有一個 IP 地址。 GET 請求如下所示:
https://username:password@anyIPAddress/blabla/index.php?param=1¶m2=3
我完全意識到這個解決方案容易受到中間人攻擊等。
因此,解決方案必須忽略對證書缺乏信任,並忽略主機名不匹配。
有沒有人知道使用 Java for Android 執行此操作的代碼?
在stackoverflow.com上有很多嘗試來解釋這個問題,還有很多代碼片段,但它們似乎不起作用,據我所知,沒有人提供解決這個問題的代碼塊。 知道是否有人真的解決了這個問題,或者 Android 是否只是阻止了不受信任的證書,這將會很有趣。
正如您正確指出的那樣,有兩個問題:a) 證書不受信任,b) 證書上的名稱與主機名不匹配。
警告:對於得到此答案的任何其他人,這是一個骯臟、可怕的黑客行為,您不得將其用於任何重要的事情。 沒有身份驗證的 SSL/TLS 比根本沒有加密更糟糕 - 讀取和修改您的“加密”數據對於攻擊者來說是微不足道的,您甚至不會知道它正在發生。
還和我在一起嗎? 我好怕...
a) 通過創建一個自定義的 SSLContext 來解決,它的 TrustManager 接受任何東西:
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, new TrustManager[] {
new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; }
}
}, null);
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());
和 b) 通過創建一個 HostnameVerifier 允許連接繼續,即使證書與主機名不匹配:
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
兩者都必須發生在代碼的開頭,然后才開始處理 HttpsURLConnections 等等。 這適用於 Android 和常規 JRE。 享受。
如果您使用的是 HttpsURLConnection,則嘗試在connect()
之前對其調用setHostnameVerifier
,並將其傳遞給HostnameVerifier
,無論其真實性如何,它都會接受。
如果您問我,請以安全的方式進行。
找到了一個很好的教程http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/並且它真的不難實現。
Maciek 推薦的教程也很好。
我測試了它,它在我的應用程序中運行沒有問題。
我在 4 個月前制作了一個使用自簽名證書的應用程序,這里是我希望它有幫助的代碼: https : //bitbucket.org/momo0002/tlsdemo.git
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.