まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:https

今月(2018年5月)から GitHub ページがカスタムドメインでも HTTPS 対応された、という発表がありました:
Custom domains on GitHub Pages gain support for HTTPS

2018051001


というわけで、自分が取得しているドメインを使って試してみました。以下、GitHub ページの紹介と、その手順を含めた報告です。


GitHub ページとは?

GitHub ページとは GitHub の仕組みを使った静的ウェブサイトのホスティングサービスです。GitHub アカウントを持っていれば、誰でも簡単にウェブサイトを作って公開することができるので、非常に便利です。


GitHub ページの作り方

index.html 一枚だけの非常にシンプルな例で紹介します。まずは普通に Github でリポジトリを作成し、GitHub ページ(ウェブサイト)に含めたい HTML ファイルその他をまとめてプッシュし、公開します:
2018051002


この時点で、同リポジトリが GitHub で普通に公開されている状態になりました:
https://github.com/dotnsf/githubpagessample


(今回、公開する index.html ファイルの中身)
https://raw.githubusercontent.com/dotnsf/githubpagessample/master/index.html


次にこのリポジトリを GitHub ページとして公開します。リポジトリのページから "Settings" メニューを選択します:
2018051003


少しスクロールして GitHub Pages の設定欄を表示し、Source が None になっている所を "master branch" に変更して "Save" します。これでこのリポジトリのマスターブランチが Github Pages として公開されることになります:
2018051004


"Save" が成功すると画面内に GitHub Pages として参照する場合の URL が表示されます。一般的にはここは https://(ログイン名).github.io/(リポジトリ名)/ となります:
2018051005


この URL にアクセスしてみると、先程のリポジトリのマスターブランチが HTTP サーバーのドキュメントルートとして扱われる感じになり、index.html ファイルが表示されます。またこの画面からもわかるように、このページは HTTPS 対応しています:
2018051102


以上、ここまでが GitHub ページの説明です。


カスタムドメインで GitHub ページを使ってみる

今回の更新で、上記の GitHub ページがカスタムドメインでも HTTPS 対応されるようになりました。この点を確認したいので、まずは GitHub ページをカスタムドメイン対応してみます。

