Javaソースコードが実行されるまでの流れについて調べた

Javaでいうコンパイルという動作は、C言語Rubyのそれと、どのように違うのか調べた。

 

Javaソースコードコンパイル

OSやハードウェア依存のJavaプラットフォームで、ソースコードコンパイルと実行が行われる。コンパイルされたJavaソースコードバイトコード(中間言語)で書かれたJavaのプログラムに翻訳される。このプログラムは、全てのJavaプラットフォーム環境で同一に動く。Javaプラットフォームは、大きく分けて実行環境および開発環境を含む。

Javaプラットフォームは様々なプログラムから構成される。実行に必要な仮想マシン、開発に必要な標準ライブラリセット、コンパイラ等を梱包する。これらを個々のマシンのOSやハードウェアにあわせて構築することを「Javaプラットフォームを構築する」という。これにより、バイトコード(中間言語)で書かれたJavaプログラムが、全てのJavaプラットフォーム環境で同じ動作をするようになっている。これをプラットフォーム非依存といい、Javaの目標の一つとなっている。Javaの思想が生まれる以前の、多くのプログラミング言語は、プラットフォーム(CPU)に依存したネイティブなコードにコンパイルすることを前提として、設計されていた。

 

Javaソースコードが、コンパイルされて、実行されるまでの流れ

  1. Javaコンパイラが、Javaソースコードを、Javaバイトコードに翻訳する。
  2. JavaバイトコードJREで実行すると、実行直前にJITコンパイラ(Just In Timeコンパイラ)が、Javaバイトコードを対象CPUの機械語(ネイティブなプロセッサ命令)に翻訳する。
  3. JITコンパイラJava仮想マシン上で動く。プログラム実行中はメモリ上にネイティブコードをキャッシュする。

また、多くのJavaバイトコードJava仮想計算機規定(The Java Virtual Machine Specification)が規定する形式に準拠する。

Java SE Specifications

 

 C言語コンパイル

OSやハードウェア依存の実行環境を構築する。

Cコンパイラで、C言語で書かれたソースコードを、アセンブリソースに翻訳する。アセンブリソースに書かれているのは、mov(move=データをコピー)やadd(addition=加算)などのニーモニックである。

ニーモニックマシン語の個々の数値が表す命令に、英単語を短くしたようなニックネームを付けたものを指す。

データの入出力を行うニーモニック命令

ニーモニック 意味 機能
LD LoaD メモリーからCPUへデータを読み込む
ST STore CPUからメモリーにデータを書き出す
LAD Load ADdress CPUのレジスタに値を設定する
PUSH PUSH スタックにデータを書き出す
POP POP スタックからデータを読み込む
SVC SuperVisor Call I/Oとの入出力を行う

 

引用( 1週間で学ぶIT基礎の基礎 - 【5分で覚えるIT基礎の基礎】だれでも一度はアセンブラを学んでおこう! 第2回:ITpro )

 

アセンブラが、アセンブリ言語で書かれたアセンブリソースを機械語プログラムに翻訳する。

f:id:bambinya:20150415222213g:plain

機械語は16進数の数値の羅列で構成された、コンピューターのCPUで直接実行される一連の命令。

 

 

Rubyコンパイル

Rubyの処理系はインタプリタの実装が多いため、インタプリタ言語と呼ばれることがあるが、言語がインタプリタ言語かコンパイル言語かという定義は排他的にひとつに決まるものではない。実装による。また、MRI1.9以降の実装はコンパイラを持つ。

1行ずつ解釈しても、コンパイラがクラスやモジュールごとにバイトコードに翻訳して実行しても、最終的にはCPUが実行しているのは機械語である。

Rubyの公式な実装には以下の2つがある。

  • MRI(Matz' Ruby Implementation): C言語で実装されたRubyの公式処理系。
  • YARV (Yet Another Ruby VM) : 笹田耕一氏が開発するRuby言語処理系。2007年12月25日にYARVが正式に組み込まれたMRI1.9がリリースされた。

1.8系まではソースコードを抽象構文木(AST: Abstract Syntax Tree)に変換し、そのツリー構造をたどりながら処理を実行していた。1.9系では 、ASTに変換し、さらにそれをコンパイラバイトコード(数字列)に翻訳してから、仮想マシン上で実行している。

正直、これだけだとRubyが具体的にどのように実行されるのか分からなかったので、本を読むことにした。

www.amazon.co.jp

 

外国人が書いたものを、日本語に訳しているのが少し切ないけど、(国産の言語だから)まつもとさんとささださんの付録があるから、きっと公認ではあるのでしょう:)

 

