2012-11-04 27 views
1

我正在使用自簽名證書進行開發和測試。我調查了各種方法讓android模擬器接受自簽名證書。到目前爲止,我已經發現以下方法的變體:努力讓SSLCertificateSocketFactory在android模擬器上執行「socket.relaxsslcheck yes」

  1. 提供您自己的安全類,它將接受任何證書。
  2. 爲您的應用程序創建一個包含自簽名公鑰的密鑰庫。
  3. 將屬性socket.relaxsslcheck設置爲yes。

前兩個選項非常複雜,並將代碼引入到您的環境中,例如,開發,測試或產品。

選項3我喜歡因爲環境配置驅動行爲,與將容器中運行的應用程序提供配置的數據源的Web容器不同。開發環境將指向開發數據源等。不幸的是,我正在努力實現它的工作。我曾嘗試以下:

  • 利用亞行設置屬性

    adb shell setprop socket.relaxsslcheck yes

  • 使用System.setProperty

    System.setProperty("socket.relaxsslcheck","yes")

  • 試圖做出改變/系統/ build.prop和default.prop

第一個選項被忽略。從我看過的內容看來,設置屬性將在重新啓動後生效。但該屬性似乎是不穩定的,它不能在仿真器重新啓動時存活。

System.setProperty(...)方法似乎已經太遲了,因爲工廠已經創建。由於上述問題(代碼中的開發環境特定代碼),我不想走這條路線,除非沒有其他選擇。

最後一個選項應該可以在模擬器重新啓動後生存,但即使在運行adb root後,我仍然無法寫入這些文件。

我是Android開發新手,希望瞭解一些最佳方法以及如何使其運行的一些指導。

+0

我成功地在模擬器啓動時使用「./emulator -avd -prop socket.relaxsslcheck = true」來設置屬性,但仍然被SSLSocketCertificateFactory忽略 – fransvn

回答

1

那麼,你必須精確地指定「是」與選項,即:

-prop socket.relaxsslcheck=yes 

源代碼只是屬性值對「是」進行比較(和不打擾也測試對等價值像「真」或「1」 ...)

使用ADT捆綁我設置通過

Run -> Debug Configurations... -> Android Application -> ProjectName -> Target 
    -> Additional Emulator Command Line Options 

該選項SSLSocketCertificateFactory在廣告作品的仿真器重新啓動後ised,即它接受所有證書。一個可以驗證通過查看日誌:

12-08 18:10:52.382: W/SSLCertificateSocketFactory(763): 
    *** BYPASSING SSL SECURITY CHECKS (socket.relaxsslcheck=yes) *** 

我有一個自創建的證書測試它 - 沒有這種屬性集連接失敗,證書驗證錯誤時,與該屬性集(或使用SSLCertificateSocketFactory.getInsecure())的TLS套接字連接就好。

順便說一下,SSLSocketCertificateFactory似乎有時使用比較棘手 - 例如I am struggling to get an actual instance from that very Factory - 發佈工作區的人基本上說:忽略該工廠。谷歌搜索甚至推薦使用該工廠的against - 但沒有給出太多理由。