アンドロイドアプリが認証と承認を行うホストは3つあります。最終ホストはREST APIです。 Oauth認証と承認プロセスを初めて使用する場合、問題なく動作します。Android java.security.cert.CertPathValidatorException:認証パスの信頼アンカーが見つかりません
ログインしてREST APIで提供されているサービスにアクセスしてアプリを再度開いた後に、ユーザーがアプリを終了した場合、この問題が発生します。 この段階では、認証および承認プロセスは行われていませんが、REST APIのみが使用されます。これはjava.security.cert.CertPathValidatorException
になりましたが、最初の使用中にログインしてからアプリを使用していました。
誰かがこの例外の背後にあるシナリオについて説明し、アプリに間違いがありますか?これは、認証例外がthis SO answerに従って以下のように無視された場合に機能します。
SSLSocketFactory sslSocketFactory = null;
try {
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
// Initialise the TMF as you normally would, for example:
try {
tmf.init((KeyStore)null);
} catch(KeyStoreException e) {
e.printStackTrace();
}
TrustManager[] trustManagers = tmf.getTrustManagers();
final X509TrustManager origTrustmanager = (X509TrustManager)trustManagers[0];
// Create a trust manager that does not validate certificate chains
TrustManager[] wrappedTrustManagers = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return origTrustmanager.getAcceptedIssuers();
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
try {
origTrustmanager.checkClientTrusted(certs, authType);
} catch(CertificateException e) {
e.printStackTrace();
}
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
try {
origTrustmanager.checkServerTrusted(certs, authType);
} catch(CertificateException e) {
e.printStackTrace();
}
}
}
};
//TrustManager[] trustAllCerts = TrustManagerFactory.getInstance("SSL").getTrustManagers();
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, wrappedTrustManagers, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
sslSocketFactory = sslContext.getSocketFactory();
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
}
return sslSocketFactory;
私はHTTPリクエストにOkhttp 3を使用しています。どんな提案も問題の解決に役立ちます。上記のコードスニペットを使用する場合は、セキュリティ違反ですか?それはアプリのセキュリティに影響を与えますか?
注: 'checkServerTrusted'実装は、CertificateExceptionを捕まえて無視するので無用です。したがって、すべてのサーバ証明書(信頼できるものと信頼できないもの)が受け入れられます! – Robert
@Robertは明確化のために感謝します。はい**これはセキュリティ上の観点からは安全で無用です**、私は私の答えに記述されている正しい解決策を見つけました。 –