2016年7月19日火曜日

SSLについてまとめる

全体的なところがよくあやふやになるので。細かいところは書かない。
また、俺の理解によるので、他人が読んだ場合に間違った結果につながっても責任はもちろんとれない。

利用目的

  1. 暗号化通信を可能にする。暗号化の強度は鍵の長さに依存する。
  2. 通信相手のサーバーを特定・認証する。
    • ただし、これは秘密鍵を使っていることに依存するので、認証局が胡散臭い場合やオレオレ証明書では成り立たない。
    • クライアントは認証されない。暗号化通信開始時点のクライアントであることは保証できるが、HTTPレベルの話なのでセッション単位で認証されるわけではない。

各種ファイル

  • 秘密鍵ファイル xxxx.key
    • 最初に秘密鍵あり。
    • サーバーで作ってサーバーで使う。秘密鍵なだけに。
    • パスフレーズの有無はここで決定
      • 有にした場合、この後、CSRの作成やサーバーの起動で入力が必要
        • サーバーの起動は、コマンドの設定で自動入力することは可能
  • CSR (Certificate Signing Request) xxxx.csr
    • 秘密鍵を使ってサーバーで作る。
    • 公開鍵情報とディスティンギッシュネーム(組織名などの登録情報)
    • 公開鍵として、認証局に登録する(オレオレ証明書でなければ、XXXサインなどのサーバー証明書の発行をする企業に提出する)
  • サーバー証明書 xxx.crt
    • 提出したCSRを使って、認証局(XXXサイン、などの企業と思っていい)が作ってくれる。
      • 間接的に秘密鍵を使っていることになる。ペアとなる公開鍵がCSR→サーバー証明書と形を変えている状態なので。
      • 通常は、認証局がCSRと申込み情報をもとに発行(電子署名をつける)する。自己証明書ではサーバーで作る。

設定の流れ

  1. 登録情報(ディスティンギッシュネームに入れるもの)を確認
    • 鍵の長さ指定も確認
  2. 秘密鍵の作成
  3. CSRの作成
  4. サーバー証明書の申込
    1. CSRの送付
    2. 証明を受ける組織が、XXXサインなどに対して申し込む。実際の手順はサービスにより多少違う。
  5. サーバー証明書を受け取り、サーバーに設置
    1. Apacheならば、ssl.confに秘密鍵とサーバー証明書のファイルを指定し再起動(再起動時にパスフレーズが必要)

更新時の流れ

  1. 原則的に登録時と同じ
    • ssl.confを書き換える
      • SSLPassPhraseDialog
        http://venzol.blogspot.jp/2016/05/apachessl.html の、起動時にパスフレーズを入れない方法のためのshファイル
      • SSLCertificateFile
        xxx.crt
      • SSLCertificateKeyFile
        xxx.key
      • SSLCertificateChainFile ※Apache 2.4では、これがなくてSSLCertificateFileに指定する.crtファイルに、そのまま続けて.cerの内容を貼り付けておくらしい(俺が実際作業したのは2.2だから試してはいない)
        xxx.cer ← 中間CAがあるタイプだったので、crtと一緒に証明書業者から送付されてきた
    • 証明書がメール本文に書きこまれて送付されてきたりしたのでテキストエディタでファイルにしてからサーバーにアップロードしたが、最後の改行はあってもなくても大丈夫ということがわかった。
    • というか、証明書をファイルにした状態でダブルクリック(Windows10)したら、証明書の情報が表示された。保存に失敗していればこれが出ないので、この方法でもひとまずの確認をしておくとよい。
  2. 入れ損ねた場合に既存の証明書で稼働させるため、上記の各ファイルはすべて既存のものと別の名前で配置する。そうすれば、ssl.confを書き換える際に、現状のものをコピーしておけば、もし再起動でエラーが出た場合、ssl.confだけ戻せば既存の証明書で起動できるはず。

具体的な手順の補足

フォルダなども指定しない最低限の手順の例。実際にはもうちょっとファイル名などは管理しやすくする方がよい(更新などで戸惑わないように)。

Apache 2.2 + OpenSSL 1.0の環境。

    秘密鍵の作り方

    1. sudo su -
    2. cd /etc/httpd/conf
    3. openssl genrsa -des3 -out ./myprivate.key 2048
      →パスフレーズを求められる。ここでは"mypass"とした
    4. confディレクトリにmyprivate.keyができてる

    CSRの作り方

    1. openssl req -new -key ./myprivate.key -out ./myssl.csr
      → "req"が「CSRを作る」コマンド。
      → 指定した秘密鍵のパスフレーズが必要。ここでは"mypass"
      → その他設問は冒頭の国コードのみ"JP"、あとはすべて空
      ※ 秘密鍵作成時にパスフレーズのリタイプに失敗してたりすると、秘密鍵ファイルはあるくせにここで妙なエラーが出たりするので注意。その場合秘密鍵を作り直す
    2. myprivate.csrができてる。この中身のテキストを証明書発行サービスに申込時、貼り付けるなどすることになる。

    サーバー証明書の作り方(オレオレ用。通常はいらない)

    1. openssl x509 -req -days 3650 -sha256 -in myssl.csr -signkey myprivate.key -out myserver.crt
      → 秘密鍵は使いまわし
    2. myserver.crtができてる。本来であれば、サーバー証明書の発行会社がくれるもの。
    ついでに以下を作っておく。

    # vi mypass.sh
    # chmod 500 mypass.sh
    中身↓
    #!/bin/sh
    echo "mypass"


    サーバーへの組み込み

    1. vi /etc/httpd/conf.d/ssl.conf
      ここでそんなものないじゃん、という場合:
      # apachectl -t -D DUMP_MODULES | grep ssl
      としてSSLモジュール有無を確認。なければ、
      # yum install mod_ssl
      で入る(少なくとも、AWS EC2 AmazonLinuxでは。)
    2. SSLCertificateFile、SSLCertificateKeyFileをさきほどのファイルで指定
    3. SSLPassPhraseDialog  exec:/etc/httpd/conf.d/mypass.sh
      → これは起動時にパスフレーズ入れるのを省略した場合のみ

    ついでに全ページSSL

    /etc/httpd/conf.dに以下を作成。
    sslall.conf

    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    Apache再起動で、強制SSL。

    ※ 最初は以下のように書いていたのだが、ホスト名直下の"/"が抜けることがあった。転送先の最後の"/"を足せばいい?と思ったが、どうもRewriteRuleの方が世の多数派のようなので、それに倣うことにした。
    NameVirtualHost *:80
    <VirtualHost *:80>
      ServerName myhostname
      Redirect permanent / https://myhostname
    </VirtualHost>

    0 件のコメント:

    コメントを投稿