$Id: howto-ssl.html,v 1.3 2001/11/13 09:58:08 sakane Exp $

%Hd: SSL について

注意: SSL Handshake Protocol は嘘書いてる事が判明。
時間見て直します。ごめんなさい。

o 概要
	SSL: Secure Socket Layer の略。Netscape Communications社が提唱。
	セッション層で、暗号化、認証、完全性を提供。
	以下の Protocol に分けられる。
		SSL Handshake Protocol
		Alert Protocol
		Change Cipher Spec Protocol
		Application Data Protocol
		SSL Record Protocol

o SSL Handshake Protocol
  - Message フォーマット
   +-----------------+-----------------+-----------------+-----------------+
   |  Message Type   |                   Message Length                    |
   +-----------------+-----------------+-----------------+-----------------+
   :                                Message                                |
   |                                                                       |
   +-----------------+-----------------+-----------------+-----------------+

  - Handshake Protocol Flow

    新規セッション確立時                   既存セッション再開

  client                     server      client                     server
    |                          |           |                          |
    |--------- Client Hello -->|           |--------- Client Hello -->|
    |                          |           |                          |
    |<-- Server Hello ---------|           |<-- Server Hello ---------|
    |<-- Server Certificate ---|           |<-- Change Cipher Spec ---| <== 
    |<-- Server Key Exchange --|           |<-- Finished -------------|
    |<-- Certificate Request --|           |                          |
    |<-- Server Hello Done ----|        ==>|--- Change Cipher Spec -->|
    |                          |           |------------- Finished -->|
    |--- Client Certificate -->|           |                          |
    |-- Client Key Exchange -->|           |<----- Deta Exchange -----|
    |--- Certificate Verify -->|           |                          |
 ==>|--- Change Cipher Spec -->|
    |------------- Finished -->|
    |                          |
    |<-- Change Cipher Spec ---| <== 
    |<-- Finished -------------|
    |                          |
    |<----- Deta Exchange -----|
    |                          |

  - Hello Request
    server => client
    client は直ちに Client Hello を始動。

  - Client Hello
    client => server
    自分のサポートする暗号化アルゴリズム、圧縮アルゴリズムなどを送信。
    既存セッションの再開には、セッションIDも送信。
    最初にサーバに接続する時。
    serverから Hello Request を受けとった時。
    既存コネクションの暗号化パラメータを変更する時。
    Server Hello を待機。

  - Server Hello
    server => client
    clientが示した暗号化アルゴリズムと圧縮アルゴリズムを指定。
    clientがセッションIDを指定して、それを許可する場合、既存セッション再開する。

  - Server Certificate (optional)
    server => client
    証明書を送付。階層的証明書発行機関の存在を仮定している。
    CCITT勧告X.509で規定される形式。

  - Server Key Exchange (optional)
    server => client
    サーバが証明書を持っていない時。
    証明書が署名にしか使えない時。
    サーバの公開情報を送信する。(RSA公開鍵やDH方式公開情報など)

  - Certificate Request (optional)
    server => client
    証明書形式と発行機関を優先順に送信。

  - Server Hello Done
    server => client
    送信後 client からの応答を待つ。

  - Client Certificate
    client => server
    Server Certificate 受信後に送信。
    server からの要求に適した証明書を持っていない場合、no_certificate なる
    Alert を返す。server は、設定によりコネクションを切断する。

  - Client Key Exchange
    client => server
    RSA, DH, Fortezza

  - Certificate Verify (optional)
    client => server
    server の client証明書認証の補助をするために送信。
    既に交換しているserver,client双方のデータにMD5,SHAの両方を噛ませたデータ。

  - Finished
    互いに Handshake Protocol が終了したことを示す為に送信。
    Certificate Verify と同様のデータを持っている。
    
o SSL Record Protocol
  - ヘッダ部
    2bytesヘッダ --> byte[0] & 0x7f == 1
      データ長 = (( byte[0] & 0x7f ) << 8 ) | byte[1]
    3bytesヘッダ --> byte[0] & 0x7f == 0
      データ長 = (( byte[0] & 0x3f ) << 8 ) | byte[1]
      パディング長 = byte[2]
  - データ部

o SSLeay-0.8.0 を使う。

	SSL3 をサポートしている。

	以下から拾ってくる。
	http://www.psy.uq.oz.au/~ftp/Crypto/

	以下 INSTALL参照
	/usr/local/bin に perl が存在しなければ、
		% perl util/perlpath.pl /usr/bin

	インストールするディレクトリを作る。
		% mkdir /usr/local/ssl
		インストールするディレクトリを変更した場合。
		% perl util/ssldir.pl /new/ssl/home

	OSのタイプを引数に Configure を実行する。

		% perl Configure
		Usage: Configure [-Dxxx] [-Lxxx] [-lxxx] os/compiler
		pick os/compiler from:
		BC-16              BC-32              FreeBSD            NetBSD-sparc       
		NetBSD-x86         SINIX-N            VC-MSDOS           VC-NT              
		VC-W31-16          VC-W31-32          VC-WIN16           VC-WIN32           
		aix-cc             aix-gcc            alpha-cc           alpha-gcc          
		alpha400-cc        bsdi-gcc           cc                 debug              
		debug-irix-cc      debug-linux-elf    dgux-R3-gcc        dgux-R4-gcc        
		dgux-R4-x86-gcc    dist               gcc                hpux-cc            
		hpux-gcc           hpux-kr-cc         irix-cc            irix-gcc           
		linux-aout         linux-elf          nextstep           purify             
		sco5-cc            solaris-sparc-cc   solaris-sparc-gcc  solaris-sparc-sc4  
		solaris-usparc-sc4 solaris-x86-gcc    sunos-cc           sunos-gcc          
		unixware-2.0       unixware-2.0-pentium 

		とずらずら出てくるので、適当に引数をつけて実行する。

		% perl Configure bsdi-gcc

	make する。
		% make clean; make depend ; make
		% make rehash
		% make test
		% make install

o demo してみる。
	CAを立ちあげる。
		% ssleay req -new -x509 -keyout ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem -days 365
	証明書を発行する。
		% ssleay req -new -keyout newreq.pem -out newreq.pem -days 365
	証明書にサインをする。
		% ssleay ca -policy policy_anything -out newcert.pem -infiles newreq.pem

o apache と使う。
	howto-apache.html参照。

o SSLeay-0.6.6 を make する。

	SSL2 をサポート

	以下 INSTALL参照

	SSLeay自体のパッチ SSLeay-0.6.6.patch1 をあてる。
		reject された(?)ので、手であてる。i486用DESコードなので特にいらない。
	BSD/OS2.1のasだと、asm/dx86unix がコンパイル出来ないので、
		Makefile を s/DES_ENC= asm\/dx86bsdi.o/DES_ENC=des_enc.o/ する。