ネットワーク機器とIPアドレス、ポート番号について調べた

ネットワークを構築するネットワーク機器

有線用機器

ルーター/L3スイッチ: IPアドレスを使って、データの配送先を制御する。インターネットなど、外部のネットワークと接続。

L2スイッチ(スイッチングハブ): MACアドレスを使って、データの配送先を制御する。パソコン同士、ネットワークプリンタなどの1対1での通信をLANで行う。端末が多い時はL2スイッチ同士を接続できる。これをカスケード接続と呼ぶ。

ハブ(リピータハブ): 宛先に関係なく、端末から届いたデータをLAN内全ての端末に配信する。データを受け取った端末は送られたデータが自分宛てでなければ、そのデータを破棄する。電気信号の増幅機能も持つ。現在はほとんど使われない。

リピータ: 電気信号を増幅し、全ての端末に流す。電気信号の衝突(コリジョン)が発生し、電気信号の波形が崩れ、通信フレームが破壊される現象が多発する。

ケーブル: 電気信号で通信データを伝達する。

有線用NIC(Network Interface Card): LANの接続口、別名がいろいろ。LANカード、LANボード、LANアダプタ、ネットワークカード…

 

無線用機器

アクセスポイント(Wireless LAN access point): 無線端末を相互に接続したり、他のネットワーク(有線LAN)に接続する。有線LANと無線LANを相互接続役割もあるため、無線ブリッジとも呼ばれる。無線LANルーターと呼ばれる製品は、ルーターとアクセスポイントの複合製品。

無線用NIC: 電波の送受信ができる。

 

MACアドレスIPアドレス

MACアドレス: NICごとに割り当てられた固有のID。OSI参照モデルの第2層データリンク層通信制御(送信先、宛先の指定)に使われる。48bitの数値を":"や"-"で区切って16進数で表記される。前半の24bitはベンダーIDまたはメーカー番号と呼ばれ、後半24bitは端末固有の番号となる。

IPアドレス: ネットワーク上の固有の端末を、ネットワークアドレスとホスト番号で識別するためのアドレス情報。OSI参照モデルの第3層ネットワーク層通信制御に使われる。32bitのデータを8bitずつ"."で区切り、10進数で表記する。ネットワーク部とホスト部に分かれており、サブネットマスクを2進数に直して、1が続く上位桁がネットワーク部となり、0が続く下位桁がホスト部となる。

インターネットを利用するにはIPアドレスサブネットマスクデフォルトゲートウェイDNSサーバーアドレスの設定が必要となる。手動で設定する方法と、DHCPを使って自動でIPアドレスを割り当てる方法がある。

 

IPアドレスはなぜクラス分けされているか

IPv4のアドレスは約43億個あり、その中の約5億個は特定の用途に用いることが決まっていて、グローバルアドレスとして使用できない。IPアドレスは利用者を想定して、次の5つのアドレスクラスに分かれている。()内には2進表記にしたときの先頭が何で始まるかが書かれている。

クラスA 0.0.0.0 - 127.255.255.255 ネットワークアドレス部は8ビット。RFC 791で規定。(0-で始まる)

クラスB 128.0.0.0 - 191.255.255.255 ネットワークアドレス部は16ビット。RFC 791で規定。(10-で始まる)

クラスC 192.0.0.0 - 223.255.255.255 ネットワークアドレス部は24ビット。RFC 791で規定。(110-で始まる)

クラスD 224.0.0.0 - 239.255.255.255 IPマルチキャスト専用。RFC 1112で規定。(1110-で始まる)

クラスE 240.0.0.0 - 255.255.255.255 将来の使用のために予約されている。RFC 1112で規定。(1111-で始まる)

