楽しい楽しいお勉強日記

IT系の勉強や読書記録を書きます。勉強大好き!(自己暗示)

WebサーバをHTTPS化するまでの知識のアウトプットの練習

WebサーバをHTTPS化するまでの流れ

1 HTTPS化したい(SSLを入れたい)サーバで鍵ペア(秘密鍵と公開鍵)とCSRを作成する

公開鍵はCSRの中に含まれている

f:id:NiLkun:20200314010910p:plain

2 CSRと作成した公開鍵を認証局に送る

f:id:NiLkun:20200314010931p:plain

3 認証局秘密鍵CSRに署名する。これがディジタル署名ディジタル署名とサーバの公開鍵と所有者情報を含めたのがディジタル証明書。

f:id:NiLkun:20200314011004p:plain

4 認証局HTTPS化したいサーバに、作成したディジタル証明書を送る。これでHTTPS化したいサーバの準備オッケー

f:id:NiLkun:20200314011023p:plain

5 PCのブラウザからWebサーバにアクセス

f:id:NiLkun:20200314011057p:plain

6 WebサーバからPCにディジタル証明書を送る

f:id:NiLkun:20200314011141p:plain

7.認証局の公開鍵を使ってディジタル署名電子署名を検証する(信頼された認証機関が作ったディジタル証明書かどうかを確認するため)

f:id:NiLkun:20200314011228p:plain

認証局の公開鍵は主要なブラウザにデフォルトで用意されている。 プライベートで立てた認証局の場合は、手動でブラウザに証明書をインストールする必要がある。

8 AES等で共通鍵を作り、サーバの公開鍵で暗号化してWebサーバへ送付

f:id:NiLkun:20200314011319p:plain

9 Webサーバは保管していた秘密鍵で暗号化された共通鍵を取り出す。

f:id:NiLkun:20200314011348p:plain

10 お互いの共通鍵で安全に、高速に通信できる。

f:id:NiLkun:20200314011412p:plain

CSR作成までの流れ

  1. 暗号(RSA [x]bit)で秘密鍵を作成
  2. 秘密鍵から公開鍵を作成
  3. 証明書要求情報をハッシュ関数ハッシュ値化する
  4. ハッシュ値秘密鍵で暗号化する
  5. 暗号化されたハッシュ値と公開鍵を組み合わせてCSRを作成する

f:id:NiLkun:20200314011519p:plain

たくさん暗号があってどの暗号がどういう時に使われるのかあまりよくわかってないので、 SSL/TLS暗号設定ガイドラインを参考に次回まとめます。

参考サイト

SSL/TLS暗号設定ガイドライン メモ 1

SSL/TLS暗号設定ガイドライン(2018年3月時点) まとめ

概要だけ、実際の通信の流れや、ディジタル証明書等の話、使用すべき暗号や設定項目については次回。

SSL/TLSのバージョン概要

  • SSL2.0(1994)

    • 以下の致命的な脆弱性があり、基本的にSSL2.0は使用不可
      • ダウングレード攻撃(最弱のアルゴリズムを強制的に使わせる事ができる)
      • バージョンロールバック攻撃(SSL2.0を強制的に使わせる事ができる)
  • SSL3.0(1995)

    • SSL2.0の脆弱性に対処したバージョン
    • 2014年10月にPOODLE攻撃が発表され、CBCモードの利用は危険。SSL3.0のパディングチェックに起因した問題であり、この攻撃に対する回避策が見つかっていない。
    • 基本的にSSL3.0は使用不可
  • TLS1.0(1999)

    • 約12万サイトでTLS1.0を利用できるのは88%。つまりほとんど使える。
    • BEAST攻撃が発見されるが、セキュリティパッチ提供済み。POODLE攻撃もプロトコル使用上無効
    • 暗号スイートとしてより安全なブロック暗号であるAESとCamelliaが使えるようになる
    • 公開鍵あんごう・署名に楕円曲線暗号が使えるようになる
    • 秘密鍵生成などに擬似乱数関数を採用
    • MACの計算方法をHMACに変更
  • TLS1.1(2006)

    • TLS1.0の強化版。デフォルトでTLS1.0で発見されたBEAST攻撃を無効
    • 後述するTLS1.2と同時に実装されている。
  • TLS1.2(2008)

    • 暗号スイートとしてより安全なハッシュ関数SHA-256とSHA-384が使える
    • CBCモードより安全な認証付き秘匿モードであるGCMとCCMが使えるようになる
    • 必須の暗号スイートをTLS_RSA_WITH_AES_128_CBC_SHA
    • IDEAとDESを使う暗号スイートを削除
    • 擬似乱数関数の構成をMD5/SHA1ベースからSHA-256ベースに変更
    • 約12万サイト中約91%使われている
  • TLS1.3(規格化中?)

    • 共通鍵暗号は認証暗号のみ。AES-GCM必須
    • 鍵交換はECDHE必須
    • 署名はECDSA必須
    • ハッシュ関数はSHA-256必須
    • 楕円曲線はsecp256r1必須
    • ハンドシェイク性能向上
    • ハンドシェイクをServer HELOから暗号化
    • まだまだこれから

