SSL証明書と中間CA証明書、そしてブラウザ（PC、スマホ）の挙動

#はじめに
SAKURAのVPSでRapid-SSLの証明書を使ってSSL化するにあたって
一年間無料キャンペーンがちょうどあったので今回は一年間（要は0円）で設定。
サーバの設定は頻繁にしないこともあって、はまりはまり進み

- 中間CA証明書を設定しなくて使えてる？
- SHA-1とSHA-2の証明書は何が違うんだっけ？

##さらにわからないことが出てくる
なんどか設定（中間CA証明書をいれたりはずしたり）を試しているうちに

>PCもAndroid端末もアラートを出さなくなる

事態に。
キャッシュ？

#中間CA証明書なしで疎通直後
## Mac OSX：SafariとChrome
こちらは中間CA証明書を含めなくても表示できました。
OSかブラウザ側で中間CA証明書を持ってる？

## Windows7

### アラートなし

- Safari
- Chrome

### アラートあり

- Firefox

##Android
手持ちのXPERIAでみたところだと
中間CA証明書を含めない場合の表示は次のとおり

![device-2015-10-04-180543.png](https://qiita-image-store.s3.amazonaws.com/0/12362/51488ec5-b887-6df4-271e-566e6ff520fe.png)

##iOS8(iPod touch)
![Screen Shot 2015-10-04 at 20.11.26.png](https://qiita-image-store.s3.amazonaws.com/0/12362/6e731c60-72cc-3773-b503-ba8ae6427f4a.png)

# SAKURA経由でRapid-SSLで購入ところから

発行されたSSLの証明書の署名アルゴリズムは`SHA-2`です。

## 発行された証明書は中間CA証明書`SHA-1`対応版？

![スクリーンショット 2015-10-04 17.34.17.png](https://qiita-image-store.s3.amazonaws.com/0/12362/ff69d85e-94e1-29cb-4917-cb7ef9989b2e.png)


中間CA証明書は`SHA-2`を設定していましたが

```shell-session

$ sudo nginx -t
nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/nginx/ssl/server1/cert.key") failed (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)

```

>/etc/nginx/ssl/server1/cert.keyはそれぞれの設定に差し替えて下さい

もしかして、と思って`SHA-1`の中間CA証明書にさしかえたらnginxの起動テストは通り、Macのブラウザ上でみてもアラートなく表示できている。
でも？
と中間CA証明書を外してみたら、何事もなく通信できてる:frowning: 

後からよく考えるとiptableの443ポートを閉じていたことが
nginxの起動テストでうまくいかなかった理由みたいです。

##中間CA証明書

GEOTRUSTのサイト上のリンクからは辿れなかった
中間CA証明書(SHA-1、SHA-2)の置き場所は下記の通り
https://www.geotrust.co.jp/resources/rapidssl/repository/intermediate.html

![スクリーンショット 2015-10-04 10.36.09.png](https://qiita-image-store.s3.amazonaws.com/0/12362/862889b2-a106-161b-e939-e83d56f98f25.png)

#SHA-1とSHA-2の証明書について

![スクリーンショット 2015-10-04 10.54.13.png](https://qiita-image-store.s3.amazonaws.com/0/12362/6da7be88-b411-3e35-6e90-13ce6ed42a3b.png)

有効期限満了日が`2016年12月31日`以降は`SHA-2`でとなっています。
そう、証明書は`SHA-2`でした。
だったら使う中間CA証明書も当然SHA-2であるべきで、といえる根拠が私には足りない。

##業界的には

>SHA-1 証明書に関する指針は中間 CA 証明書も対象となるため、サーバー証明書と一緒に SHA-2 用の中間 CA 証明書の設定も必要です。
https://www.cybertrust.ne.jp/sureserver/productinfo/sha1ms.html

とあるので、新規で設定するにあたって中間CA証明書であってもSHA-1を使うことは、レガシーなブラウザなどに対応することを考慮する必要がなければ避けるべき、となります。

# サーバの中間CA証明書の状況を変えても疎通が出来ている・・・
>サーバのiptableのportを開けていなかったから

と納得した次に問題が。

SSLの疎通に中間CA証明書が必要な対象(Android端末、Firefox)と
あってもなくても問題なかったブラウザ（Safari、Chrome）
ともにサーバ上の中間CA証明書がなくてもSSL通信出来ている状態に。

#証明書のチェックサイトを使う
後述する理由で自分環境のブラウザなどでの検証も難しい。
自分に判断できる知見はない、と理解しました。

WebサーバーにSSLの証明書が正しくインストールされているか確認する
http://www.atmarkit.co.jp/ait/articles/1202/10/news123.html
より

https://cryptoreport.geotrust.com/checker/views/certCheck.jsp

![スクリーンショット 2015-10-04 22.29.46.png](https://qiita-image-store.s3.amazonaws.com/0/12362/2aa2636e-9fe8-562b-834f-f1ad9943bc40.png)

中間CA証明書はやっぱり設定しなきゃダメ！
それ以外の脆弱性もいろいろ！

:fearful: :fearful: :fearful: :fearful: 

##PoodleとBEAST
nginxのデフォルトの設定のまま（`ssl_protocols`の記載なし）で
指摘されたのはPoodle(SSLv3)とBEASTでした

![スクリーンショット 2015-10-05 23.18.20.png](https://qiita-image-store.s3.amazonaws.com/0/12362/35ffd9dc-7dbb-c2d1-748b-95b777a17f9a.png)

Poodleは

そのため

```:ssl.conf
ssl_protocols       TLSv1.1 TLSv1.2;
```
を設定。

ちょっと前だとTLS v1.0は抑えとかないと対応できないブラウザがあるという話でした。

- XPERIA（AndroidOS4.4.4）
- iPod touch（iOS8）
- Windows7/Mac Yosemite のSafari、Firefox、Chrome

問題なく表示。
もしかしたら、後日対処が必要かもですが、一通り完了!

#Authority Information Access の影響

中間CA証明書の設定が不十分でもなんとかなってしまった理由は
ヒロミツ先生がだいぶ前に書いていらっしゃいました。

http://takagi-hiromitsu.jp/diary/20071212.html
>IEで警告が出ないのは、IEには独自の機能が搭載されているからで、サーバ証明書に記載の「Authority Information Access」拡張フィールドにあるURLから、検証に必要な中間認証局の証明書を、別途自動でダウンロードして取得する機能があるためだ。

この記事が書かれてから８年ほどの月日は経過しているし、状況的には他のブラウザについても同様の機能をサポートしていると考えると概ね納得はいきます。

 - 中間CA証明書はキャッシュされている
 - ブラウザで上手いことやってくれてる

検証内容は下記の内容をそのまま
https://www.digicert.com/code-signing/mac-verifying-code-signing-certificate.htm

##検証

（１）キーチェーンアクセスにインポートしたSSL証明書の状態：中間CA証明書なし
![スクリーンショット 2015-10-04 23.20.01.png](https://qiita-image-store.s3.amazonaws.com/0/12362/d8a0fd4c-4127-2709-f58e-da9af39ddf10.png)

（２）中間証明書を手動でダウンロードし、キーチェーンアクセスにインポート
![スクリーンショット 2015-10-04 23.20.23.png](https://qiita-image-store.s3.amazonaws.com/0/12362/b66834f7-c496-8dc4-1c3f-22a84e619857.png)

（３）キーチェーンアクセスにインポートしたSSL証明書の状態：中間CA証明書あり
![スクリーンショット 2015-10-04 23.20.30.png](https://qiita-image-store.s3.amazonaws.com/0/12362/5e3626e8-3956-d482-9e96-a04c9b56fd7e.png)

##結果
中間CA証明書がなくても`Authority Information Access`から取得し、Validateは可能

#理解したこと
（０）サーバのiptableは確認する
（１）証明書の設定は中間CA証明書(SHA-2)を含めて設定する
（２）ブラウザ（PC/MAC/スマホ）はAuthority Information Accessから中間CA証明書を取得して表示できる。
（３）SSL設定後はチェックサイトで診断をかける

#参考
SHA1証明書発行制限について
http://www.rapid-ssl.jp/rapidssl-news/archives/57

https://www.rapid-ssl.jp/rapidssl-support/ssl-support.htm

#さいごに

今回はVPSを使っていたため、自分で証明書を買い、自分で設定することがあり疑問をもつに至りました。
おなじSAKURAのレンタルサーバであれば、共有SSLを使用し、疑問は持たなかったでしょう。
独自ドメインを設定している場合でも
もっと作業は簡単になる一方で、中間CA証明書がSHA-1であっても気にしなかったかもしれません。