generalistからspecialistへ

一点集中化計画

サイトにSSL設定(nginx)し、オレオレ証明書を発行する

サイトにSSL設定する

server {
    listen       443;
    server_name  example.jp;

    ssl                  on;
    ssl_certificate      /etc/nginx/cert.pem;
    ssl_certificate_key  /etc/nginx/cert.key;
}
  • ドメインSSL有効にする
  • certificateファイル(pem)、certificate_keyファイル(key)が必要
  • pem, keyはcrtなど別の拡張子の場合もある(pemとcrt違い)
server {
    listen          80;
    listen          443 ssl;
    server_name     example.jp;
    ssl_certificate /etc/nginx/cert.pem;
}
  • この時、ssl  onと書かない。書くと80に対してもsslをonしてしまうから。

その他、SSL関連はserverディレクティブに対して以下ができる。 - 使用するSSLのバージョンを指定できる - 書き方:ssl_protocols SSLv3 TLSv1; - 暗号スイート: 複数の暗号技術の組み合わせを指定できる。 - 書き方:ssl_ciphers HIGH:!aNULL:!MD5; - 暗号スイート利用時、サーバーが使いたい暗号スイートを優先して使う - 書き方:ssl_prefer_server_ciphers on; - SSLセッションキャッシュ(サーバー負荷を減らす)を指定できる - 書き方:ssl_session_cache shared:SSL:10m;(キャッシュサイズ10M) - 書き方:ssl_session_timeout 10m;(タイムアウト10分)

オレオレ証明書とは

要するに 「認証」も自分が担当するという事.

用語 - .csr: 認証局に署名をリクエストする為のファイル(証明書署名要求CSR: Certificate Signing Request) - 中にはSignature Algorithm(確かにこれは私が要求(または発行)するファイルです)が書かれているSignature Algorithm: sha1WithRSAEncryption - 確認するにはcsrファイルをテキストとして開く。例:$ openssl req -text < server.csr - .crt: サーバー証明書。飛んできたcsrに対して、自身が持ってる秘密鍵で署名してcrtを発行し、要求者に返す - .key: 秘密鍵認証局が持ってる。オレオレの場合は自分が持ってる - Let's Encrypt: 無料でサーバー証明書発行してくれる所 - 証明書有効期限は90日だが、多くはレンタルサーバーなどが自動更新してくれる

csrファイル内には Signature Algorithmが1つ(要求者のサイン)
crtファイル内には 2つ、(要求者 + その要求に対して発行者のサイン)
書かれている。
crtにはIssuer(どの認証局が署名したか)が書かれている(オレオレの場合はsubjectと同じ内容が入る)

証明書発行の手順

さくらVPSでLet's Encryptを設定

まず概要を掴む

image.png

  • 設定を進められるように、一応先にさくら側のfirewallの443接続を許可しておく

    • ufwを使っているので、ufwコマンドで443追加 $ sudo ufw allow 443、statusで確認$ sudo ufw status、一応reload $ sudo ufw reload image.png
  • Let's Encryptから証明書得る為に使うtoolcertbot-autoをDLする

  • DLしたcertbot-autoを使って、Let's Encryptに証明書を作成してもらう image.png
    • $ sudo certbot-auto certonly --webroot -w /var/www/html/195cm.tokyo -d 195cm.tokyo --email sadaka556@gmail.com
    • 規約に同意するか?の質問が来る。agree. image.png
      • IMPORTANT NOTES: Congratulations! になれば処理完了 image.png
      • ls -l /etc/letsencrypt/live/以下にpemファイルができているはず
        • 一般ユーザーでログインしてる時、この/etc/letsencrypt/live/にcdしようとして$ sudo cd /etc/letsencrypt/live/しようとしてもできない。
          • sudoは一回きりrootで実行するコマンドで、cdは「移動」なので、権限必要なフォルダに移動する時は、移動後もroot権限でないといけないから、実質できないという事。その時は$ su -とかする。
      • pemファイルがあるのを確認したら、sites-available のファイルを編集する$ sudo vi /etc/nginx/sites-available/195cm.tokyo image.png
        • 編集後 reload $ systemctl reload nginx
        • ブラウザ確認、OK。 image.png
          • 期限が3ヶ月後になってるのが分かる
        • しかし、この処理後、http://195cm.tokyoにアクセスするとhttp://www.195cm.tokyoというようにwww付きにリダイレクトされるようになった。 image.png
        • 443からのアクセスしか受け付けなくなったからだろうか、80も追加してみる。 image.png
        • 80追加後、http://195cm.tokyoにアクセスしてもhttp://www.195cm.tokyoへリダイレクトされなくなった。 image.png
        • この時、まだSSL設定していないwww.195cm.tokyohttpsでアクセスするとどうなるかhttps://www.195cm.tokyo
          • https://195cm.tokyoに転送された image.png 設定が存在しなければうまい具合に処理してくれるのかな。 (※追記: 一番上のserverディレクティブの内容が実行されるっぽい)

