2012-05-28 37 views
2

我試圖從Android 2.3.4使用內置瀏覽器訪問受SSL保護的我的Web應用程序。錯誤:在Android上未自行簽名的SSL證書的名稱不適用

服務器證書是我使用MAKECERT創建並安裝在服務器上的自簽名證書。 當我嘗試訪問該頁面時,收到來自瀏覽器的錯誤消息,說明The name of the site does not match name on the certificate

我已驗證,服務器地址正在加密我的證書的公用名稱(它實際上只是一個IP地址)。

當我嘗試在Android設備上訪問其他使用非自簽名證書保護的網站時,不會彈出消息。

如果我使用桌面上的IE或Chrome訪問同一頁面 - 除了簽名授權信息 - 我不會收到警告,一旦我在受信任的根CA中安裝了證書,證書就會順利地被瀏覽器。

我是否應該認爲該消息實際上是Android拒絕自簽名證書?

我對此有點困惑。

我試圖在證書存儲中安裝證書,但這並沒有改善這種情況。現在我不知道接下來可能會嘗試什麼。

問題是:我應該遵循什麼特別的事情來創建一個Android可以接受的自簽名證書?有沒有人設法得到Android接受的自簽名證書沒有這個警告?

我還能嘗試什麼?

-UPDATE- 布魯諾的回答把我領到了正確的方向,所以我能夠做到前進了一步:我重拍的證書添加SAN(不得不放棄MAKECERTOpenSSL,下面有instructions from Andy Arismendi)。

現在信息已經消失了,但是我在已經討論過in this SO post的'認證autority不可信'問題中被阻止,所以我仍在努力尋找我的問題的最終解決方案 - 沒有在Android瀏覽器上彈出任何警告。

回答

4

I have verified and the server address is exactly maching the Common Name of my certificate (it is actually just an IP address).

Android的主機名稱驗證程序比一些瀏覽器更嚴格地符合RFC 2818。根據規範,如果使用一個IP地址,它必須在IP地址類型的主題備用名稱項:未對DNS類型的SAN條目或在CN:

If a subjectAltName extension of type dNSName is present, that MUST be used as the identity. Otherwise, the (most specific) Common Name field in the Subject field of the certificate MUST be used. Although the use of the Common Name is existing practice, it is deprecated and Certification Authorities are encouraged to use the dNSName instead.

[...]

In some cases, the URI is specified as an IP address rather than a hostname. In this case, the iPAddress subjectAltName must be present in the certificate and must exactly match the IP in the URI.

最簡單的將使用主機名稱。 (在證書中使用IP地址從未真正實用。)或者,使用SAN IP地址條目生成證書。 (您可能感興趣的this。)

+0

你知道'com.android.browser'使用什麼嗎?是上面的RFC,還是CA /瀏覽器論壇文檔? ([公開信用證書籤發和管理基準要求](https://cabforum.org/wp-content/uploads/Baseline_Requirements_V1_1_6.pdf)和[EV SSL證書指南](https://cabforum.org/ wp-content/uploads/EV-SSL-Certificate-Guidelines-Version-1.4.5.pdf)) – jww

+0

@noloader,CA/Browser文檔和RFC 2818/6125不是互斥的。 (CA/Browser文檔更多地是關於頒發和驗證證書的程序,而從技術角度來看,RFC 2818的這部分更多地侷限於名稱匹配)。 AFAIK,對於EV證書,CA /瀏覽器基線要求只是使SAN更加嚴格要求。不確定關於'com.android.browser',但它也可能接受非EV證書(在這種情況下,他們不需要符合CA /瀏覽器規範),但它驗證的EV證書肯定必須符合並因此確實有一個SAN)。 – Bruno

1

首先,Android 2.x上的憑證存儲只適用於VPN和WiFi應用程序,瀏覽器不會看到它。您不能在受信任的證書存儲區中安裝自己的證書(除非擁有根設備)。

你是我們在一個公共IP地址上的web應用程序,或者你正在通過WiFi訪問的本地應用程序?你可能想看看logcat輸出,可能會有一些警告,會給你一個提示。也可以嘗試從其他設備和/或模擬器(如果可能的話,使用不同的Android版本)並比較消息/行爲。

0

so I am still working to find a final solution to my issue - not having any warning popping up on the Android browse

尼古拉Elenkov告訴你爲什麼你不能將證書保存到Android上的信任存儲。最近發生了變化,但對較老的Android客戶端沒有幫助。有關Android的Keychain和Keystore的簡要歷史記錄,請參閱Are there any system certificates storages on Android?(它指的是Nikolay的兩篇文章)。

因爲您正在Android瀏覽器中工作,所以您需要使用已經存在於Android商店中的CA.要從CA已經信任的CA獲得服務器證書,請嘗試StartCom。 StartCom提供免費的Class 1證書,其大多數移動和桌面瀏覽器都信任其根。 (請記住,如果需要,他們會收取撤銷費用)。

爲了完整起見,如果您自己編寫客戶端,那麼您將提供自定義X509TrustManager並覆蓋checkServerTrusted以接受您的證書。它不需要與密鑰庫,鑰匙串或外部CA進行任何交互。但是你沒有這個選項,因爲你沒有編寫瀏覽器。