クラスAはネットワーク部が短く、ホスト部が長いため、多くの端末を保有する大組織や多くの顧客を持つインターネットサービスプロバイダに割り当てるのに適している。クラスCはその逆。実際は、ほとんどのネットワークがクラスAでは大きすぎ、クラスCでは小さすぎたため、割り当ての要求がクラスBに集中した。そのため、現在ではアドレスクラスを使わず、ネットワーク部とホスト部の境界を8bit単位に固定しない可変長サブネットマスクやCIDR(Classless Inter-Domain Routing)の使用が一般化している。

 

IPアドレスの種類

グローバルIPアドレス:インターネット上で使えるアドレス。

プライベートIPアドレス:LAN内で使えるアドレス。予約されているアドレスは以下の通り。

  • 10.0.0.0 - 10.255.255.255 (Aクラスの最初の方)
  • 172.16.0.0 - 172.31.255.255 (Bクラスの最後の方)
  • 192.168.0.0 - 192.168.255.255 (Cクラスの最初の方)

ネットワークアドレス:ネットワーク全体を表すアドレス。ホスト部のビットが全て0。

ブロードキャストアドレス:LAN内の端末に電気信号を送るためのアドレス。ホスト部のビットが全て1。

ループバックアドレス:自分自身を表す仮想的なアドレス。ローカルホスト。127.0.0.1

 

ポート番号は3つのグループに分けられる

ポート番号とは、コンピューターがデータ通信を行う際に、通信先コンピューターのプログラム(アプリケーション)を特定するための番号である。指定できる番号の範囲は各プロトコルごとに0から65535(16ビット符号なし整数)と決められている。

ポート番号は大別して3種類に分けられる。

  • Well-known port 0-1023番
  • Registered port 1024-49151番
  • Dynamic/Private port 49152-65535番

Well-known portはIANA(Internet Assigned Numbers Authority)が割り当てを行っており、主にFTP(20,21),SSH(22),TELNET(23),SMTP(25),HTTP(80)などシステムレベルで重要なプロトコルで使われている。Registered portはソフトウェアベンダーが独自アプリケーション用に申請し、IANAが管理するポート。Dynamic/Private portはユーザーがローカルで自由に利用できるポート番号である。

ネットワークアーキテクチャと標準化組織について調べた

ネットワークアーキテクチャとは、ネットワークにおいて必要な論理構造やプロトコルを体系的に定めたもの。代表的なアーキテクチャに、OSI参照モデルTCP/IPモデルがある。

 

OSI参照モデルTCP/IPモデルはどのようにして生まれたか

現在のインターネットのような「パケット通信ネットワーク」の研究が始まったのは1968年。その後、複数の組織が独自にネットワークの研究を進め、複数のネットワーク技術が市場に出回った。以下はその例である。

しかし、これらの技術を搭載したコンピューター製品は互いに互換性がなく、通信ができなかった。そのため、業界共通のネットワークの標準化が進められた。

1977年から1984年にかけて、国際標準化機構(ISO)と国際電気通信連合(ITU-T)がネットワーク技術の標準化を行った。そのとき策定されたのが、OSI(Open Systems Interconnection=開放型システム間相互接続)である。1977年にISOが定めたOSI参照モデルは、OSIのために定義された、プロトコルの階層モデルである。

しかし、OSIの標準化が進められている間に、1970年代初期から米国国防高等研究計画局(DARPA)で研究が進められていたTCP/IP(インターネットプロトコルスイート)が業界で広く使われるようになり、結局OSIプロトコルや仕様自体は普及しなかった。

実際、OSIの仕様は複雑すぎて、実装が困難だったと言われている。今では「プロトコルの階層モデル」という考え方が教育に適していることから、OSI参照モデルのみが電子科学の教科書などに引用されている。

 

標準化が進む前に開発されたネットワーク技術

Apple Talk: 1984年に、アップル社製のMacintoshで利用するために開発された通信プロトコル群。TCP/IPとは互換性がない。現在アップル社はApple Talkを廃止し、自社製品にBonjourを実装している。BonjourはZeroconfという技術を実装したもので、ZeroconfはDHCPDNSの設定をせずに、ネットワークを自動的に作成する技術である。BonjourTCP/IP上で実現でき、更にネットワーク負荷を小さくする。

 