オレオレ証明書を作る

Let's Encryptってオレオレじゃないよね??

SSLhttp://195cm.tokyo SSL : https://www.195cm.tokyo オレオレSSL : https://www1.195cm.tokyo

としたい。が、すでにhttps://195cm.tokyoでLet's EncryptでSSL発行してしまった。

Let's EncryptのSSLを失効させる

なので/etc/nginx/sites-available/の設定をコメントアウトするが、その後もアクセスできてしまうことがたまにあるので、気持ち悪いから完全に証明書失効させてみる。

  • revoke で失効させられるみたい$ certbot-auto revoke --cert-path=/etc/letsencrypt/archive/195cm.tokyo/cert1.pem
    • 他にも、fullchain1.pemprivkey1.pemも同様にrevokeして、最後$ certbot-auto delete -d 195cm.tokyoしないといけないと思ったが、最初のコマンド1つで全部やってくれたっぽい。
    • これで証明書は失効した(と思う)

このあと、www.195cm.tokyo の方で、Let's EncryptのSSL取り直した。が、、、 - https://www.195cm.tokyoでつなげるようにはできたが、、 image.png - http://www.195cm.tokyoでつなぐと、195cm.tokyoの方のページが表示されてしまう、、 image.png

  - 行き場がないアクセスは`/etc/nginx/sites-available/`内の一番上にあるserverディレクティブの内容が効くっぽい
      - `www.195cm.tokyo`を、httpsしか受けない設定にしている状態で、`http://www.195cm.tokyo`にアクセスすると、一番上に書いているserverディレクティブのrootである`/var/www/html/www1.195cm.tokyo`が読まれた

image.png image.png


やっとここからオレオレ証明書作成

オレオレSSLのURL : https://www1.195cm.tokyo

秘密鍵や証明書リクエストなどはどこのフォルダにいれるのか。 とりあえず、にあるようにetc配下に入れた

$ openssl genrsa 2048 > /etc/nginx/conf.d/ssl.key/server.key
$ openssl req -new -key /etc/nginx/conf.d/ssl.key/server.key > /etc/nginx/conf.d/ssl.csr/server.csr
$ openssl x509 -days 3650 -req -signkey /etc/nginx/conf.d/ssl.key/server.key < /etc/nginx/conf.d/ssl.csr/server.csr > /etc/nginx/conf.d/ssl.crt/server.crt
  • そして/etc/nginx/sites-available/の該当箇所に以下を記述するがエラー image.png

    • 書き方変わった?以下のようにするとエラー消えた(ssl_certificate の所) image.png

      - オレオレSSL URL : `https://www1.195cm.tokyo`にブラウザでアクセスすると、、 
          - **この証明書は有効ではありません。**( **ホスト名が一致しません**) と表示された。
      
      image.png
          - **全く偽装できてないではないか**。これであってるのかな?
              - あ、自分のmacに[avast](https://www.avast.co.jp/free-mac-security)いれてた。これを停止して再度アクセスしてみる。
              - **自己署名ルート証明書**。**この証明書は第三者によって検証されていません**。と表示された。ちょっとは偽装できた?
      

      image.png

  • 以上で完了。