GoogleAppsEngineのカスタムURLでSSLを登録する方法

# はじめに
GoogleCloudPlatform(以下GCP）でGoogleAppsEngine（以下GAE）にて
カスタムURL（＝独自ドメイン）を設定しているとどうしてもぶち当たってくるのがSSL。

もちろん、Google様が実装してくれている[Let's Encrypt]を利用してもいいのだが
これでは「このドメインはうちの会社の所有物じゃ！」とは証明してくれないので
どうしても信頼するメディアになれない。

中間証明書を入れる場所がないので、入れてないとOGPが出てこなかったり、サーチコンソールで引っかかったり、クローラーが動かなかったりと、セキュリティに厳しい昨今では、何かとトラブルが多いのです。

ということで、今回SSLの入れ方をGUI中心に書いていきます。（できるだけ初心者レベルでわかりやすく。。。）

## 環境について
macOS Catalina10.15.7
openssl (Libressl) 2.8.3
GoogleCloudPlatform（web版）->カスタムドメインはすでに登録されているものとします。

注意）SSL自体はGlobalSign社を今回例に出しますが、kingsslでも同じです。

## 証明書について
証明書はエンコードはpemとderがありますが、
今回はpem(-----CERTFI・・・で始まるやつ)で統一してます。

- 秘密鍵は.key
- 署名付き証明書リクエスト（以下自己証明書）は.csr (Certificate Signing Request)
- 公開鍵　.crt (Certificate)
- 中間証明書　.cer(Certificate)

にしてます。
よく聞かれるのですが、ここに規則あるの？と言われますが、重要なのはエンコード(PEM/DER)の方のため、
公開鍵と中間証明書とかは、よもや .pem/.der でもいいでしょうし、
自分がCentOSでサーバ立てる時は、中間証明書は .chainとか勝手にしてます。（だってわかりやすいから）

まさにオレオレルールですが、証明書会社ですら、バラバラなのでよもや意味はないでしょう。。。
※IIS(Microsoft)は.cerを証明書としてます。どっちかというとサーバによりけりかと。。



# 手順
主に次の手順を踏みます
1. private keyとcsrの発行
2. private keyのパス抜き版を作る 
3. サーバ会社で発行
4. メールで届いた公開キーを確認する
5. GAEに登録する
６. SSL確認サイトで確認

## 1. private key + 自己証明書(csr) の発行
　Private key　という、証明書発行に必要な鍵と、それを元に生成するcertification(証明書）を発行します。
　Private keyは鍵なので、「安全なところに保管する」ことが鉄則です。
　パスワードを入力した上で、パスワードとkeyファイルは別々に保管しましょう。
　GAEの場合、パスフレーズ付き秘密鍵は提出すらしないので、失くさないように保管しましょう。（証明書再発行のときに必要）
　Googleの場合は下記のAでもBでも大丈夫です。心象的にはAのがいいと思ってます。

用語説明：
　Common Name: 要はドメイン名。 例：```hogehoge.co.jp``` 
　ただし証明書でマルチドメインにする場合はサブドメイン位置に”＊”を付ける。　例：```*.hogehoge.co.jp```
　Organization:所有者名。例：```hoge inc.```や```NIHON TARO``` 等。
　Department: 　部署名。非必須。
　City:　市町村名。　本町1-1-1。　例：```Honmachi 1-1-1``` 
　State / Province:　都道府県。例： ```Shibuya```
　Country:国名。```Japan```
　Key Size:公開鍵長。今だとまず　```2048bit```で大概動くはず。（証明書発行会社によって変わるので注意）

 - A.OPENSSLコマンドで作成
　OpenSSlコマンドから発行する方法です。
　これは、特にCentOS等で自分でサーバ立てる時は有効です。
　やり方はこちらを参考にしてみるといいかと思います。

[GlobalSign社作成方法説明](https://jp.globalsign.com/support/ssl/?cat=csr)

 - B.ブラウザから(若干)お手軽発行
 ブラウザからopensslコマンドを発行して、それを元に自己証明書を発行してしまう方法です。
 何も考えなくても作れます。

[digicert社発行サイト](https://ssltools.digicert.com/checker/views/csrGenerate.jsp)

A、Bから、.csrファイルが作成できたとします

## 2.private keyのパス抜き版を作る 
　1.で作ったファイルはパスワード付きの暗号化された秘密鍵なので、パスワードが見れないと動きません。
　ところがどっこい、GAE等ではパスありだと動かないのです。（パスワードを入れるところもなければ、解読ができないから）
　そのため、GAEに入れるため用のパス抜きファイルを作ります。
　=>必ず入れ終わったら消しましょう。同じものはkeyファイルとパスワードがあれば作れます。

1. 次のコマンドを入力する(-in の後は、今の秘密鍵ファイルを指定して、　-out のあとは好きなファイル名にする。)
```hoge@hogenofuge ssl %　openssl rsa -in hoge2020.key -out hoge2020-nopass.key```
2.　出力されたファイルに次のコマンドを入れる。(-in 以降は2の-outで指定したものと同じにする。)　``` openssl rsa -in hoge2020-nopass.key -text -noout``` 
3.　２を入れたときにパスフレーズ入力画面がでなければOK.

## 3.サーバ会社に申し込み
SSL発行会社に提出するCSRファイルは、１で作ったパスフレーズありのものを使う場合と、2で作ったパスフレーズなしのもとを使う場合があります。詳しくはSSL発行会社で確認してみてください。

サーバ会社では大体EVSSL/OVSSL/DVSSLの三種類があります。
ざっくりですがEV>OV>DVの順番で証明書の署名度合い＋金額がなされてます。

- EVSSL (組織実在拡張証明型)：決済系やコーポレートサイトなど。
　住所まで表示される、ガチな証明書。
　証明書取得に時間がかかりますが、担当者の在籍まで確認する徹底ぶりです。
　「われ、ここにあり」と証明できる証明書と言っていいものです。
　審査にはDANS番号という商工会議所等で発行される国際的な企業番号や、登記簿が必要で、
　さらには電話やら書面やらの記入とチェックがあるので、審査でどんなにムチ打っても3日ぐらいはかかります（1週間は見てくださいｗ）。

- OVSSL (組織実在証明型)：会社所有サイト等。
　会社が所有していることを証明する証明書。
　EVとの違いは「担当者の在籍確認をするかしないか」。
　OVでは「してくれない」のである。
　細かく言えばアドレスバーが緑色にならなかったり、住所が途中までしか出ない等ある。
　ただ、1日前後で大体発行されるので、楽ではある。

- DVSSL （実在証明書）：その他もろもろ
　いわゆるQuiclSSL等ものすごく簡単なもの。LetｓEncryptはこれと同じ。
　とりあえず証明書を付けたいときとかに最適。第三者の会社がこのドメインは偽装されてないよ！という証明をするだけ。
　決して「この会社が持っている」とかではないことに注意し　もらいたい。
　　　＝＞無料のでええやん。なんで買うの？は、 エンジニアあるあるの聞いてはいけないお約束^^

　種類についてはわかりやすく次のサイトで出ていたのでご参考に。
　[CPI社レンタルサーバナレッジ](https://knowledge.cpi.ad.jp/security-info/244/)
　証明度合いについては次のサイトでわかりやすく出ていたのでご参号に。
　[geotrust](https://www.geotrust.co.jp/ssl_guideline/compare/ovdv.html)

## 4.メールで届いたものを確認する
　メールで大体次のようなものが届く。

 ```mail:certification.mail
━ GMOグローバルサイン株式会社 ／証明書発行のお知らせ  ━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
      このメールは送信専用アドレスで送信しております。
      ご返信いただいてもお答えできませんのでご了承ください。

━━━━━━━━━━━━━━━━━━ http://jp.globalsign.com/ ━━━━

この度はグローバルサインの電子証明書サービスをお申し込みいただき、
誠にありがとうございました。

お客様の電子証明書の発行が完了いたしましたのでご連絡申し上げます。

[オーダーID]     CEPxxxxxxxxxxx
[コモンネーム]      *.hoge.co.jp

ーーーインフォメーション省略！ーーー

◆証明書 RSA/SHA-256
￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
-----BEGIN CERTIFICATE-----
MIIFzTCCBLWgAwIBAgIMDGkrOsUV
省略！
/AvLR5eUtK3OZjJbrPbYUSpQ==
-----END CERTIFICATE-----


◆中間CA証明書
￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
-----BEGIN CERTIFICATE-----
MIIETjCCAzagAwIBAgINAe5fI
省略！
f6q8amaEsybwMbDqKWwIX7eSPY=
-----END CERTIFICATE-----


◆証明書＋中間証明書（PKCS7形式） RSA/SHA-256
IISの場合はこちらをご利用ください。
￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
-----BEGIN PKCS7-----
MIINsQYJKoZIhvcNAQcCoIINo
省略！
LO02JQZR7rkpeDMdmztcpH
WD9fMQA=
-----END PKCS7-----


◆利用約款に関して
￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
---以下省略---
 ```
　
 証明書って、メールで来るんだー、と始めてやったときに衝撃を受けました。
 EVって高いのに、DVとかと同じってのが、エンジニア的なちょっぴりしょんぼりなところ。
 まぁ公開されるからねーと開き直るけどｗ

## 5.GAEに登録する。
GAEに登録する時は、上の証明書と中間証明書、2で作成したパスフレーズを抜いた秘密鍵を使います。
1.　[GoogleCloudPlatformConsole](https://console.cloud.google.com/appengine/settings/domains)を開きます。
2.　プロジェクト名が正しいこと、カスタムドメインがプロジェクトに紐付いていることを確認します。![スクリーンショット 2020-10-31 17.38.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/a92395fd-9f61-daff-7817-cc4f9189d2c5.png)
3.　「SSL証明書」タブに切り替えます。
4.　「新規証明書をアップロード」を選択します。![スクリーンショット 2020-10-31 17.48.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/3999e32a-9b41-ba55-a7e8-95bb2f71e61c.png)
5.　次の通り入力する。
　　・ 名前：後々わかりやすい名前と、できれば年は入れる。　例：```hoge-cojp2020```
　　・ PEMでエンコードされた。。。:証明書と中間証明書を連続して入れる。

```
-----BEGIN CERTIFICATE-----
証明書
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
中間証明書
-----END CERTIFICATE-----
```
　　・復号化された。。。：２で作成したパスのないkeyファイルを入れる。
![スクリーンショット 2020-10-31 17.54.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/ee22c468-2aeb-a556-f982-4b86f8536d30.png)

6.　アップロードを選択する
7.　SSLを適用したいドメインを選択する
8.　「カスタムドメイン」に移動して、「カスタムドメイン名」と「SSLセキュリティ」が設定したものに変わっているか確認する。※多少時間かかる。![スクリーンショット 2020-10-31 18.03.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/7a9bc6cc-9228-68e7-f7a1-a7ca5c988b33.png)

## 6.SSL確認サイトで確認
SSLの確認サイトで、しっかり中間証明書ファイルとか設定されているか確認する。
購入したサイトが大概、どこかのSSLチェックサイトで確認できるようになっているはずなので確認する。
わからなければ 「SSL　チェック」でググってヒットしたサイトでチェックしましょう。
Global Signで買ったのですが、時間がかかるので別のやつで一旦チェック。
[GlobalSignチェックサイト](https://globalsign.ssllabs.com/)
[digicertチェックサイト]https://ssltools.digicert.com/checker/views/checkInstallation.jsp）

## その他
### 番外1）トラブルシューティング
Q1　「この証明書のドメインの承認済みオーナーではありません」とか出てきた。![スクリーンショット 2020-10-31 17.50.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/ab76d07b-a252-3ac4-5c3b-aa2f88c7511f.png)
A1 まずウェブマスターセントラルにアクセスしてみましょう。
その上で該当ドメインのオーナーであるか確認してください。（なければ確認を。）
[ウェブマスターセントラル](https://www.google.com/webmasters/verification/)
注意）search consoleでも大丈夫です。統合されて新しくなったのがサチコと思っていただければ。（ただ、なぜかそっちだと失敗することがある。なぜだろうか。。。）

Q2 「選択した秘密鍵は有効ではないようです」「選択した公開証明書は有効ではないようです」と出ます。　![スクリーンショット 2020-10-31 17.52.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/4597f8fb-0b1f-70f6-6968-600083235401.png)
A2 まぁ結構あることとして、
1. 前後にへんな空白があったり、どこか消してないか確認しましょう。
2. 秘密鍵の場合はパスフレーズが掛かったままでないか確認して見ましょう。
3. デコードがpemになってるか確認しましょう。
4. 「証明書と中間証明書くっついてるんでしょ？それいれればええやん！」と、メールで一緒についてくるPACK12を入れてないか確認してみましょう。全く別の代物なので入れてもダメです。

### 番外2) OGPが通らないとき
OGPが通らないときに確認したいサーバサイドが２つ。
1. 中間証明書が導入されているか。
2. CAAをDNS上で通してるか。

２が意外でした。引っかかる人は引っかかると思うので、一度確認してみてはどうでしょう？

#終わりに
やー、意外に記事作るのに時間がかかってしまいました。
EV/OV証明書という立派なものを持っていながら、「中間証明書使えないからLetsEncryptで！」
と安直にやっていた方をちらほら見かけたのでぜひ、これを機に使ってあげてください。。。
あとサイトシールはあるんですから使いましょう。安全でっせ！という表記は大事です。

会社のホムペでもペラ系は作ったらGAEにしましょう。だって楽だし無料だし。。。
何なら、Source Repositoryを使って、CIを回して自動でGAEを。。。！なんてことも出来るので
ぜひ色々試してみてもらえると。

最後に、
役立ったら、LGTMポチー、もしくはストックとかしてくれるとやる気出ますｗ