NetBEUI: 1985年に、IBM社により開発されたプロトコルWindows系OSで利用された。TCP/IPが主流になるにつれて、だんだんと使われなくなり、Windows 7からNetBEUI自体が廃止された。

 

DECnet: 1975年に、DEC(Digital Equipment Corporation)がミニコンピューター同士の接続のために開発した通信プロトコル群。DECの主要OSであるVAX/VMS向けに構築された。当初は4階層で構成されていたが、1982年にOSI参照モデルに準拠し、7層のネットワークプロトコルとなった。現在はLinux向けのオープンソース版が開発されている。

 

IPX/SPX: 1980年代後半からノベル社のOS Netwareで主に使われていた通信プロトコル。主にLAN向けに設計されており、LAN上での性能はTCP/IPよりも優れている。TCP/IPデファクトスタンダードとなった理由は、WANやインターネットでの性能がTCP/IPの方が優れていた点、TCP/IPがグローバルな利用を意図して設計されたプロトコルであった点にあるとされる。1990年代に入ってもIPX/SPXはLANとして主流だったが、TCP/IPが主流になったことから、Windows Vistaではサポートされなくなった。

 

標準化組織

標準化組織は国際的な組織から、地域限定の組織まで複数存在する。

ISO(International Organization for Standardization): 国際標準化機構OSI参照モデルを策定。電気分野を除く工業分野の国際規格を策定するための非政府組織。

 

ITU-T(International Telecommunication Union Telecommunication Standardization Sector): 国際電気通信連合の部門のひとつ。データ伝送を含む通信関係の国際標準化を行う。主にWAN回線の仕様として参照される。

 

ISOC(Internet SOCiety): 1992年に設立された国際的非営利組織。目的は「全世界のあらゆる人々の利益のため、インターネットのオープンな関係・進歩・利用を保証する」こと。IETF(Internet Engineering Task Force)の上層団体に位置する。IETFは、インターネットで利用される技術の標準化を策定する組織。策定された標準仕様はRFC(Request for Comments)として発行する。

 

IEEE(Institute of Electrical and Electronics Engineers): アメリカに本部を持つ電気工学・電子工学技術の学会。IEEE 802.11は広く普及している無線LAN関連企画。

 

ANSI(American National Standards Institute): 米国国家規格協会。アメリカの国内における工業分野の標準化組織。

 

OSI参照モデル 

コンピューターの持つべき通信機能を7つの階層に分けて定義している。体系的にまとめられたモデル、実用的ではない。

第7層アプリケーション層: アプリケーションの種類やサービスに関する規定。

第6層プレゼンテーション層: データの種類・表現形式や送信ビット数に関する規定。

第5層セッション層: アプリケーション間の通信モード・接続数に関する規定。

第4層トランスポート層: 通信エラー管理、アプリケーション識別に関する規定。ポート番号から一つのアプリケーションを特定する層。

第3層ネットワーク層: 通信経路や中継経路の選択、識別アドレスに関する規定。IPアドレスを元にLAN間の通信を実現する層。

第2層データリンク層: 通信路の確保や伝送制御手順、エラー訂正に関する規定。MACアドレスを元にLAN内での1:1の通信を実現する層。

第1層物理層: 物理的な回線や機器類、電気信号に関する規定。

 

TCP/IPモデル

インターネット標準プロトコルのモデル。4つの階層で構成され、複数の独立したプロトコルを組み合わせて通信を行う。各層の名称と対応プロトコルは以下の通り。

第4層アプリケーション層: HTTP, SMTP, POP, IMAP, FTP, TELNET, SSH, DNS, DHCP, NTP

第3層トランスポート層: TCP, UDP

第2層インターネット層: IP(ARP, ICMP: Internet Control Message Protocol)

第1層ネットワークインターフェース層: Ethernet, 無線LAN, PPP(Point-to-Point Protocol), PPPoE(PPP over Ethernet), VPN

 

 

ターミナルからプライベートIPアドレスとMACアドレス、ルーティングテーブルを確認する

自分のlaptopのプライベートIPアドレスがどのように割り当てられているか、調べる。

ターミナルから$ ifconfig をうつ。複数のインターフェースが表示される。

f:id:bambinya:20150404134834p:plain

上記は「lo0」「gif0」「stf0」「en0」が表示されている。

