目次

概要

Hugo+Nginxで稼働させている本サイト「 http://blog.kowloonet.org 」について、サーバ証明書を取得してSSLサイト化しました。

  • 1年後に同サイトの証明書を更新するとき
  • 他サイトで新しくサーバ証明書を作成するとき

に楽をするために、手順化しておきます。

証明書はSSL BoxのCore SSL(年額1000円程度)で新規発行しました。

手順

CSRの発行

サーバ証明書を発行する前提として、当該のサーバ上でCSR(証明書署名要求)を作成します。

鍵の作成

条件:

  • 鍵長は2048bit
  • パスフレーズを設定 (ずっと後の手順で鍵にパスフレーズを組み込みます)

    $ sudo mkdir /etc/nginx/ssl
    $ cd /etc/nginx/ssl
    $ pwd
    /etc/nginx/ssl
    
    $ sudo openssl genrsa -des3 -out blog.kowloonet.org.key 2048
    Generating RSA private key, 2048 bit long modulus
    ......................................................................+++
    .................................+++
    e is 65537 (0x010001)
    Enter pass phrase for blog.kowloonet.org.key: (何も入力せずEnter)
    139843731497408:error:28069065:UI routines:UI_set_result:result too small:../crypto/ui/ui_lib.c:765:You must type in 4 to 1023 characters
    
    ↑↑
    パスフレーズ無しでは鍵を作らせてもらえない
    
    Enter pass phrase for blog.kowloonet.org.key: (パスフレーズを応答)
    Verifying - Enter pass phrase for blog.kowloonet.org.key:
    
    
    $ ls *.key
    blog.kowloonet.org.key
    
    $ sudo chmod 400 blog.kowloonet.org.key
    
    

CSRの作成

  • 署名アルゴリズムはSHA256を指定(-sha256オプション)

    $ sudo openssl req -new -key blog.kowloonet.org.key -out blog.kowloonet.org.csr -sha256
    
    Enter pass phrase for blog.kowloonet.org.key: (秘密鍵のパスフレーズ)
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:JP
    State or Province Name (full name) [Some-State]:Tokyo
    Locality Name (eg, city) []:Taito-ku
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Kowloonet.org
    Organizational Unit Name (eg, section) []:
    Common Name (e.g. server FQDN or YOUR name) []:blog.kowloonet.org
    Email Address []: (空欄のままEnter)
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []: (空欄のままEnter)
    An optional company name []: (空欄のままEnter)
    
    $ ls *.csr
    blog.kowloonet.org.csr
    

CSRの内容を確認

$ sudo openssl req -noout -text -in blog.kowloonet.org.csr
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = JP, ST = Tokyo, L = Taito-ku, O = Kowloonet.org, CN = blog.kowloonet.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:e0:19:9c:a2:ed:94:0f:84:9d:9e:68:ae:cd:fd:
                    <snip>
                    2b:b1
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         5b:e8:e4:ee:ea:9f:f7:00:47:cd:64:09:ad:b6:3c:47:dc:cf:
         <snip>
         6c:90:1f:11

CSRができたので、これを証明機関に提出し(次項)、サーバ証明書を発行してもらいます。

サーバ証明書の申請

SSL BoxのCore SSLのページから申請。
ssl_setup_01

Core SSL の1年を選択。
ssl_setup_02

プリペイドをチャージして購入。
ssl_setup_03

ssl_setup_04

購入完了後、そのまま証明書の取得申請画面に進む。
ssl_setup_05

  • コモンネーム: blog.kowloonet.org
  • 署名アルゴリズム: SHA2-256
  • 前手順で作成したCSRを貼り付け

ssl_setup_06

CSRに格納した情報とは別に、「申請登録情報」を入力する。
(申請者の住所、電話番号など)

ssl_setup_07

ssl_setup_08

内容を確認し、発行を申請。

ssl_setup_09

無事エラーとなりました。
前項の「申請登録情報」に記載する情報が足りないとこうなります。

ssl_setup_10

郵便番号、住所、電話番号、メールアドレスを追記して再申請後、通りました。

ssl_setup_12

数分待つと、SecureCoreから申請の確認メールが届きます。
ssl_setup_13

記載のURLを開いて承認コードを入力します。

ssl_setup_15

数分待つと、SecureCoreからサーバ証明書の本体が届きます。
(メールの本文にベタ書きされてます)

ssl_setup_16