SSL/TLS概要

  • セッション層のセキュアプロトコル
  • 実装目的
    • 通信の暗号化、データ完全性確保、通信相手の認証
  • HTTP、SMTP、POPなどに使われている。

暗号通信手順

  1. ハンドシェイク
    1. ブラウザ(クライアント)とサーバが暗号通信するために利用する暗号アルゴリズみとプロトコルバージョンを決定
    2. サーバ証明書によるサーバの認証
    3. そのセッションで利用するセッション鍵を共有する

暗号通信における安全性強度は、ハンドシェイクの処理で使われる暗号アルゴリズムプロトコルバージョンに依存する

f:id:NiLkun:20200312215226p:plain
SSL/TLS暗号設定ガイドライン 図1 

CRYPTREC暗号リスト

  • 総務省経産省が、暗号技術に関する有識者で構成されるCRYPTREC活動を通して、電子政府で利用される暗号技術の評価を行っている
  • 2013年3月に「電子政府における調達のために参照すべき暗号のリスト(CRYPTREC暗号リスト)」を策定した。以下3つのリストで構成される。政府機関の情報セキュリティ対策では「電子政府推奨暗号リスト」が使用される。
    • 電子政府推奨暗号リスト
    • 推奨候補暗号リスト
    • 運用監視暗号リスト

異なる暗号アルゴリズムにおける安全性の見方

  • 異なる技術分類の暗号アルゴリズムを組み合わせて利用する場合、安全性が低いものを使ったら低いレベルの暗号になるので気をつけてね
  • 異なる技術分類の暗号アルゴリズムについて同じくらいの安全性を持つかどうかを判断する目安をビット安全性という。
  • ビット安全性は、暗号アルゴリズムに対する効率的な攻撃で、解読に必要な計算量で表現される。
  • “2x”は、xビット安全性と呼ばれる。
  • 計算量が大きいほど安全性が高い。小さければ安全性が低い。

暗号アルゴリズムの見方・読み方

  • AES-xxx : 鍵長がxxxビットのAESのこと
  • Camellia-xxx : 鍵長がxxxビットのCamelliaのこと
  • RSA-xxx : 鍵長がxxxビットのRSAのこと
  • DH-xxx :
  • ECDH-xxx :
  • ECDSA-xxx :
  • HMAC- SHA-xxx : メッセージ認証子を作るHMACにおてい利用するハッシュ関数SHA-xxxのこと。SSL/TLSでは、暗号スイートで決めるハッシュ関数はHMACとして利用される
  • SHA-xxx :

SC試験勉強メモ 20200311

令和元年秋季 午後1問1関連

 

DNSサーバへのメールサーバ登録

  取得したインターネットドメイン名n-sha.co.jpを使用してメールサーバホスト名mail.n-sha.co.jpをメールドメイン名として登録する。

メールドメイン名とグローバルIPアドレスの紐付け設定↓

  • n-sha.co.jp.             IN MX    10    mail.n-sha.co.jp.
  • mail.n-sha.co.jp.    IN A                x1.y1.z1.1  

 

SMTP Header-FROM Enverope-FROM

SMTPには以下2種類のメールアドレスがある

  • Header-FROM

  • Envelope-FROM

    • 基本的なメーラーには表示されない。メールサーバーやMTA間でSMTPプロトコルによって、Envelope-FROMからEnvelope-TOに送られる。
    • 手紙が入った封筒に書いてある差出人のイメージ
    • メール送信失敗した際の通知メールはこのEnvelope-FROMに記載されたアドレスに送られる

3 エンベロープ(envelope)From/To とヘッダーのFrom/To

SPF使用時のDNSへの登録設定

