tag:crieit.net,2005:https://crieit.net/tags/SSL/feed
「SSL」の記事 - Crieit
Crieitでタグ「SSL」に投稿された最近の記事
2022-02-25T22:51:29+09:00
https://crieit.net/tags/SSL/feed
tag:crieit.net,2005:PublicArticle/18126
2022-02-25T22:51:29+09:00
2022-02-25T22:51:29+09:00
https://crieit.net/posts/judge-category-of-ssl-certificate-on-browser-note-20220225
ブラウザで任意のSSL証明書がドメイン認証かどうか判別する (DV証明書, OV証明書, EV証明書)
<p>ブラウザで任意のSSL証明書がドメイン認証かどうか判別する方法についてメモ。</p>
<h2 id="確認方法"><a href="#%E7%A2%BA%E8%AA%8D%E6%96%B9%E6%B3%95">確認方法</a></h2>
<p>今回は Google Chrome (98.0.4758.102) で確認。手順としては次の通り。</p>
<ol>
<li>朝日カーメンテナンス様HPを開く</li>
<li>URLバー横の南京錠🔓のアイコンをクリック</li>
<li>「この接続は保護されています >」をクリック</li>
<li>「証明書は有効です ↗」をクリック</li>
<li>証明書ダイアログの「詳細」タブをクリック</li>
<li>「サブジェクト」をクリック</li>
</ol>
<p>ここで「サブジェクト」の内容が <code>CN = www.example.jp</code> のように CN しか存在しなければドメイン認証(DV証明書)。</p>
<p>逆にドメイン認証ではないパターンとして、例えば IPA(<code>https://www.ipa.go.jp</code>) は</p>
<pre><code>CN = www.ipa.go.jp
# 略
O = Information-technology Promotion Agency, Japan
L = Bunkyo
S = Tokyo
C = JP
</code></pre>
<p>と CN 以外のプロパティも表示されます。</p>
<p>DV証明書はドメイン(コモンネーム=CN)しか確認しないことに対して、 IPA は組織の実在確認を行うEV証明書のため。</p>
<p>そのため、 Organization(組織)は <code>Information-technology Promotion Agency, Japan</code> 、Location は <code>Bunkyo</code> といったプロパティが付随しています。</p>
<p>この差により「DV証明書かそうでないか」という判別は付く、という寸法です。</p>
<h2 id="備考"><a href="#%E5%82%99%E8%80%83">備考</a></h2>
<p>ただしこの方法は「DV証明書」と「それ以外(OV証明書、EV証明書)」を見分けることはできますが、「OV証明書」と「EV証明書」を見分けることはできない模様。</p>
<p>一部のブラウザではEV証明書ならばURLの横に組織名が表示されるのでそこで「OV証明書」と「EV証明書」を見分けることができそうですが、 Chrome では既に組織名を表示しなくなって久しいため、 Chrome で判別することは難しいと思われます。</p>
<p>また、ここまで書いておいて何ですが、手っ取り早く判別するならばWeb上のチェッカーを使用した方が早い気がします。</p>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://ssltools.digicert.com/checker/views/checkInstallation.jsp">Check Website Security | DigiCert SSLTools</a></li>
</ul>
<h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://ssltools.digicert.com/checker/views/checkInstallation.jsp">Check Website Security | DigiCert SSLTools</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/testnin2/items/51697ad87f896f154a80">DV証明書\/OV証明書\/EV証明書の確認方法 - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://www.antiphishing.jp/news/info/_ssl_20191021.html">フィッシング対策協議会 Council of Anti-Phishing Japan | ニュース | 協議会からのお知らせ | [更新] 各ブラウザによる SSL \/ TLS サーバ証明書の表示の違い (2019\/10\/21)</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://www.idcf.jp/rentalserver/option/ssl/appearance.html">SSLサーバー証明書 各証明書の見え方|Zenlogic - 株式会社IDCフロンティアのレンタルサーバー</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://rainbow-engine.com/sslcert-ev-ov-dv-diff/">SSL証明書のEV・OV・DVの違いとブラウザでの見え方について – Rainbow Engine</a></li>
</ul>
arm-band
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など