他にも「en1」「en2」「p2p0」「awdl0」「bridge0」「utun0」が表示された。

 

各インターフェースの名前と役割

lo0(loopback)

ネットワークのテストに使えるよう用意された仮想インターフェース、NICがなくても、このloは表示される。inetの127.0.0.1IPアドレスとして自動で割り当てられる。

 

gif0(generic tunnel interface)

IPv6/IPv4トンネリングを行うときに使うインターフェース。IPv6/IPv4トンネリングとは、IPv4(またはIPv6)をサポートするネットワークに、IPv6(またはIPv4)のパケットをルーティング(送受信)する仕組み。例として、IPv4のみサポートしているネットワークにIPv6のパケットをルーティングする場合は、IPv6のパケットにIPv4パケットのヘッダを付加(カプセル化)して、IPv4のネットワークにパケットを送信することができる。2つのルーター間でトンネリングの設定を行う場合、このインターフェースに、自分と相手のIPv4アドレスと、それに対するIPv6アドレスを設定しておく。

規格の詳細(gif(4) - NetBSD Manual Pages)

 

stf0(6to4 tunnel interface)

gifIPv6パケットをIPv4パケットにカプセル化でき、その逆も可能であるのに対し、これはIPv6パケットをIPv4ネットワークにルーティングするためのインターフェース。

規格の詳細(stf(4) - NetBSD Manual Pages)

 

en0(Ethernet 0)

enの後に続く「0」「1」の番号は認識した順に割り振られる。イーサネットはLAN規格を指すので、自分のlaptopのIPアドレスMACアドレスはこのインターフェースに書かれている。上記のスクリーンショットでは

MACアドレスは「ether 80:e6:50:11:a5:6c」

IPアドレスは「inet 192.168.0.2」

であることがわかる。ブロードキャストアドレス(LAN内すべての端末に電気信号を送るアドレス)は「broadcast 192.168.0.255」。

 

ネットワークユーティリティからも各インターフェースの情報が見られる。

f:id:bambinya:20150404233255p:plain

 

MACアドレスのベンダーIDを調べる 

MACアドレスのベンダーID「80:e6:50」を IEEE-SA - Registration Authority MA-L Public Listing で検索する。コロンはダッシュに変換する。

f:id:bambinya:20150404232125p:plain

検索結果、端末のベンダーが表示される。

f:id:bambinya:20150404232230p:plain

 

IPアドレスの種類 

グローバルIPアドレス:インターネット上で使えるアドレス。

プライベートIPアドレス:LAN内で使えるアドレス。

  • 10.0.0.0 - 10.255.255.255 (Aクラスの最初の方)
  • 172.16.0.0 - 172.31.255.255 (Bクラスの最後の方)
  • 192.168.0.0 - 192.168.255.255 (Cクラスの最初の方)

ネットワークアドレス:ネットワーク全体を表すアドレス。

ブロードキャストアドレス:LAN内の端末に電気信号を送るためのアドレス。

ループバックアドレス:自分自身を表すアドレス。ローカルホスト。127.0.0.1

 

ルーティングテーブルを見る

ターミナルからルーティングテーブルを見るためには、$ netstat -rn を打つ。-rはルーティングテーブルの表示。-nはIPアドレスを数字で表示する。

f:id:bambinya:20150405205043p:plain

 

heroku cedar-10が2015年11月以降使えなくなるそうだ

heroku にpushしたら、実行環境(runtime environment)が古いので、バージョンアップしてくださいと言われた。

f:id:bambinya:20150323203239p:plain

最新のCedar-14は、Ubuntu OS のver 14.04 を採用している。プロジェクトで使用しているRubyは2.1.0なので、Cedar-14にするには、2.1系の最新版(2.1.5)にしないといけない。

各スタックと、対応している言語のバージョンは以下から見られる。

devcenter.heroku.com

 

 Rubyのバージョンを上げる

$ brew upgrade ruby-build すると、インストール可能なRubyのバージョンが更新される。今回は2.2.1にアップグレードした。Gemfileのバージョンも修正する。

f:id:bambinya:20150324220300p:plain

f:id:bambinya:20150324220307p:plain

 

まずはステージングで試そう

herokuのブログにCedar-14に変更する方法が書いてある。

