gpt4 book ai didi

android - 如何绕过 ssl 错误 找不到证书路径的信任 anchor

转载 作者:太空宇宙 更新时间:2023-11-03 14:29:17 24 4
gpt4 key购买 nike

我正在尝试使用政府 DoD 网站 api.usno.navy.mil为我正在使用 Android Studio 创建的天气应用程序检索一些太阳和月亮数据。似乎无论我做什么,我都会得到 javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
我已经尝试将 DoD 证书添加到 Android Studio(尽管我没有这个确切的证书)。我已经检查了“自动接受不受信任的证书”。我尝试添加自己的 HostNameVerifier .我一直在为海军天文台@navy.mil 的服务台工作。

似乎没有任何效果。但是,它确实可以在我的 Chrome 浏览器中使用。

服务台表示,他们将继续申请商业认可的证书。

当我使用 https://www.digicert.com/help/ 检查网站时,它表示证书不受信任,因为该证书未由受信任的机构签名(检查 Mozilla 的根存储)。

有什么办法可以强制 Android Studio 接受这个 ssl 连接,以便我可以继续开发?

使用解决方案编辑

我使用 getSSLSocketFactory() 解决了这个问题来自下面 Dhanshri 的建议和我自己的 HostnameVerifier .注意:我只将它用于上面提到的问题 url。这是我获得有效连接的工作代码:

   public HttpsURLConnection getUSNOHttpConnection(URL url) {
Log.d(TAG, "getUSNOHttpConnection()");

HttpsURLConnection connection = null;

try {
// override for api.usno.navy.mil connections to prevent
// java.security.cert.CertPathValidatorException: Trust anchor for certification
// path not found. errors
HostnameVerifier usnoHostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
};

SSLSocketFactory sslSocketFactory = getSSLSocketFactory();

connection = (HttpsURLConnection) url.openConnection();
connection.setHostnameVerifier(usnoHostnameVerifier);
connection.setSSLSocketFactory(sslSocketFactory);
} catch (IOException e) {
e.printStackTrace();
}
return connection;
}

感谢所有审查此问题的人。

**编辑更新**

2019 年 1 月 31 日,我收到了 api.usno.navy.mil 的通知。网站帮助台,他们现在已经安装了商业认可的证书。我删除了绕过解决方案,一切都按预期工作,没有 SSL 错误。

最佳答案

当我收到这个错误时,我通过使用改造库来实现所有服务。试试这个,可能对你有帮助。@mtdavem

public class ServiceGenerator {

public static String PREF_COOKIES = "pref_cookies";
private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
private static Retrofit.Builder builder;

public static <S> S createService(Class<S> serviceClass) {
return createService(serviceClass, null);
}

public static <S> S createService(Class<S> serviceClass, final HashMap<String, String> headers) {

builder = new Retrofit.Builder()
.baseUrl("your service address")
.addConverterFactory(GsonConverterFactory.create());

httpClient.sslSocketFactory(getSSLSocketFactory());
httpClient.hostnameVerifier(new HostnameVerifier() {

@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});

OkHttpClient client = httpClient.build();
Retrofit retrofit = builder.client(client).build();
return retrofit.create(serviceClass);
}

private static SSLSocketFactory getSSLSocketFactory() {

try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}

@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}

@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};

// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

return sslSocketFactory;
} catch (KeyManagementException | NoSuchAlgorithmException e) {
return null;
}

}
}

关于android - 如何绕过 ssl 错误 找不到证书路径的信任 anchor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54208174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com