$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/ する。