(以下は引用。 Migrating to the Celadon Cedar-14 Stack | Heroku Dev Center より)

Before upgrading an existing application to Cedar-14, you should test the upgrade on a Cedar-14 staging app that is not getting production traffic. You can create a staging app to use for testing, let’s call the git remote heroku-cedar-14 and the app cedar-14-app:

 

既存のアプリケーションをCedar-14にアップグレードする前に、本番からのアクセスがないステージングアプリケーションを、Cedar-14にアップグレードして、テストしてみましょう。テストのためのステージングアプリケーションを作ることができます。gitのリモートブランチheroku-cedar-14を作って、heroku上のcedar-14-appというアプリケーションにデプロイできるようにしましょう。

 $ heroku create --remote heroku-cedar-14 --stack cedar-14 cedar-14-app-name

f:id:bambinya:20150323222140p:plain

本番と同じように

  • アドオン
  • 環境変数
  • config/secrets.yml
  • config/environments/staging.rb

等追加して、ステージングにデプロイしましょう。

 $ git push heroku-cedar-14 master
$ heroku run rake db:migrate --app cedar-14-app-name

デプロイ後、ステージングアプリケーションに問題がないか、確認しましょう。問題がなければ、本番もアップデートして良いそうです。

 

スタックの変更は非常に簡単

$ heroku stack で使用中のstackが表示

$ heroku stack:set cedar-14 で、cedar-14に変更

再び、$ heroku stack

f:id:bambinya:20150325215846p:plain

そして、$ git push してみる。変更がなくてもコミットできるんだ!

 $ git commit --allow-empty -m "Upgrading to Cedar-14"
 $ git push heroku master

以上で、Rubyのバージョンアップとstackのバージョンアップが完了でござるー!

 

 

デジタル証明書とデジタル署名について

SSLTLSでは、通信途中のデータの改ざんや、フィッシング詐欺(銀行や組織を装い、口座番号やクレジットカードを引き出す)を防ぐために、デジタル証明書とデジタル署名という技術を用いている。

 

デジタル証明書とは?

SSLサーバー証明書ともいう。配布されている公開鍵の、送り主(機関、銀行など)が信頼できることを証明するための仕組み。

デジタル証明書は認証局(CA:Certificate Authority)が発行するもので、通信相手が送ってきた証明書を、発行元の認証局に照会することで、通信相手の身元を確認することができる。証明書の内容は、通信相手の身元を表す情報と、照会した認証局の情報、通信相手が発行した公開鍵、暗号化されたデジタル署名、などである。

SSLの仕様上、悪意のある攻撃者が自ら認証局となって、証明書を発行することが可能である。これを防ぐために、最近では有力な商用CAが厳格な身元確認などの審査を要する「EV SSL証明書」の発行を行っている。

 

デジタル署名とは?

データが通信途中で改ざんされていないことを証明するための仕組み。一方向ハッシュ関数を用いる。一方向ハッシュ関数は、以下の特徴を持つ。

  1. 生成されるハッシュ値は、元の値が1ビットでも変わると異なる値になる。
  2. 生成されたハッシュ値から、元の値を逆算できない。これを一方向性という。
  3. 元のデータの長さに関係なく、生成されるハッシュ値の長さは一定である。

よく知られているハッシュ関数にはSHA-1MD5などがある。

 

クライアント(Webブラウザ)が通信相手(Webサーバー)を信頼するまでの流れ

通信前にサーバー側がしておくこと

  1. Webサーバー側が秘密鍵と公開鍵を生成する。
  2. 認証局に、公開鍵と各種証明書を含むCSR(certificate signing request:証明書署名要求)を送る。
  3. 認証局は審査を行った上で、デジタル証明書を発行する。デジタル証明書は次の情報を含む。公開鍵所有者情報秘密鍵で暗号化したデジタル署名(公開鍵と所有者情報を一方向ハッシュ関数ハッシュ値にし、認証局が発行した秘密鍵で暗号化したもの)
  4. Webサーバーは、認証局からデジタル証明書が送られてくるので、大切に保管する。

 