サーバ証明書が発行されたので、次はNginxへのSSLサイト設定に進みます。

NginxのSSL設定

サーバ証明書の格納

メール本文から証明書をコピー

$ cd /etc/nginx/ssl/
$ pwd
/etc/nginx/ssl

$ sudo vi blog.kowloonet.org.cert

(証明書のテキストを貼り付けて保存)

$ sudo chmod 600 blog.kowloonet.org.cert

$ ll /etc/nginx/ssl/
-rw------- 1 root root 2167 Jun 16 14:10 blog.kowloonet.org.cert
-rw-r--r-- 1 root root 1001 Jun 16 13:30 blog.kowloonet.org.csr
-r-------- 1 root root 1679 Jun 16 14:53 blog.kowloonet.org.key

Nginxのコンフィグ変更

既存の設定:
httpサイトのみ想定。80番でListenする設定だけが定義されていました。

これから投入する設定:
serverセクションを2つ用意し、

  • SSLサイト用のサイト設定
  • http://blog.kowloone.org 」(平文サイト)へのアクセスはhttps(SSLサイト)に強制的にリダイレクトするためのサイト設定

をそれぞれ定義します。

$ sudo vi /etc/nginx/sites-available/default

server {
        listen 443 ssl default_server;
        server_name blog.kowloonet.org

        ssl on;
        ssl_protocols           TLSv1.1 TLSv1.2;
        ssl_certificate         /etc/nginx/ssl/blog.kowloonet.org.cert;
        ssl_certificate_key     /etc/nginx/ssl/blog.kowloonet.org.key;

        #ssl_certificate                /etc/letsencrypt/live/gce.kowloonet.org/fullchain.pem;
        #ssl_certificate_key    /etc/letsencrypt/live/gce.kowloonet.org/privkey.pem;

        root /home/kowloon/hugo/blog/public;

        index index.html index.htm index.nginx-debian.html;
}

server {
        listen 80;
        server_name     blog.kowloonet.org;
        return          301 https://$host$request_uri;
}


Nginxコンフィグのチェック → OK

$ sudo /etc/init.d/nginx configtest
 * Testing nginx configuration                                                                      Enter PEM pass phrase: (秘密鍵のパスフレーズ)
                               [ OK ]
$

Nginxの起動 → 無事エラーになりました。

$ sudo service nginx restart
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.

秘密鍵からパスフレーズを外す

コンフィグの構文は正しいのに起動できないので、 切り分けのため、SSL秘密鍵のパスフレーズを外してみます。

$ sudo openssl rsa -in blog.kowloonet.org.key -out blog.kowloonet.org.key
Enter pass phrase for blog.kowloonet.org.key:
writing RSA key

これで秘密鍵の中にパスフレーズが組み込まれ、Nginxの起動時にパスフレーズの入力を要求されることがなくなります。

Nginxの起動テスト

秘密鍵のパスフレーズを解除後、起動に成功しました。

$ sudo service nginx  start
(エラー無し)

$ sudo service nginx  status
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2018-06-16 14:54:40 JST; 10s ago

Hugoのサイト設定更新(SSL化)

SSL適用先のサイト「blog.kowloonet.org」にて、Hugoの設定を編集して、SSLに適合させます。

既存のHugo設定では、サイトのデフォルトURLとして「 http://blog.kowloonet.org 」がHugoで指定されているため、リンクが正しく参照されず、サイトの表示が崩れます。

ssl_setup_17

config.tomlを編集します。

$ pwd
/home/kowloon/hugo/blog

$ vi config.toml

baseURL = "https://blog.kowloonet.org/"  
↑↑↑
baseURLを「https」に書き換え


サイトを再構築

$ hugo

                   | EN-US
+------------------+-------+
  Pages            |    16

再構築後、サイトが正しく表示されました。

ssl_setup_18

サーバ証明書の状況を確認します。

ssl_setup_19

USERTrust RSA Cert Authority  ← Root CA
  └─SecureCore RSA DV CA   ← 中間CA 兼 発行CA
      └─blog.kowloonet.org ← 発行されたサーバ証明書

証明書のチェーン(信頼関係の階層構造)が正しく引けているので、問題なさそうです。

Nginxの設定ファイルをバックアップ

GitHubのリポジトリにNginxの設定ファイルも含めておきます。

$ mkdir ~/hugo/blog/nginx-config

$ sudo cp /etc/nginx/sites-available/default ~/hugo/blog/nginx-config/


以上