送信ドメイン認証技術 SPF

ドメイン名n-sha.co.jpにメール受信サーバで検証するメールドメイン名に紐づくIPアドレス x1.y1.z1.1を登録

  • n-sha.co.jp. IN TXT "v=spf1 + ip4: x1.y1.z1.1 -all"
    • 'IN TXT' TXTレコード=ドメインに関連するテキスト情報を記載するレコード
    • 'v=spf1' SPFのバージョン1で
    • 'ip4:' IPv4アドレスで
    • '-all'は設定以外のアドレスは当該ドメインとして認証しない(ホワイトリスト的な)

SPFレコード -allと~allの違い

送信側サーバ、受信側サーバが共にSPFを導入している際に認証失敗する例

例:SPF対応の中間メールサーバがEnvelope-FROMを変えずにメール転送した

受信側メールサーバは送られてきたメールのEnvelope-FROMに指定されている元の送信側DNSサーバに認証を問い合わせるが、問い合わせを受けたDNSサーバは中間メールサーバの情報は未登録なので認証が失敗する。

DKIM

鍵認証、電子署名を利用

  1. 秘密鍵でメールヘッダと本文を基にディジタル署名を作成して送るメール(のDKIM-Signatureヘッダ)に付与
  2. 受信側メールサーバが(DKIM-Signatureのdタグに指定された)ディジタル署名ドメイン名を基に送信元側のDNSサーバに公開鍵を要求
  3. 送信元側のDNSサーバは登録されている公開鍵を送信
  4. 受信した公開鍵を用いてディジタル署名を検証する
  5. メール送信元の正当性、及びメールヘッダと本文の完全性の検証が可能

DMARC

  • SPF,DKIMで検証したメールの取り扱いのルールを設定する方法。
  • pタグ(必須) : 受信側で届いたメールの取り扱いルールを送信側で設定する
    • none : 何もしない
    • quarantine : 検証に失敗したメールの隔離
    • reject : 検証に失敗したメールは拒否
  • aspfタグ(任意) : SPF認証の調整パラメタ
    • r : Header-FROMとEnvelope-FROMのドメイン名の組織ドメインが一致していれば認証に成功
    • s : FQDNが一致していれば認証成功
  • adkimタグ(任意) : DKIM認証の調整パラメタ
    • r : DKIM-SignatureヘッダのdタグとHeader-FROMのドメイン名の組織ドメインが一致していれば認証成功
    • s : FQDNが一致していれば認証成功
  • ruaタグ(任意) : DMARCの集計レポートの送信先

DMARCについて

Python学習サイト PyQをやってみた

プログラミング初心者が公式チュートリアル見ても分かるわけねぇだろ!

 

最近公式チュートリアルだけだと限界を感じてきたので、

オンラインでPythonに特化した学習サイトの「PyQ」をやってみました。

 

PyQ - 本気でプログラミングを学びたい人のPythonオンライン学習サービス

 

目次

 

 

レベルに合わせたコースがたくさんある

めっちゃいっぱいあります。

「Webアプリ・API」「スクレイピング」「数学・アルゴリズム」「機械学習」「データ分析」「統計分析」とかとか。

簡単なHTML CSSや、SQLについてもあります。もちろんPythonに関連した内容です。

 

僕は一番初心者用の「未経験からのPython文法」をやってみました。

↓こんな感じ

f:id:NiLkun:20190807194424p:plain

 

 

↓目安ですがこんな感じに草を生やすこともできます。

f:id:NiLkun:20190807194614p:plain

 

継続しやすかった

学習方法は、最初に写経、次に演習って感じです。

例を写しながら使い方を覚えて演習で確認って感じです。

 

完全に理解出来ていなくてもコードを写しながらサクサク進めるので、達成感を得やすく継続しやすかったです。

 

3日坊主の自分でも楽しくて9日連続ログインしてました。

おかげで2週間で443個のクエストを大体40時間くらいで終わらせることが出来ましたヾ(・ω・o) 

 

 

1周では練習量が足りない

じゃあ1周してプログラミング未経験がスラスラコードをかけるようになるかっていうと無理だと思います。他言語経験者ならワンチャン?

 

僕は1周した後にpaizaのスキルチェックとかyukicoderの初心者問題とかやってみましたが、悩んで悩んでやっと数問解答出来た程度でした。

 