通信前にクライアント側がしておくこと(は何もない)

  1. サーバーから送られてくる証明書には、認証局秘密鍵で暗号化されたデジタル署名が含まれており、これを復号化するためには、認証局の公開鍵が必要である。主要な認証局の公開鍵は、認証局の証明書という形で、Webブラウザにプリインストールされている。証明書は以下の手順でブラウザから確認することができる。(写真みてちょ)

f:id:bambinya:20150320110512p:plain

f:id:bambinya:20150320110639p:plain

 

さっそく通信を開始しよう

  1. クライアントは、サーバーへ通信要求を送る。
  2. サーバーは、サーバー証明書をクライアントへ送る。
  3. クライアントは、デジタル署名の技術を用いて、デジタル証明書が認証局で発行されたものかどうかを確認する。サーバーのデジタル証明書には、サーバーが生成した公開鍵所有者情報デジタル署名(サーバーが生成した公開鍵と所有者情報をハッシュ値にして認証局秘密鍵で暗号化したもの)などが含まれている。一方、Webブラウザが事前に持っている認証局の証明書には、認証局が生成した公開鍵認証局情報認証局がデジタル署名に使用したハッシュ関数などが含まれている。
  4. クライアントは、認証局の証明書に含まれる公開鍵を用いて、サーバー証明書に含まれる、暗号化されたデジタル署名(ハッシュ値)を復号する。
  5. クライアントは、認証局の証明書に含まれるハッシュ関数を用いて、サーバー証明書に含まれる公開鍵と所有者情報のハッシュ値を生成する。
  6. クライアントは、復号したハッシュ値と、生成したハッシュ値を比較する。
  7. ハッシュ値が一致すれば、サーバー証明書認証局で発行されたことと公開鍵が改ざんされていないことが分かる。クライアントは、サーバー証明書に含まれる公開鍵を使って、データを暗号化し、サーバーに送ることができる。

この図がわかりやすいよ!

f:id:bambinya:20150320094531g:plain

 

SSLのハイブリッド方式

SSLNetscape Communication社で開発された。webブラウザとwebサーバーの間でやり取りするデータを暗号化して通信するためのプロトコル。暗号化とデジタル署名の技術を使い、セキュアな通信を実現する。

SSLでは「共通鍵暗号化方式」と「公開鍵暗号化方式」を組み合わせたハイブリット方式を利用するのが一般的である。

 

共通鍵暗号化方式とは?

平文の暗号化と、暗号文の復号化は同じ鍵で行う。データを送る側と、データを受け取る側が同じ鍵を持つ。データのやり取りに関係のない第三者には鍵を盗まれてはならない。共通鍵暗号化のアルゴリズムにはDES(Data Encryption Standard),3DES(トリプルDES)などがある。

 

公開鍵暗号化方式とは?

データを送る側が平文の暗号化を公開鍵で行い、受け取り側が暗号文の復号化を秘密鍵で行う。データのやり取りを行う前に、データを受け取る側が、公開鍵と秘密鍵のペアを作成しておく。公開鍵は他人に配ることができるが、秘密鍵は鍵の作成者以外に盗まれてはならない。公開鍵暗号化方式のアルゴリズムにはRSA(Rivest Shamir Adleman), EPOC(Efficient Probabilistic Public-Key Encription)などがある。

 

ハイブリット方式とは?

SSLで利用されている暗号化方式。共通鍵暗号化方式と公開鍵暗号化方式を組み合わせることで、セキュアな通信を行う。

処理の流れは以下のとおり。

  1. クライアントは共通鍵暗号化方式の共通鍵を作っておく。
  2. webサーバーは公開鍵暗号化方式の公開鍵と秘密鍵を作っておく。
  3. クライアントがサーバーに接続要求を出す。
  4. webサーバーは公開鍵を含むsslサーバー証明書(デジタル証明書)をクライアントに送る。
  5. クライアントはsslサーバー証明書認証局で発行されたかどうか確認をする。
  6. クライアントは共通鍵で送信データを暗号化し、sslサーバー証明書に含まれる公開鍵で共通鍵を暗号化する。
  7. クライアントは暗号化した送信データと共通鍵をwebサーバーに送る。
  8. webサーバーは暗号化された共通鍵を秘密鍵で復号し、復号した共通鍵で送信データを復号する。

f:id:bambinya:20150316233811g:plain