#
ドキュメント

Document

自分のための備忘録です。

SSL

  • サーバーの証明
  • 通信の暗号化
  • 改竄の検出

必要ファイル

  1. 秘密鍵(KEY: Certificate Key File)
    暗号化の鍵
  2. 証明書署名要求(CSR: Certificate Signing Request)
    認証局(Certificate Authority)へ提出
  3. 証明書(CRT: Certificate)
      SSL証明書(公開鍵を内包)
  4. 中間証明書 ルート認証局に中間認証局を署名した証明書

現在ではルート認証局ではなく中間認証局が署名することが多い。よって中間証明書も必要。 シマンテック、ジオトラストなどは、ルート認証局のほかに中間認証局も運営している。

秘密鍵から電子証明書(公開鍵 + CA電子署名)を作成する手順

  1. サーバーで秘密鍵・公開鍵を作成(秘密鍵の拡張子は.pemにする場合が多い)
  2. ↑に作成した鍵に対してCSR(証明書署名要求)を作成(拡張地は.csr
  3. 認証局(CA:Certificate Authority)にCSR(証明書署名要求)を送り署名を受ける
  4. 認証客から証明書(公開鍵とCAの電子署名をあわせたファイル)を受け取る(これがSSL証明書 拡張子は.crt

秘密鍵のパーミッションはオーナー以外に操作権限のない600です。

ブラウザーは公開鍵を取得してSSLの通信を開始する。 その後は共通鍵で暗号化する。

SSL概要

初めにSSLの仕組みについて、おおまかにですが説明しておきます。 SSLではクライアント、サーバー間でデータを暗号化して送受信を行う際に、共通鍵暗号化方式を使用します。 共通鍵暗号化方式は、データの暗号化と復号化に同じ鍵が使用されるようになっており、SSLではクライアントとサーバーで同じ鍵を共有することで、暗号化されたデータの送受信が行われるのですが、この鍵を安全にクライアントとサーバーで共有するために、公開鍵暗号化方式が使用されます。 公開鍵暗号化方式は、データの暗号化と復号化に異なる鍵が使用されるようになっており、SSLではサーバーが暗号化用の鍵と復号化用の鍵の組み合わせを作成し、復号化用の鍵は秘密鍵としてサーバーが保持し、暗号化用の鍵は公開鍵としてサーバーからクライアントに送信されます。 この公開鍵を送信する際には、サーバーの正当性を証明するために、認証局が作成した証明書が使用されます。 ここではサーバーを認証局とした、自己署名の証明書を作成します。 公的な認証局で証明書を作成する場合は、その認証局のホームページに秘密鍵と、証明書の作成依頼となるCSRの作成方法が公開されているかと思いますので、そちらをご参照ください。主な流れとしては、ここで紹介しているものと同様かと思います。

SSLの仕組み 参考画像

ファイル:SSLによるセキュアな通信.jpg - Wikipedia

必要なもの

サーバーで秘密鍵と公開鍵証明書を作成します。
公開鍵はサーバー証明書の一部となります。

  • 秘密鍵
    • サーバーに配置します。
    • 拡張子(key)
  • 公開鍵
    公開鍵はサーバー証明書の一部として公開します。
  • 公開鍵証明書(=電子証明書、サーバー証明書) = 認証局の電子署名 + 公開鍵
    • 公開鍵証明書は公開鍵の正当性を証明します。
    • 証明書は公開鍵そのものも含みます。
    • 拡張子(pem)です。

サーバー証明書の種類

  • 自己認証局
  • 公開認証局

公開認証局の証明書ファイル

  1. example.csr(認証局へ提出)
  2. example.cert(認証局から取得する証明書)
  3. example.cert + 中間認証局証明書
  4. example.pem(公開鍵を含む証明書)

自己証明書

OpenSSLで自己証明書を作成できます。

OpenSSLの例(Postedの記事)

http://postd.cc/https-on-nginx-from-zero-to-a-plus-part-1/

ここではCentOS7.1 64bitでOpenSSLを使用して、SSLを使用する際に必要となる秘密鍵と証明書を作成する方法を以下に示します。

$ mkdir /etc/nginx/ssl
$ cd /etc/nginx/ssl
$ openssl req -new -x509 -sha256 -newkey rsa:2048 -days 365 -nodes -out /etc/nginx/ssl/nginx.pem -keyout /etc/nginx/ssl/nginx.key

基本的なSSL3向けのNginxの設定部分も簡単です。以下の設定をnginxファイルに追加します。

.penが公開鍵証明書(ブラウザに渡る)、.keyが秘密鍵(サーバが保持)。

server {

      # [...]

      listen 443 ssl;
      ssl_certificate      /etc/nginx/ssl/nginx.pem;
      ssl_certificate_key  /etc/nginx/ssl/nginx.key;

      # [...]
}

pem 認証ファイル X.509証明書の拡張子 .pemは、Base64で符号化された証明書です。.pem SSL サーバ証明書(連結SSLサーバ証明書)では複数のサーバ証明書を1ファイルに連結させることができ、SSLサーバ証明書のインストール用によく使われます。 .pemファイルを使うサービスによって、必要とされる内容が異なります。.pemファイルに必要な内容については、利用するサービス(アプリケーション)のインストールガイドを参照ください。

https://www.digicert.ne.jp/howto/basis/pem-ssl-creation.html

  • ドメインに対して認証しているときはIPでは確認できません。

http://qiita.com/kunichiko/items/12cbccaadcbf41c72735

certificate 証明書

  1. 秘密鍵作成。
  2. 秘密鍵からCSR作成(CSRは公開鍵を含む)。
  3. CSRに署名を得る。
  4. CER証明書を得る (署名は認証局の署名と自己署名がある)。
  • CSR(Certificate Signing Request) 証明書署名要求。
  • CER(Certificate) 証明書とは「署名付き公開鍵」のこと。
  • CRT(Certificate) CERと同じ。

秘密鍵と公開鍵をまとめたもの

  • pem、der
  • 符号化方式

PKI(Public-Key Infrastructure)は公開鍵暗号※1を利用した認証基盤です。 https://www.nic.ad.jp/ja/newsletter/No23/080.html

http://www.slideshare.net/kenjiurushima/qpstudy-20151114-ssltls?from_m_app=android

RSA

公開鍵認証のための暗号化アルゴリズムです。

HMAC

改竄防止のため使われます。

HMAC (Hash-based Message Authentication Code) とは、メッセージ認証符号 (MAC; Message Authentication Code) の一つであり、秘密鍵とメッセージ(データ)とハッシュ関数をもとに計算される。 Wikipedia

SHA-256

メッセージ認証のための暗号化アルゴリズムです。

AES

共通鍵のための暗号化アルゴリズムです。

Advanced Encryption Standard(AES:高度暗号化標準) はアメリカ合衆国の新暗号規格として規格化された共通鍵暗号方式である。 wiki

SSLの種類

公開鍵の取り扱い

  • 自己認証局
  • 公開認証局

http://d.hatena.ne.jp/kasei_san/touch/20120329/p1

クライアントは、公開鍵証明書をサーバから受けとるクライアントは、公開鍵証明書から、公開鍵を取得。それを使って乱数を暗号化してサーバに送るサーバは、乱数を元にした共通鍵を作って、クライアントに送る共通鍵で通信する通信が終わったら共通鍵を破棄する

こういう、秘密鍵と共通鍵を組み合わせた方法を、ハイブリッド暗号化方式というらしい。

澤井 乱数はクライアントしか知らないないので共通鍵がもれても復号化できない。

Wildcard certificate

  • https://en.wikipedia.org/wiki/Wildcard_certificate

ルートドメイン(例:example.com)に限ってwwwあり・なしの両方に対応するためにWildcard certificateをする必要はない。

例えばwww以外のtext1.example.comtest2.example.comを一括で対応使用する場合は、Wildcard certificateが必要。

参考

ファイル:SSLによるセキュアな通信.jpg - Wikipedia

http://www.kakiro-web.com/linux/ssl.html

ここではCentOS7.1 64bitでOpenSSLを使用して、SSLを使用する際に必要となる秘密鍵と証明書を作成する方法を以下に示します。

初めにSSLの仕組みについて、おおまかにですが説明しておきます。 SSLではクライアント、サーバー間でデータを暗号化して送受信を行う際に、共通鍵暗号化方式を使用します。 共通鍵暗号化方式は、データの暗号化と復号化に同じ鍵が使用されるようになっており、SSLではクライアントとサーバーで同じ鍵を共有することで、暗号化されたデータの送受信が行われるのですが、この鍵を安全にクライアントとサーバーで共有するために、公開鍵暗号化方式が使用されます。 公開鍵暗号化方式は、データの暗号化と復号化に異なる鍵が使用されるようになっており、SSLではサーバーが暗号化用の鍵と復号化用の鍵の組み合わせを作成し、復号化用の鍵は秘密鍵としてサーバーが保持し、暗号化用の鍵は公開鍵としてサーバーからクライアントに送信されます。 この公開鍵を送信する際には、サーバーの正当性を証明するために、認証局が作成した証明書が使用されます。 ここではサーバーを認証局とした、自己署名の証明書を作成します。 公的な認証局で証明書を作成する場合は、その認証局のホームページに秘密鍵と、証明書の作成依頼となるCSRの作成方法が公開されているかと思いますので、そちらをご参照ください。主な流れとしては、ここで紹介しているものと同様かと思います。

公開鍵で暗号化したデータは秘密鍵でしか復号化できない。

サーバに配置

  • 暗号化鍵(秘密鍵、サーバーに保持) example.key
  • 証明書ファイル(公開鍵を含む証明書 ブラウザに渡る)
    example.csr(認証局へ提出) ---> example.cert(認証局から取得する証明書) ---> example.cert + 中間認証局証明書 ---> example.pem

OpenSSLは自己証明書なのでpemファイルも一緒に作成する。

http://postd.cc/https-on-nginx-from-zero-to-a-plus-part-1/ mkdir /etc/nginx/sslcd /etc/nginx/sslopenssl req -new -x509 -sha256 -newkey rsa:2048 -days 365 -nodes -out /etc/nginx/ssl/nginx.pem -keyout /etc/nginx/ssl/nginx.key 基本的なSSL3向けのNginxの設定部分も簡単です。以下の設定をnginxファイルに追加します。 server { # [...] listen 443 ssl; ssl_certificate /etc/nginx/ssl/nginx.pem; ssl_certificate_key /etc/nginx/ssl/nginx.key; # [...]}

pem 認証ファイル> X.509証明書の拡張子 .pemは、Base64で符号化された証明書です。.pem SSL サーバ証明書(連結SSLサーバ証明書)では複数のサーバ証明書を1ファイルに連結させることができ、SSLサーバ証明書のインストール用によく使われます。 .pemファイルを使うサービスによって、必要とされる内容が異なります。.pemファイルに必要な内容については、利用するサービス(アプリケーション)のインストールガイドを参照ください。https://www.digicert.ne.jp/howto/basis/pem-ssl-creation.html http://d.hatena.ne.jp/install-memo/20110906/1315291837 SSL証明書の発行プロセスでは、KEYファイルとCSRファイルを作ることになります。また、証明書会社からはCRTファイルが送られてきます。これらが正しいかどうかをチェックする方法を紹介します。

KEYファイルとは

KEYファイルというのが正式名称だとは思えませんが、ここではSSL通信に利用する公開鍵暗号系の秘密鍵ファイルを指します(おそらく公開鍵情報も含んでいるんだと思いますが、このあたりはよくわかっていません)。

AWSへ導入

AWS EC2へSSLを導入 – FindxFine

用語

  • cipher/crypto どちらも暗号