Google Cloud Platform に構築した Virtuoso を無料でSSL化

**Google Cloud Platform**（以下 **GCP** といいます）の、Always Free（無期限の無料枠）を利用して、RDFストア **Virtuoso** を構築する方法について以下の記事で紹介しました。

[Google Cloud Platformの無期限無料枠を利用した Virtuosoの構築方法](https://qiita.com/mirkohm/private/30991fec120541888acd)

その続編として、無料ドメイン **Freenom** と、無料SSL証明書 **Let's Encrypt** を利用した Virtuoso の SSL化について紹介します。これも初学者向けに丁寧に書いたので冗長な記事になっています。ご了承ください。

# Freenom で無料ドメインの取得
<font color="Red">**[2022.08.23追記] Freenomで取得していたドメイン5つが全部消えていました。**
2つは再取得できましたが、残り3つは再取得できませんでした。
やはり完全無料な（怪しい）サービスですので、あまり使わないほうがいいかもしれません。
お試しで遊ぶのにはいいと思いますが、永続的に使いたい場合はちゃんとしたドメインを取得しましょう。 </font>


無料で好きなドメインを取得できる Freenom というサービスがあります。まず以下のサイトにアクセス。
https://www.freenom.com/ja/index.html

トップレベルドメイン（ドメイン名のドットの右側の文字）は、以下の5種類であれば無料で利用できます。
**.TK 　 .ML 　 .GA 　 .CF 　 .GQ**
（私がやったときは **.ML** は調子が悪く登録できませんでした・・・）

ドメイン名は、短い文字列（3文字以内）や辞書に載っているような単語は有料となります。

好きなドメイン名を決め、下記のように入力欄に打ち込み **利用可能状況をチェックします** をクリック。
利用可能であれば、下記のように **「はい、XXXXX.XXは利用可能です！」** と表示されます。その状態で **チェックアウト** をクリック。
![2020-06-25 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660813/5cccaa90-8d81-300f-3b90-1fa652c3b5ae.png)

ドメインの維持期間の設定画面に遷移します。
デフォルトでは3ヶ月になっていますが、12ヶ月までは無料なので12ヶ月にします。（期間終了後、無料で更新もできます。）
**Continue** をクリック。
![2020-06-25 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660813/321dd828-e374-c6d7-a178-973c2fc9c430.png)

次に確認画面が表示されます。あなたのメールアドレスを入力し、**Verify My Email Address** をクリック。
![2020-06-25 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660813/a444dd69-ab69-243f-fd04-c5b9cf9b62cc.png)

しばらくすると以下のような認証用メールが届くので、記載してある認証用URLを開きます。
![2020-06-25 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660813/0f3dc6c9-4ebf-204b-23f6-4beec41977cd.png)

必要事項を入力し、**I have read and agree...**にチェックを入れ、**Complete Order** をクリックします。
（この入力情報が Whois に出るわけではありませんので安心してください）
これでドメインの登録が完了です。
![2020-06-25 (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660813/1555898f-49bf-4b8b-fc8f-13b23512c312.png)

次にDNSの設定をします。トップページから **Survice** -> **My Domeins** 
![2020-06-25 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660813/4e8a50b3-c511-e134-3a86-12b72fe60afa.png)

**Manage Domain** をクリック。
![2020-06-25 (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660813/a28ed962-f01a-40f1-f1c0-09de8255c895.png)

Name 欄が空欄のところと www のところの両方の **Target** 欄に **GCPの外部IP** を入力し、**Save Changes** をクリック。
![2020-06-25 (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660813/b1744481-cc76-bd4c-df13-d7e4eddf9ac1.png)
以上で、DNSのAレコードにあなたのGCPインスタンスのIPアドレスが記録され、ドメイン名でアクセスできるようになります。

ドメインが利用できるようになるまでしばらく時間をおいたのち、以下のように、WEBブラウザから **http://ドメイン名:ポート8890番** でVirtuosoのウェルカム画面が出るか確認します。

　http://xxxxxxx.xxx:8890

# 8890番ポートへのアクセスをリバースプロキシで転送
ここからはGCPのターミナル内での作業となります。
左上のナビゲーションメニュー -> コンピューティング の中の **Conpute Engine** -> **VMインスタンス** から、**SSH** -> **ブラウザウィンドウで開く** を選択
![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660813/efbedda7-b6f5-cac5-17b6-f54f1bec1ead.png)


Apacheのmod_proxyモジュールを有効にして、ポート8890番へのアクセスを転送するリバースプロキシの設定をします。
まずApacheをインストール

```
$ sudo apt-get update && sudo apt-get install apache2 -y
```
mod_proxy モジュールを有効に

```
$ sudo a2enmod proxy
$ sudo a2enmod proxy_http
```
リバースプロキシを設定するための .conf ファイルを新規作成

```
$ sudo vi /etc/apache2/conf-enabled/virtuoso-reverse-proxy.conf
```

以下のとおり記述し、**:wq** で保存し vi を終了

```ruby:virtuoso-reverse-proxy.conf
ProxyRequests Off
# conductor/にアクセスがあったときのみconductorへ
ProxyPass /conductor/ http://localhost:8890/conductor/
ProxyPassReverse /conductor/ http://localhost:8890/conductor/
# 上記以外のアクセスは Query Editor
ProxyPass / http://localhost:8890/sparql/
ProxyPassReverse / http://localhost:8890/sparql/
```

Apacheを再起動

```
$ sudo systemctl restart apache2
```

ブラウザでそれぞれの画面が出るか確認

- Query Editor画面（== SPARQL Endpoint）
　http://xxxxxx.xxx （ドメイン名は取得したものに変更すること）

- コンダクター画面
　http://xxxxxx.xxx/conductor/

# SSLの有効化
ポート443番を有効化し、SSLでアクセスできるように準備します。

mod ssl モジュールを有効に

```
$ sudo a2enmod ssl
```
default-ssl.conf を編集し上書き保存

```
$ sudo vi /etc/apache2/sites-available/default-ssl.conf
```
```ruby:default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost  
                ServerName XXXXXXXX.XX  <-- ここにあなたが取得したドメインを追記
                ....以下変更不要
```
default-ssl.conf へのシンボリックリンク作成

```
$ sudo a2ensite default-ssl
```
Apacheを再起動

```
$ sudo systemctl restart apache2
```

# Let's Encryptの導入
次に、取得したドメインに対し、無料SSL証明書 **Let's Encrypt** を導入します。

```
$ sudo apt-get install certbot python3-certbot-apache
$ sudo certbot --apache
```

しばらくすると Let's Encrypt のインストール用の設定画面が出て、いくつか質問が出ますので答えていきます。


下記の質問が出たら、1: のところに適用させたいドメインが表示されていることを確認し、何も入力せずそのまま Enter

```
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: xxxxxx.xxx
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or
leave inputblank to select all options shown (Enter 'c' to cancel): 
```


次にメールアドレスを聞かれたらあなたのメールアドレスを入力
次に (A)gree/(C)ancel を聞かれたら **A**
次に Electronic Frontier Foundation からのメール送信の受託について聞かれたら **N**

次に下記のリダイレクト設定について聞かれたら、**1** を入力し Enter 

```
Please choose whether or not to redirect HTTP traffic to HTTPS, 
removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver
configuration.
2: Redirect - Make all requests redirect to secure HTTPS 
access. Choose this for
new sites, or if you're confident your site works on HTTPS.
You can undo this change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 
```
**Congratulations! You have successfully.....** のメッセージが出れば成功です。

Apacheを再起動

```
$ sudo systemctl restart apache2
```

ブラウザでSSL証明書が適用されているか確認
（**ブラウザのキャッシュをクリアしてから**確認すること）

- Query Editor画面（== SPARQL Endpoint）
　https://xxxxxx.xxx （ドメイン名は取得したものに変更すること）

- コンダクター画面
　https://xxxxxx.xxx/conductor/

# おわりに
以上で、無料かつ安全な Virtuoso エンドポイントが完成です。
Conductor で自分の作ったRDFを登録してみたり、SPARQL Endpoint から API でデータを取得したりして使い倒しましょう。

# 参考にさせていただいたサイト

- [freenomで無料ドメインを取得する](https://note.com/dafujii/n/n406f385651e2)
- [Apache 2.4 on Ubuntu 16.04でSSL](https://qiita.com/tontan9616/items/bd8b2f1f360f26c7bb46)