WebサーバをHTTPS化するまでの知識のアウトプットの練習
WebサーバをHTTPS化するまでの流れ
1 HTTPS化したい(SSLを入れたい)サーバで鍵ペア(秘密鍵と公開鍵)とCSRを作成する
公開鍵はCSRの中に含まれている
3 認証局の秘密鍵でCSRに署名する。これがディジタル署名。ディジタル署名とサーバの公開鍵と所有者情報を含めたのがディジタル証明書。
4 認証局がHTTPS化したいサーバに、作成したディジタル証明書を送る。これでHTTPS化したいサーバの準備オッケー
5 PCのブラウザからWebサーバにアクセス
6 WebサーバからPCにディジタル証明書を送る
7.認証局の公開鍵を使ってディジタル署名の電子署名を検証する(信頼された認証機関が作ったディジタル証明書かどうかを確認するため)
認証局の公開鍵は主要なブラウザにデフォルトで用意されている。 プライベートで立てた認証局の場合は、手動でブラウザに証明書をインストールする必要がある。
8 AES等で共通鍵を作り、サーバの公開鍵で暗号化してWebサーバへ送付
9 Webサーバは保管していた秘密鍵で暗号化された共通鍵を取り出す。
10 お互いの共通鍵で安全に、高速に通信できる。
CSR作成までの流れ
- 暗号(RSA [x]bit)で秘密鍵を作成
- 秘密鍵から公開鍵を作成
- 証明書要求情報をハッシュ関数でハッシュ値化する
- ハッシュ値を秘密鍵で暗号化する
- 暗号化されたハッシュ値と公開鍵を組み合わせてCSRを作成する
たくさん暗号があってどの暗号がどういう時に使われるのかあまりよくわかってないので、 SSL/TLS暗号設定ガイドラインを参考に次回まとめます。
参考サイト
SSL/TLS暗号設定ガイドライン メモ 1
SSL/TLS暗号設定ガイドライン(2018年3月時点) まとめ
概要だけ、実際の通信の流れや、ディジタル証明書等の話、使用すべき暗号や設定項目については次回。
SSL/TLSのバージョン概要
SSL2.0(1994)
SSL3.0(1995)
TLS1.0(1999)
TLS1.1(2006)
- TLS1.0の強化版。デフォルトでTLS1.0で発見されたBEAST攻撃を無効
- 後述するTLS1.2と同時に実装されている。
TLS1.2(2008)
TLS1.3(規格化中?)
SSL/TLS概要
暗号通信手順
- ハンドシェイク
暗号通信における安全性強度は、ハンドシェイクの処理で使われる暗号アルゴリズムとプロトコルバージョンに依存する
CRYPTREC暗号リスト
- 総務省と経産省が、暗号技術に関する有識者で構成されるCRYPTREC活動を通して、電子政府で利用される暗号技術の評価を行っている
- 2013年3月に「電子政府における調達のために参照すべき暗号のリスト(CRYPTREC暗号リスト)」を策定した。以下3つのリストで構成される。政府機関の情報セキュリティ対策では「電子政府推奨暗号リスト」が使用される。
- 電子政府推奨暗号リスト
- 推奨候補暗号リスト
- 運用監視暗号リスト
異なる暗号アルゴリズムにおける安全性の見方
- 異なる技術分類の暗号アルゴリズムを組み合わせて利用する場合、安全性が低いものを使ったら低いレベルの暗号になるので気をつけてね
- 異なる技術分類の暗号アルゴリズムについて同じくらいの安全性を持つかどうかを判断する目安をビット安全性という。
- ビット安全性は、暗号アルゴリズムに対する効率的な攻撃で、解読に必要な計算量で表現される。
- “2x”は、xビット安全性と呼ばれる。
- 計算量が大きいほど安全性が高い。小さければ安全性が低い。
暗号アルゴリズムの見方・読み方
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
3 エンベロープ(envelope)From/To とヘッダーのFrom/To
SPF使用時のDNSへの登録設定
ドメイン名n-sha.co.jpにメール受信サーバで検証するメールドメイン名に紐づくIPアドレス x1.y1.z1.1を登録
- n-sha.co.jp. IN TXT "v=spf1 + ip4: x1.y1.z1.1 -all"
送信側サーバ、受信側サーバが共にSPFを導入している際に認証失敗する例
例:SPF対応の中間メールサーバがEnvelope-FROMを変えずにメール転送した
受信側メールサーバは送られてきたメールのEnvelope-FROMに指定されている元の送信側DNSサーバに認証を問い合わせるが、問い合わせを受けたDNSサーバは中間メールサーバの情報は未登録なので認証が失敗する。
DKIM
鍵認証、電子署名を利用
- 秘密鍵でメールヘッダと本文を基にディジタル署名を作成して送るメール(のDKIM-Signatureヘッダ)に付与
- 受信側メールサーバが(DKIM-Signatureのdタグに指定された)ディジタル署名のドメイン名を基に送信元側のDNSサーバに公開鍵を要求
- 送信元側のDNSサーバは登録されている公開鍵を送信
- 受信した公開鍵を用いてディジタル署名を検証する
- メール送信元の正当性、及びメールヘッダと本文の完全性の検証が可能
DMARC
Python学習サイト PyQをやってみた
プログラミング初心者が公式チュートリアル見ても分かるわけねぇだろ!
最近公式チュートリアルだけだと限界を感じてきたので、
オンラインでPythonに特化した学習サイトの「PyQ」をやってみました。
PyQ - 本気でプログラミングを学びたい人のPythonオンライン学習サービス
目次
レベルに合わせたコースがたくさんある
めっちゃいっぱいあります。
「Webアプリ・API」「スクレイピング」「数学・アルゴリズム」「機械学習」「データ分析」「統計分析」とかとか。
簡単なHTML CSSや、SQLについてもあります。もちろんPythonに関連した内容です。
僕は一番初心者用の「未経験からのPython文法」をやってみました。
↓こんな感じ
↓目安ですがこんな感じに草を生やすこともできます。
継続しやすかった
学習方法は、最初に写経、次に演習って感じです。
例を写しながら使い方を覚えて演習で確認って感じです。
完全に理解出来ていなくてもコードを写しながらサクサク進めるので、達成感を得やすく継続しやすかったです。
3日坊主の自分でも楽しくて9日連続ログインしてました。
おかげで2週間で443個のクエストを大体40時間くらいで終わらせることが出来ましたヾ(・ω・o)
1周では練習量が足りない
じゃあ1周してプログラミング未経験がスラスラコードをかけるようになるかっていうと無理だと思います。他言語経験者ならワンチャン?
僕は1周した後にpaizaのスキルチェックとかyukicoderの初心者問題とかやってみましたが、悩んで悩んでやっと数問解答出来た程度でした。
ただクラス等含めて基本的な文法が理解できるようになったので、コードを見てどんな動きをしてるのかは分かるようになってきた気がします。
1周した成果としては、ググりながらならのコーディングが出来るようになったって感じでしょうか。
写経でデキるプログラマー感が味わえて好き
写経がやっぱりいいと思います。
もちろん意味や動きを考えながら写経するわけですが、
スラスラ書いてると...こう...「俺もプログラミングしてる!!!うおーーー!!」って感じが味わえて好きです。
次は初心所用のコース2周目をやってみようかな、それとも背伸びして違うコースをやってみようかな。^^
↓スタバ
パコチュー 6.1.1. モジュールをスクリプトとして実行する
6.1.1. モジュールをスクリプトとして実行する
前回を思い出せ...!
モジュールは関数とか定義している.pyファイルの事。
そのモジュールを(importも出来るけど)スクリプトで使えるようにするにはどうすればいいのかって話。
それにはファイルの末尾に下の魔法のおまじないを書いてあげればOK!(おい)
__name__は実行するモジュール名
"__main__"はコマンドから実行する時の名前
例えばターミナルやコマンドプロンプトでfibo.pyってファイル(モジュール)の関数を使いたいとする。
呼び出すためには下のコマンドを打つ。
ここの「fibo.py」って名前が、"__main__"に入るんだね!!!
さっきのおまじないを自分なりに訳すと、
「実行するファイル(モジュール)名と、コマンドから実行した名前が一緒ならスクリプトからでも起動してやるよ!」
って条件をつけてくれるおまじないだったのね!(多分)
コード追加例はこんな感じ
ここら辺前まで読んでも全く意味が分からなかったから、
何となくでも分かってきて嬉しいな。
........
関係ないんですけど昨日映画館で実写版のアラジンを見てきました。
実写版リメイクって微妙ってイメージが強かったんだけど、そこはさすがディズニー。
ミュージカルものとウィルスミスが好きな人はおすすめですぞ〜♫
パコチューを読んでいる 6.モジュール編 Python公式チュートリアル
たわ言
Pythonの公式チュートリアル、略してパコチュー(流行れ)
にるです。
前から思ってたんだけど公式ドキュメント横文字多すぎて初学者だと意味分からなくない?訳してあるから仕方ないんだけど。
Rubyみたいに日本人が作った言語なら分かりやすそうな解説いっぱいありそうだな...。
6. モジュール
今回はモジュールってやつを読みました!
ここを自分なりに理解したら今までのモヤモヤが晴れた感じしました!
モジュールってのは関数とか定義してある.pyファイルって事なのね。
(モジュール=ファイルって事でいいのかな)
もっと言うとimportして別ファイルから呼び出せるファイルのことだったのね。
defでfibとfib2って関数が定義されてるfibo.pyってファイルがある。
ここでimport fiboってやればfibとfib2を使えるようになると、ふむふむ。
fibo.py↓ 関数fibとfib2を定義してる。
importでfiboファイルを呼び出す。↓
>>>マークはターミナルやコマンドプロンプトでpythonモードに入ったときの証(インタプリタ?)
↓fibo.fib(1000)は、ファイル名.関数名(引数)。
importしてればこうやって自分で作った違うファイルに入れた関数を呼び出して使う事が出来るよってこと。
fibo.__name__???
__name__っていうpython標準の関数(組み込み関数)かな??
返り値を見るとファイル名を返してるっぽい。
↓またいちいちファイル名.関数名(引数)ってするのめんどくさければ、変数に代入して使うことも出来るよ
6.1. 別のインポートのやり方
さっきimport ファイル名で持ってこれるってやったんだけど、
このやり方だと使うときは必ずファイル名.関数名(引数)って具合に関数名も明示しないといけないのね。
初めからこのファイルのこの関数使う!!!って分かってる時は↓で指定して読み込めるみたいよ。
from ファイル名 import 関数名って感じ。↑
ファイル内の関数とかを全部読み込んどくならこれ↓
from ファイル名 import *←アスタリスク
↑このやり方は可読性が乏しいコードになるからやめた方がいいらしいよ。
(解説読んでたら「モジュールで定義されている名前を全て import する」って表記があって、importするのはひょっとして関数だけじゃないのか?って思ったり...)
あとは関数名を自分の使いやすいように変えられる方法もあります。↓
from ファイル名 import 関数名 as 好きな名前をどうぞ←下の例だとfibonacci
おしまい!
次回はif __name__ == "__main__"を頑張るぞ!
(公式チュートリアルでフィボナッチ数列が題材にされてるんだけど見る度にプリズンブレイクを思い出す...。わかる人いる??)
Python公式チュートリアルを頑張って読んでいる 5.データ構造
色々とPythonの初心者用の本やサイトを見て学ぼうとしても「タプル」とか「リスト」とかの横文字が入ると解説の意味が分からなくなってたぐらい頭弱いんだけど...
最近ようやくコードと解説を見て理解出来るようになってきたのでプログラミングが楽しくなってきました(^_^)
とりあえずは会社の業務を効率化させられたらなぁって目標です。
以下自分用の備忘録です。(ノートにでも書いとけとか言わないでw)
5.データ構造
list.append(x)
このlistが関数で、
appendがメソッドって言われるやつで、
xが引数。
一つの関数に複数のメソッドがある。
listなら他にも
- list.extend(iterable)
- list.insert(i, x)
- list.remove(x)
とか色々ある。
関数に「これやれ!」って指示するのがメソッドかな?
引数がその対象になるみたいなイメージ。
5.1.1 リストをスタックとして使う
スタック(last-in, first-out)で使うなら
stack = [3, 4, 5]
stack.append(6)とか
stack.pop()でOK。
5.1.2 リストをキューとして使う
キュー(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 リストの内包表記
リストの書き方って色々あるなぁって話
>>> 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 ネストしたリストの内包表記
>>> 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関数を使う。
*1:x, y