2014-07-08 22 views
2

在我的工作中,我們運行帶有內部CA的私人PKI來簽署我​​們的服務器證書。在開發一個通過https與REST API進行通信的Android應用程序時,我使用192.168.x.x IP設置了開發服務器併爲其頒發了證書。所以我必須:使用IP的有效android證書

  • 用的CN CA證書「自定義CA」
  • 服務器證書與CN 192.168.0.3

然後我跟着Android docs on setting up a TrustStore,並得到了應用溝通通過https在Android 4.0.4設備中。 當我在運行Android 4.4(KitKat)的設備上測試應用程序時,服務器無法驗證。

任何想法爲什麼?

+0

另一種處理方法是即使在開發環境中也要設置主機名。 (甚至全球可見的DNS服務器都可以返回私有IP地址,因此您可以將「test1.mycompany.com」設置爲192.168.0.3。) – Bruno

+0

您應該*不*將主機名放置在「通用名稱(CN)」中, '。這已被IETF和CA /瀏覽器論壇棄用。相反,將DNS名稱放在'主題備用名稱(SAN)'中。使用'CN'作爲友好名稱,例如'Example Widgets'(我個人不會使用像'Example Widgets,LLC'這樣的合法名稱,因爲它經常向用戶顯示友好名稱)。 – jww

回答

2

於是就RFC2818RFC6125挖了一下後,我發現,在APIv14 (4.0.4)檢查對CN部分主機DefaultHostnameVerifier實現,並且如果它不匹配它會尋找DNS類型的SAN項,但沒有IP類型。 APIv19 (4.4.4)將根據SAN IP條目檢查IP主機。

因此,我向服務器證書添加了一個IP SAN條目192.168.0.3,並對CA簽名,並讓4.4設備通過HTTPS進行通信。

+0

啊,我看你明白了......順便說一下,我們最常遇到的公共CA通常在網站和相關服務中遇到,而不是像5280和6125那樣遵循RFC。他們遵循自己的標準開發在CA /瀏覽器論壇。查看CA/B的[基準需求文檔](https://cabforum.org/baseline-requirements-documents/)和[EV指南](https://cabforum.org/extended-validation-2/) 。如果你在網上工作,那麼你應該遵循的標準(而不是包含所有過去和未來最差做法的全面RFC)。 – jww

+0

「因此,我向服務器證書添加了一個IP SAN條目192.168.0.3,並對CA簽名並讓4.4設備通過HTTPS進行通信」 - 這是一個不同的問題。根據CA/B的基準要求文件,在使用IP時(與FQDN相對)有一些特殊處理。我認爲IP需要在CA和SAN兩方面。但使用RFC 1918私人地址違反了最佳做法。私人地址不應該被使用。 – jww

+0

@jww感謝CA /瀏覽器論壇上的指針。關於IP情況,RFC指出它必須在SAN中才有效。我不知道CA/B對此有何評論。 – Grasshopper