ただクラス等含めて基本的な文法が理解できるようになったので、コードを見てどんな動きをしてるのかは分かるようになってきた気がします。

 

1周した成果としては、ググりながらならのコーディングが出来るようになったって感じでしょうか。

 

 

写経でデキるプログラマー感が味わえて好き

写経がやっぱりいいと思います。

 

もちろん意味や動きを考えながら写経するわけですが、

スラスラ書いてると...こう...「俺もプログラミングしてる!!!うおーーー!!」って感じが味わえて好きです。

 

次は初心所用のコース2周目をやってみようかな、それとも背伸びして違うコースをやってみようかな。^^

 

 

 

 

↓スタバ

f:id:NiLkun:20190807201726p:plain

 

パコチュー 6.1.1. モジュールをスクリプトとして実行する

Python公式チュートリアル、略してパコチュー

 

docs.python.org

 

6.1.1. モジュールをスクリプトとして実行する

前回を思い出せ...!

モジュールは関数とか定義している.pyファイルの事。

そのモジュールを(importも出来るけど)スクリプトで使えるようにするにはどうすればいいのかって話。

それにはファイルの末尾に下の魔法のおまじないを書いてあげればOK!(おい)

if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))

__name__は実行するモジュール名

"__main__"はコマンドから実行する時の名前

github.com

 

例えばターミナルやコマンドプロンプトでfibo.pyってファイル(モジュール)の関数を使いたいとする。

呼び出すためには下のコマンドを打つ。

python fibo.py <引数>

ここの「fibo.py」って名前が、"__main__"に入るんだね!!!

さっきのおまじないを自分なりに訳すと、

「実行するファイル(モジュール)名と、コマンドから実行した名前が一緒ならスクリプトからでも起動してやるよ!」

って条件をつけてくれるおまじないだったのね!(多分)

 

コード追加例はこんな感じ

f:id:NiLkun:20190716221619p:plain

 

ここら辺前まで読んでも全く意味が分からなかったから、

何となくでも分かってきて嬉しいな。

 

 

 

 

 

 

 ........

関係ないんですけど昨日映画館で実写版のアラジンを見てきました。

実写版リメイクって微妙ってイメージが強かったんだけど、そこはさすがディズニー。

ミュージカルものとウィルスミスが好きな人はおすすめですぞ〜♫

 

パコチューを読んでいる 6.モジュール編 Python公式チュートリアル

 

たわ言

Pythonの公式チュートリアル、略してパコチュー(流行れ)

 

にるです。

前から思ってたんだけど公式ドキュメント横文字多すぎて初学者だと意味分からなくない?訳してあるから仕方ないんだけど。

Rubyみたいに日本人が作った言語なら分かりやすそうな解説いっぱいありそうだな...。

  

6. モジュール

今回はモジュールってやつを読みました!

ここを自分なりに理解したら今までのモヤモヤが晴れた感じしました!

docs.python.org

モジュールってのは関数とか定義してある.pyファイルって事なのね。

(モジュール=ファイルって事でいいのかな)

もっと言うとimportして別ファイルから呼び出せるファイルのことだったのね。

 

defでfibとfib2って関数が定義されてるfibo.pyってファイルがある。

ここでimport fiboってやればfibとfib2を使えるようになると、ふむふむ。

 

fibo.py↓ 関数fibとfib2を定義してる。

# Fibonacci numbers module

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result
>>>
import fibo

 

importでfiboファイルを呼び出す。↓

>>>マークはターミナルやコマンドプロンプトpythonモードに入ったときの証(インタプリタ?)

>>> import fibo

 

↓fibo.fib(1000)は、ファイル名.関数名(引数)。

importしてればこうやって自分で作った違うファイルに入れた関数を呼び出して使う事が出来るよってこと。

>>> fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

fibo.__name__???

__name__っていうpython標準の関数(組み込み関数)かな??

返り値を見るとファイル名を返してるっぽい。

 

 

↓またいちいちファイル名.関数名(引数)ってするのめんどくさければ、変数に代入して使うことも出来るよ

>>> fib = fibo.fib
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

 

 

 

 

6.1. 別のインポートのやり方

さっきimport ファイル名で持ってこれるってやったんだけど、

このやり方だと使うときは必ずファイル名.関数名(引数)って具合に関数名も明示しないといけないのね。

初めからこのファイルのこの関数使う!!!って分かってる時は↓で指定して読み込めるみたいよ。

>>> from fibo import fib, fib2
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