そのためには GoDaddyお名前.comなどのドメイン業者でドメインを取得しておく必要があります。ここはどうしても無料というわけにはいかず、ドメインの種類にもよりますが、1年間 $10 程度かかってしまうことを理解した上で取得してください。ちなみに自分は(B'z ファンでもないのに) welove.bz というドメインを GoDaddy で取得しているので、このドメインを使って GitHub ページをカスタムドメイン対応する手順を以下に紹介します。

最初に、対象ドメインの DNS 設定を変更する必要があります。このページの "Configuring A records with your DNS provider" という項目によると、ホスト名の A レコードの IP アドレスを以下のように設定する必要があるようです:
2018051103


A レコードの IP アドレスを複数設定できる場合はこの4つの IP アドレスを設定します。僕が使っている GoDaddy では1つしか設定できないようだったので、一番上のアドレスに指定しました:
2018051104


この部分は同様の作業をドメイン業者の用意したツールを使って設定してください。 なおこの作業について、詳しくは GitHub のドキュメントも参照ください:
https://help.github.com/articles/setting-up-an-apex-domain/


この作業の後で、GitHub の該当リポジトリに CNAME という名前のファイルを1つ追加します。CNAME ファイルの中身にはカスタムドメイン名だけを記載します:
2018051105


このファイルをリポジトリに add して commit して push します:
2018051106

2018051107


最後に再びリポジトリの settings 画面を確認して、GitHub ページのカスタムドメインが設定されている(されていない場合は、ドメイン名を入力して "Save")ことを確認します。これで GitHub ページのカスタムドメイン設定ができました:
2018051108


この状態で http://(カスタムドメイン名) にアクセスすると、先程まで ***.github.io ドメインで動いていた GitHub ページが表示されます:
2018051101


これで GitHub ページのカスタムドメイン化が完了しました。



カスタムドメイン GitHub ページの HTTPS 対応

やっと本題です(苦笑)。ここまでの作業で GitHub ページがカスタムドメインで利用できるようになりました。今回の目的は「このページを HTTPS 対応にする」ことです。

そのための設定はリポジトリの settings で、カスタムドメインを指定した下に "Enforce HTTPS" というフィールドがあるので、ここにチェックを入れるだけ・・・
2018051101



・・・なのですが、まだ証明書が有効になっていないようです(チェックできない)。こうなると作業としてできることはないので、ひたすら待つ必要があります。

ちなみに、この状態で無理やり HTTPS を指定して https://(カスタムドメイン名)/ にアクセスすると「安全な接続ではない」と言われます。ここから例外を承認して・・・ということもできないわけではないですが、せっかくなのでしばらく待ちましょう:
2018051102


しばらく待つとこの部分のメッセージが変わり、"Enforce HTTPS" がチェック可能になります:
2018051103


チェックするとこのような画面になり、このリポジトリの GitHub ページは強制的に(HTTP でリクエストしても)HTTPS でアクセスされるようになります:
2018051104


実際にアクセスしてみました。ちゃんと HTTPS に転送されています:
スクリーンショット 2018-05-11 15.38.40


HTTPS のインフォメーションを確認しても(オレオレ証明書とかではなく)"Secure Connection" になっていることが確認できます:
スクリーンショット 2018-05-11 15.39.12



(おまけ)
ではこの証明書は誰がどうやって発行しているのだろう? と疑問に思ったのですが、"Verified by: Let's Encrypt" だそうです。なるほどね・・・:
スクリーンショット 2018-05-11 15.38.58


めでたし、めでたし。
ところでこの welove.bz ドメイン、なんかいい使いみちないかな? (^^;


Node.js + Express の環境で SSL を使う(https でアクセスできるようにする)方法を調べたのでまとめました。


まず SSL を使うための鍵ファイルと証明書ファイルを用意します。公式なドメインを所有していて、本物の鍵/証明書ファイルを持っているのであればそれを使っても構いません。試験的に試すのであれば、いわゆる「オレオレ証明書」を作成します。Linux 環境であれば openssl コマンドを使って、以下のように入力します:
$ openssl genrsa -out server_key.pem 2048
Generating RSA private key, 2048 bit long modulus
...............+++
..........................+++
e is 65537 (0x10001)

$ openssl req -batch -new -key server_key.pem -out server_csr.pem -subj "/C=JP/ST=Chiba/L=Funabashi/O=Jugeme/OU=Dev/CN=juge.me"

$ openssl x509 -in server_csr.pem -out server_crt.pem -req -signkey server_key.pem -days 73000 -sha256
Signature ok
subject=/C=JP/ST=Chiba/L=Funabashi/O=Jugeme/OU=Dev/CN=juge.me
Getting Private key

$

↑この例では juge.me というホスト名で運用する前提での、サーバーの鍵ファイル(server_key.pem)と証明書ファイル(server_crt.pem)を作成しています。

この2つのファイルと同じディレクトリに app.js というファイル名で、Node.js のソースコードを以下の内容で作成しました。アプリケーションそのものはドキュメントルート(/)にアクセスがあった場合に「ハローワールド」と表示するだけの単純なものです:
//. app.js

var express = require( 'express' ),
    http = require( 'http' ),
    https = require( 'https' ),
    cfenv = require( 'cfenv' ),
    fs = require( 'fs' ),
    app = express();
var appEnv = cfenv.getAppEnv();

//. 鍵ファイルと証明書ファイル var options = { key: fs.readFileSync( './server_key.pem' ), cert: fs.readFileSync( './server_crt.pem' ) };
//. 鍵ファイルと証明書ファイルを指定して、https で待受け var server = https.createServer( options, app ).listen( appEnv.port, function(){ console.log( "server stating on " + appEnv.port + " ..." ); });
//. ドキュメントルートにリクエストがあった場合の処理 app.get( '/', function( req, res ){ res.write( 'ハローワールド' ); res.end(); });

このコードを実行すると待受ポート番号が動的に決定して表示されます(↓の例だと 6015 番ポートで https が待ち受けていることが分かります):
$ node app.js
server stating on 6015 ...

ではウェブブラウザで実際にアクセスしてみます。本当に使っている本物のドメイン/ホスト名であればそのままアクセスできると思いますが、試験的に実行している場合はこのホストに "juge.me" という名前でアクセスできる必要があります。必要に応じて hosts ファイルを編集するなどして、目的のホスト(node app.js を実行したホスト)に "juge.me" というホスト名でアクセスできるような準備をしておいてください。

そしてウェブブラウザで "https://juge.me:(ポート番号)" にアクセスします:
2017041301


オレオレ証明書名物「安全な接続ではない」という警告画面になると思います。ここからの手順はウェブブラウザの種類にもよりますが、FireFox の場合であれば「エラー内容」ボタンをクリックしてから「例外を追加」をクリックして、このサイトの警告を無視するための設定を行います。

そして「セキュリティ例外の追加」ダイアログにて、この URL の「セキュリティ例外を承認」します:
2017041302


すると警告が消えて、プログラムで用意したコードが実行され、「ハローワールド」というメッセージが表示されることが確認できます:
2017041303


IBM Bluemix のような PaaS 環境だと、このあたりも含めてアプリケーションサーバー環境が用意されるので楽ですが、素で Node.js 環境を構築する場合はアプリケーション側でも https 対応を実装する必要があり、意外と面倒ね。

前回(「WAS Liberty Core を 80/443 番ポートで動かす」)の続きです。

今回は軽量版ではなく、いわゆる「フルプロファイル版」などと呼ばれている、従来の WAS(Websphere Application Server)を対象に起動ポート番号を変更する手順を紹介します。また今回も具体的には IBM Bluemix 内の WAS on Bluemix サービスの BASE プランインスタンスを使って紹介します。


では実際に起動ポートを変更します。ウェブブラウザで https://(ホスト名):9433/ibm/console/ にアクセスして管理コンソールを開き、正しいユーザー名とパスワードを入力してログインします:
2017031601


WAS の管理コンソールにアクセスしました:
2017031602


WAS の場合、起動ポート番号はアプリケーションサーバー内の Web コンテナのトランスポートチェーンで管理しています。というわけで、まずは左ペインから サーバー - サーバータイプ - WebSphere Application Server を選択し、アプリケーションサーバーとして起動ポートを変更したいサーバーの名称(デフォルトでは server1)を選択します:
2017031603


選択したアプリケーションサーバー内から Web コンテナー設定 - Web コンテナー・トランスポート・チェーン を選択します:
2017031604


現在設定されている Web トランスポートチェーンの一覧が表示されます。この中に 80 番(http)と 443 番(https)を追加します。まずは 80 番ポートを追加するために「新規作成」ボタンをクリックします:
2017031604


作成するトランスポートチェーンの名称(下図では WCInboundDefault80)を入力し、テンプレートに WebContainer が選択されていることを確認して「次へ」をクリックします:
2017031605


利用するポート番号をここで指定します。「新規ポートの作成」が選択されていることを確認して、ポート名は "80"、ホストは "*" 、ポートは "80" をそれぞれ入力して「次へ」:
2017031606


確認の画面で「終了」を選択します:
2017031607


トランスポートチェーン一覧の画面に戻るので、今回の変更をマスター構成として「保存」します:
2017031608


追加したトランスポートチェーンが一覧に含まれていることを確認します:
2017031609


同様にしてもう1つ、443 番ポート(https)のトランスポートチェーンも新規に作成します。その場合、テンプレートには "WebContainer-Secure" を選択することに注意してください:
2017031601

また、ポート名とポートには "443" を入力します:
2017031602


こうして 80 番ポート(http)と 443 番ポート(https)のトランスポートチェーンが追加されたことを確認します:
2017031603


ここまでの作業ができれば後はサーバーを再起動して、変更を反映するだけです。が、ここも前回紹介した理由により root ユーザー権限でサーバーを起動する必要があります。具体的には ssh 等でログイン後、root ユーザーに su/sudo して、root ユーザー権限でサーバーを止めて、再び起動する、という手順を実行します:

$ sudo /bin/bash

# /opt/IBM/WebSphere/AppServer/bin/stopServer.sh server1

# /opt/IBM/WebSphere/AppServer/bin/startServer.sh server1

# exit

$

これで WAS Liberty Core の時と同様に WAS も 80/443 番ポートで利用できるようになっているはずです。

IBM の Java アプリケーションサーバーである WAS(Websphere Application Server) は標準設定のまま導入して使い始めると、9080 番ポート(http)や 9443 番ポート(https)でサーバーが起動します。これを一般的な 80 番や 443 番で起動させるための設定を紹介します。方法自体はいくつかあるのですが、ここで紹介するのは「とりあえずてっとり早くできる方法」です。 また今回は軽量版である WAS Liberty Core を対象として紹介します(フル機能版は次回)。具体的にはパブリッククラウドであるIBM Bluemix 内の WAS on Bluemix サービスの Liberty Core インスタンスを使って紹介します:


では実際に起動ポートを変更します。WAS Liberty Core の場合はアプリケーションサーバーの server.xml を編集することで変更できるので、まずはこのファイルを探します。

既にアプリケーションサーバーが起動している場合はウェブブラウザからも変更できます。 https://(ホスト名):9080/ にアクセスして、"Open Admin Console" をクリックします:
2017031601


認証が有効に設定されている場合は認証画面になります。正しいユーザー名とパスワードを入力して「送信」します:
2017031602


管理コンソールにアクセスできました。server.xml を編集するには "Server Config" を選択します:
2017031601


構成ファイルとして server.xml が表示されている(これしか表示されてない??)ので、server.xml をクリック:
2017031602


すると server.xml の編集画面に移動します。「ソース」タブで表示すると、XML テキストを直接編集することも可能です:
2017031603


なお、SSH 等でアプリケーションサーバーシステムに直接ログインできる場合であれば、server.xml は以下に存在しているので、このファイルを直接テキストエディタで編集しても構いません:
/opt/IBM/WebSphere/Profiles/Liberty/servers/server1/server.xml


以下の赤字部分4箇所を変更します。変更が完了したら保存(管理コンソールであれば右上のボタン)します:
<server description="Default Hypervisor Server">
  <!-- Simple application server, supporting servlets and jsps -->
  <featureManager>
    <feature>jsp-2.2</feature>
    <feature>adminCenter-1.0</feature>
  </featureManager>
<remoteFileAccess>
<writeDir>${server.config.dir}</writeDir>
</remoteFileAccess>
<virtualHost id="default_host" allowFromEndpointRef="defaultHttpEndpoint">
 <hostAlias>*:80</hostAlias>
 <hostAlias>*:443</hostAlias>
</virtualHost>
<!-- virtualHost id="external_host">
 <hostAlias>*:80</hostAlias>
 <hostAlias>*:443</hostAlias>
</virtualHost -->

  <quickStartSecurity userName="wsadmin" userPassword="{xor}am07ZzlubWg=" />
  <keyStore id="defaultKeyStore" password="{xor}am07ZzlubWg=" />
  <!-- disable automatic configuration and application updates, but leave mbean support enabled -->
  <config updateTrigger="mbean"/>
  <applicationMonitor updateTrigger="mbean" dropinsEnabled="true"/>
  <ssl id="defaultSSLConfig"
     sslProtocol="SSL_TLSv2"
     keyStoreRef="defaultKeyStore"
     clientAuthenticationSupported="true"/>

  <!-- open port 9080 for incoming http connections -->
  <httpEndpoint id="defaultHttpEndpoint"
                host="*"
                httpPort="80"
                httpsPort="443">
      <tcpOptions soReuseAddr="true"/>
  </httpEndpoint>
  <!-- httpEndpoint id="publicHttpEndpoint"
              host="*"
              httpPort="80"
              httpsPort="443">
      <tcpOptions soReuseAddr="true"/>
  </httpEndpoint -->
</server>


設定の変更そのものはこれだけです。後はアプリケーションサーバーを再起動・・・なのですが、OS が Linux の場合はもう1点注意が必要です。

Linux の場合、1024 番未満のポートはデフォルトでは root 権限がないと listen できません
。つまり上記の設定変更をしても再起動の際に root 以外のユーザー権限で再起動するとポートを listen できないのです。

特に IBM Bluemix 環境での場合、OS は RedHat で、その一般ユーザーである virtuser の権限で WAS は起動します。つまり上記の制約をまともに受けてしまうのでした。というわけで、WAS 再起動の際には注意が必要です。具体的にはまず root ユーザーに su(または sudo)し、root ユーザー権限でサーバーを止めて、再び起動、という手順が必要です:
$ sudo /bin/bash

# /opt/IBM/WebSphere/Liberty/bin/server stop server1

# /opt/IBM/WebSphere/Liberty/bin/server start server1

# exit

$


これで WAS Liberty Core が 80/443 番ポートで利用できるようになっているはずです:
2017031603


 

このページのトップヘ