tag:crieit.net,2005:https://crieit.net/tags/Retrofit2/feed 「Retrofit2」の記事 - Crieit Crieitでタグ「Retrofit2」に投稿された最近の記事 2020-02-19T19:55:15+09:00 https://crieit.net/tags/Retrofit2/feed tag:crieit.net,2005:PublicArticle/15724 2020-02-19T19:55:15+09:00 2020-02-19T19:55:15+09:00 https://crieit.net/posts/Retrofit2 Retrofit2で自己証明書のサーバへのアクセスできるようにする <p><a target="_blank" rel="nofollow noopener" href="https://square.github.io/retrofit/">Retrofit2</a>でオレオレ証明書なサーバにアクセスすると、<br /> こんなエラーが出る。その時の対処方法の備忘録。</p> <pre><code>java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:361) </code></pre> <h3 id="ソース"><a href="#%E3%82%BD%E3%83%BC%E3%82%B9">ソース</a></h3> <p>こんな感じ。Retrofit2の内部で利用しているOkHttpClientのカスタマイズし、<br /> 安全でない証明書でも許可するように変更する。</p> <p>開発中など一時的な感じで使う。</p> <pre><code class="java">import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.security.cert.CertificateException; import java.util.concurrent.TimeUnit; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; public class ApiClientFactory { // ApiClientを生成する処理 public ApiClient getApiClient(String baseUrl) { return new Retrofit.Builder() .baseUrl(baseUrl) .client(getHttpClient()) .build() .create(ApiClient.class); } private OkHttpClient getHttpClient() { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); // return new OkHttpClient.Builder() // 通常のBuilderの代わりに、カスタマイズしたBuilderを使う return getUnsafeOkHttpClient() .readTimeout((15 * 1000), TimeUnit.MILLISECONDS) .writeTimeout((20 * 1000), TimeUnit.MILLISECONDS) .connectTimeout((20 * 1000), TimeUnit.MILLISECONDS) .addInterceptor(interceptor) .build(); } private static OkHttpClient.Builder getUnsafeOkHttpClient() { 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(); OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]); builder.hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); return builder; } catch (Exception e) { throw new RuntimeException(e); } } } </code></pre> <h2 id="こんなのつくってます!!"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E3%81%AE%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BE%E3%81%99%21%21">こんなのつくってます!!</a></h2> <p>積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました!<br /> <a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>は、Nuxt.js+Firebaseで開発してます!</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/></p> <p>もしよかったら、遊んでみてくださいヽ(=´▽`=)ノ</p> <p>要望・感想・アドバイスなどあれば、<br /> 公式アカウント(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/MemoryLoverz">@MemoryLoverz</a>)や開発者(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/kira_puka">@kira_puka</a>)まで♪</p> <h1 id="参考にしたサイト様"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88%E6%A7%98">参考にしたサイト様</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://mobikul.com/android-retrofit-handling-sslhandshakeexception/">Retrofit handle the SSLHandshakeException - Mobikul</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://square.github.io/okhttp/https/#customizing-trusted-certificates">HTTPS - OkHttp</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/square/okhttp/issues/5700">SSLHandshakeException on Android 5 (API 21) · Issue #5700 · square/okhttp</a></li> </ul> きらぷか@積読ハウマッチ/SSSAPIなど