from ファイル名 import 関数名って感じ。↑

 

 

ファイル内の関数とかを全部読み込んどくならこれ↓

from ファイル名 import *←アスタリスク

>>> from fibo import *
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

↑このやり方は可読性が乏しいコードになるからやめた方がいいらしいよ。

(解説読んでたら「モジュールで定義されている名前を全て import する」って表記があって、importするのはひょっとして関数だけじゃないのか?って思ったり...)

 

 

あとは関数名を自分の使いやすいように変えられる方法もあります。↓

from ファイル名 import 関数名 as 好きな名前をどうぞ←下の例だとfibonacci

>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

 

おしまい!

 

次回はif __name__ == "__main__"を頑張るぞ!

 

(公式チュートリアルフィボナッチ数列が題材にされてるんだけど見る度にプリズンブレイクを思い出す...。わかる人いる??)

 

 

 

 

 

Python公式チュートリアルを頑張って読んでいる 5.データ構造

色々とPythonの初心者用の本やサイトを見て学ぼうとしても「タプル」とか「リスト」とかの横文字が入ると解説の意味が分からなくなってたぐらい頭弱いんだけど...

最近ようやくコードと解説を見て理解出来るようになってきたのでプログラミングが楽しくなってきました(^_^)

とりあえずは会社の業務を効率化させられたらなぁって目標です。

 

 

以下自分用の備忘録です。(ノートにでも書いとけとか言わないでw)

 

 5.データ構造

docs.python.org

 

list.append(x)

このlistが関数で、

appendがメソッドって言われるやつで、

xが引数。

 

一つの関数に複数のメソッドがある。

listなら他にも

  • list.extend(iterable)
  • list.insert(i, x)
  • list.remove(x)

とか色々ある。

関数に「これやれ!」って指示するのがメソッドかな?

引数がその対象になるみたいなイメージ。

 

 

5.1.1 リストをスタックとして使う

docs.python.org

スタック(last-in, first-out)で使うなら

stack = [3, 4, 5]

stack.append(6)とか

stack.pop()でOK。

 

5.1.2 リストをキューとして使う

docs.python.org

キュー(first-in, first-out)の場合は要素を最初とか途中に入れる場合、

appendやpopはリストの末尾から遡るので遅くなる(?)からcollections.dequeを使うと良いらしい。多分popleftメソッドがあるからだと思う。

 

>>> from collections import deque

>>> queue = deque(["Eric", "John", "Michael"])

>>> queue.append("Terry")           # Terry arrives

>>> queue.append("Graham")          # Graham arrives

>>> queue.popleft()                 # The first to arrive now leaves

'Eric'

>>> queue.popleft()                 # The second to arrive now leaves

'John'

>>> queue                           # Remaining queue in order of arrival

deque(['Michael', 'Terry', 'Graham'])

 

 

5.1.3 リストの内包表記

docs.python.org

リストの書き方って色々あるなぁって話

>>> squares =

>>> for x in range(10):

...     squares.append(x**2)

...

>>> squares

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

 

こうも書ける↓ 

squares = list(map(lambda x: x**2, range(10)))

 

こうも書ける↓

squares = [x**2 for x in range(10)]

 

 

xとyが違う値の要素を抜き出す↓

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

 

これと一緒↓

>>>combs =

>>>for x in [1, 2, 3]:

           for y in [3, 1, 4]:

               if x != y:

                   combs.append*1

 

 

 

5.1.4 ネストしたリストの内包表記

docs.python.org

>>> matrix = [

...     [1, 2, 3, 4],

...     [5, 6, 7, 8],

...     [9, 10, 11, 12],

... ]

このmatrixの行と列を入れ替える。↓

>>>[[row[i] for row in matrix] for i in range(4)]

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

 

iは0~3まで繰り返す。

for row in matrixで、最初は[1, 2, 3, 4]を持ってきて、

row[i]だから、最初はrow[0]、つまり[1, 2, 3, 4]の0番目の要素、1を取り出す。

次は[5, 6, 7, 8]の0番めの要素、5を取り出す。次は[9, 10, 11, 12]の0番目の9を取り出す。

iが0の時に取り出した要素が[1, 5, 9]、これをiが3になるまで繰り返す。

 

 

 

5.4 集合型

pythonは集合を使える。和集合とか。set関数を使う。

docs.python.org

 

 

 

 

 

 

 

 

*1:x, y