MacOSXでSSLサーバーの構築

MacOSXでSSLサーバーの構築
(2004.06.26作成, 05.12.xx更新)
MacOSX にはApache のmod_ssl および OpenSSL がデフォルトで備わっている。今回は、MacOSX10.3上でAppleのUsing mod_ssl on Mac OS Xに書いてある方法を踏襲し、MacOSX関連:SSLサーバー設定Mac OS XでSSL/TLSサーバ を参考に構築した。
事前準備
1) サーバーPC用にDDNSホスト名を取得する。
2) PCにNorton Personal Firewall(&AntiVirus)をインストールする。
3) ブロードバンドルーターの設定
 HTTPサーバーが利用するポート(TCP/80)とSSL(HTTPS)が利用するポート(TCP/443)を外部に公開する。
 サーバーとなるPCのIPアドレスは固定に設定し、これをポートフォワード先に指定する。
4) RBrowserLiteのインストール:本家はリンク切れの為、versiontrackerより入手。
 本来はFTPクライアントソフトであるが、隠しファイルも見られるファイルブラウザとして便利無料ソフト。
5) OSXにはApacheとOpenSSLとmod_sslがインストール済み。追加するのはsign.shスクリプトだけ。それのみのダウンロードはできないので、mod_sslのソース(mod_ssl-2.8.18-1.3.31.tar.gz )をダウンロードして解凍し、pkg.contribフォルダの中から取り出す。
6) DocumentRootの設置デフォルトは /Library/WebServer/Documentsになっているが、起動ディスクとは別のハードディスクのWebServerフォルダ内に設定する。
7) Apache(パーソナルWeb共有)を停止してから以下の設定を行う。

SSLサーバーの設定
以下はTerminal (ターミナル) で操作する。
-
 I. 作業ディレクトリで証明書の作成
 SSL はサーバーを特定するコードが記されている「公開鍵 (public key)」と,それを証明する書類が必要。それらの作成方法は,以下のStep1)〜Step4)の通り。

はじめに、例えばKeyGenという名でデスクトップ上に作業ディレクトリを作成する。
 cd ~/Desktop/KeyGen
1) 乱数(rand.dat)の作成:乱数の種になるデータを作成する。
 % cd /
 % openssl md5 * > ~/Desktop/KeyGen/rand.dat
  コメント:以下のエラーが表示されるが構わず利用する。
 Read Error in Applications
 9762:error:0200B001:system library:fread:Operation not permitted:bss_file.c:167:
 9762:error:20082002:BIO routines:FILE_READ:system lib:bss_file.c:168:
 Read Error in Applications (Mac OS 9)
 9762:error:0200B001:system library:fread:Operation not permitted:bss_file.c:167:
 ー以下略ー
  rand.datの内容は以下の通り。
 MD5(0)= d41d8cd98f00b204e9800998ecf8427e
 MD5(Desktop DB)= 36bfdf54cecbcd6965b22691b3a5f525
 MD5(Desktop DF)= 8150b47a7157ebd6047d2f5e73f9fe59
 MD5(Desktop DF - for rebuild)= 7209a1ce16f85bd1cbd287134ff5cbb6
 MD5(NAVMac800QSFile)= a05cff0a63dffcf9e0101278bbe9eb6e
 MD5(NAVェ 7.0 QuickScan)= b65cbbf131357898626ce2f29f3a3440
 ー以下略ー
2) サーバー鍵及び証明書署名要求(CSR:Certificate Signing Request)の作成
ここからは4)までは、KeyGenディレクトリに移って作業をする。
 % cd ~/Desktop/KeyGen
 2-1) サーバー鍵(server.key)の作成:
 RSA (RSA公開鍵方式) の秘密鍵 (実際は秘密鍵と公開鍵のペア) を作成する。パスフレーズ (パスワード) を要求されるので適当に入れる。
 % openssl genrsa -des3 -out server.key -rand rand.dat 1024
 コメント:Apacheを停止してないと、上のコマンドは有効に機能しない!
 686 semi-random bytes loaded
 Generating RSA private key, 1024 bit long modulus
 ...................++++++
 .................................................++++++
 e is 65537 (0x10001)
 Enter pass phrase for server.key: パスフレーズを入れる
 Verifying - Enter pass phrase for server.key: パスフレーズを入れる
 
 2-2) 証明書署名要求(server.csr)の作成:
 署名のためにCA (Certificate Authority = 認証局) へ送るもの。通常、買物サイトなどでは、ベリサイン等のパブリックCAに署名を依頼することになる。
 % openssl req -new -key server.key -out server.csr
 Enter pass phrase for server.key: パスフレーズを入れる
 You are about to be asked to enter information that will be incorporated
 into your certificate request.
 What you are about to enter is what is called a Distinguished Name or a DN.
 There are quite a few fields but you can leave some blank
 For some fields there will be a default value,
 If you enter '.', the field will be left blank.
 -----
 Country Name (2 letter code) [AU]:JP
 State or Province Name (full name) [Some-State]:Aichi
 Locality Name (eg, city) []:Anjo
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:kakonacl
 Organizational Unit Name (eg, section) []:ken
 Common Name (eg, YOUR name) []:kakonacl.dip.jp
 Email Address []:xxx@yyy

 Please enter the following 'extra' attributes
 to be sent with your certificate request
 A challenge password []:.
 An optional company name []:.

 コメント:ここでの「 Common Name」 には,後に httpd.conf に書き込むドメインサーバ名(今回はkakonacl.dip.jp)を入れる。ここが違うとSSLが有効にならない。
3) CAの鍵及びCA証明書の作成
 CA (Certificate Authority = 認証局)は ベリサイン等の第三者である必要があるが,自らが CA になることもできる。テストであれば,これで十分。但し,ブラウザが「不明な認証機関」と警告を発するが・・・。
 3-1) CAの鍵(ca.key)の作成:
 % openssl genrsa -des3 -out ca.key -rand rand.dat 1024
 686 semi-random bytes loaded
 Generating RSA private key, 1024 bit long modulus
. ....++++++
 .................++++++
 e is 65537 (0x10001)
 Enter pass phrase for ca.key: パスフレーズを入れる
 Verifying - Enter pass phrase for ca.key: パスフレーズを入れる

 3-2) CA証明書(ca.crt)の作成:
 今作った秘密鍵を使って自己署名のCA証明書 (ルート証明書) を作成する。

 % openssl req -new -x509 -days 365 -key ca.key -out ca.crt
 コメント:CSRの時とは少し違う。「Common Name」はここでは自分の名前を入れる。
 Enter pass phrase for ca.key: パスフレーズを入れる
 You are about to be asked to enter information that will be incorporated
 into your certificate request.
 What you are about to enter is what is called a Distinguished Name or a DN.
 There are quite a few fields but you can leave some blank
 For some fields there will be a default value,
 If you enter '.', the field will be left blank.
 -----
 Country Name (2 letter code) [AU]:JP
 State or Province Name (full name) [Some-State]:Aichi
 Locality Name (eg, city) []:Anjo
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:kakonacl
 Organizational Unit Name (eg, section) []:ken
 Common Name (eg, YOUR name) []:kenji kamiya
 Email Address []:xxx@yyy
4) 署名済みサーバ証明書(server.crt)の作成
 プライベートCAとして2-2)で作成した server.csr に署名することで,自前のサーバ証明書server.crtを作る。パブリックCAへ頼んだ場合は、署名済みサーバ証明書が送られてくる。

このためには、事前準備の5)で準備したsign.shスクリプトを作業ディレクトリにコピーしておいて実行する。
 % ./sign.sh server.csr
 CA signing: server.csr -> server.crt:
 Using configuration from ca.config
 Enter pass phrase for ./ca.key: パスフレーズを入れる
 Check that the request matches the signature
 Signature ok
 The Subject's Distinguished Name is as follows
 countryName :PRINTABLE:'JP'
 stateOrProvinceName :PRINTABLE:'Aichi'
 localityName :PRINTABLE:'Anjo'
 organizationName :PRINTABLE:'kakonacl'
 organizationalUnitName:PRINTABLE:'ken'
 commonName :PRINTABLE:'kakonacl.dip.jp'
 emailAddress :IA5STRING:'xxx@yyy'
 Certificate is to be certified until Jun 25 10:33:08 2005 GMT (365 days)
 Sign the certificate? [y/n]:y


 1 out of 1 certificate requests certified, commit? [y/n]y
 Write out database with 1 new entries
 Data Base Updated
 CA verifying: server.crt <-> CA cert
 server.crt: OK

 II. 書類の/etc/httpdへ設置
 以上で必要な2つの書類server.key と server.crtが出来上がったので、/etc/httpdへ設置する。
 まず、/etc/httpdにssl.keyディレクトリを作成する。
 % sudo mkdir /etc/httpd/ssl.key
 そして作業ディレクトリの内容をすべてコピーする。
 コメント:原書では
 % sudo mkdir /etc/httpd/ssl.key
 % sudo cp -r * /etc/httpd/ssl.key
 とあるが、上記ではコピーできないので、以下を実行。
 % sudo cp ~/Desktop/KeyGen/* /etc/httpd/ssl.key
 % sudo cp -r ~/Desktop/KeyGen/* /etc/httpd/ssl.key
 パブリックCAに頼んだ場合は、送られてきたサーバ証明書のファイル名をserver.keyとしてssl.keyに入れる。

 III. httpd.conf の設定
1) httpd.conf のバックアップ
 % cd /etc/httpd
 % sudo cp httpd.conf httpd.conf.backup
2) httpd.confファイルの編集
 ここからは、picoで作業をする
 % sudo pico /etc/httpd/httpd.conf
 i) 下記2つをControl+wで検索して頭の#を消して読み込まれるようにする。
 LoadModule ssl_module libexec/httpd/libssl.so

 AddModule mod_ssl.c

 ii) #を付けて「Port 80」をコメントアウトする。
 #Port 80
 iii) その代わりに、その下に次を追加する。
 ## SSL Support
 ##
 ## When we also provide SSL we have to listen to the
 ## standard HTTP port (see above) and to the HTTPS port
 ##
 <IfModule mod_ssl.c>
  Listen 443
  Listen 80
 </IfModule>
 iv) 「ServerName」を検索してドメインサーバ名を入れる。
 ServerName kakonacl.dip.jp
 v) httpd.confの最下部に以下を追加。
<IfModule mod_ssl.c>
 # 証明書ダウンロード用のMIMEタイプ
 AddType application/x-x509-ca-cert .crt
 AddType application/x-pkcs7-crl .crl
 # SSLの基本設定
 # SSLProtocol all -SSLv3
 SSLPassPhraseDialog builtin
 SSLSessionCache dbm:/var/run/ssl_scache
 SSLMutex file:/var/run/ssl_mutex
 SSLRandomSeed startup builtin
 SSLLog /var/log/httpd/ssl_engine_log
 SSLLogLevel info
 # 下記を加えればspecialディレクトリはSSL接続以外拒否できるhttpでの接続不可
 <Directory /Volumes/oxoxox/WebServer/special>
  SSLRequireSSL
 </Directory>
 # バーチャルホストでSSLとそうでないアクセスを分ける
 <VirtualHost *:80>
  SSLEngine off
  # SSLオフ
 </VirtualHost>
 <VirtualHost *:443>
  # SSLサーバーのバーチャルホストの基本設定
  # SSLディレクトリのデフォルト /Library/WebServer/Documentsから以下に変更
  DocumentRoot "/Volumes/oxoxox/WebServer/special"
  ServerName kakonacl.dip.jp
  ErrorLog /var/log/httpd/error_log
  TransferLog /var/log/httpd/access_log
  SSLEngine on
  # SSLProtocol all -SSLv3
  # EXPORT56はIE用に無効になっている
  SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
  # サーバ証明書と秘密鍵のパス
  SSLCertificateFile /etc/httpd/ssl.key/server.crt
  SSLCertificateKeyFile /etc/httpd/ssl.key/server.key
 # CGI等の環境変数にSSL標準のセットを追加
 <Files ~ "\.(cgi|shtml|phtml|php3?)$">
  SSLOptions +StdEnvVars
 </Files>
 <Directory "/Library/WebServer/CGI-Executables">
  SSLOptions +StdEnvVars
 </Directory>
 # SSL接続がうまくないブラウザ用
 SetEnvIf User-Agent ".*MSIE.*" \
 nokeepalive ssl-unclean-shutdown \
 downgrade-1.0 force-response-1.0
 # カスタムSSLログファイル
 # SSLのコンパクトなエラーでないログファイルなら
 CustomLog /var/log/httpd/ssl_request_log \
 "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
 </VirtualHost>
</IfModule>
 森氏によれば、「SSLProtocol all -SSLv3を記述するとSSLv3の128bit暗号が使えな
   くなる。Mac版IE 5.2.2では無くても問題ないが、Win版IEの問題で必要になるかもし
   れない」と。
 筆者の経験では、OSX10.3ではコメントアウトしなくても良かったが、OSX10.4では無
   効にする必要があった。
3) httpd.confファイルの正誤テスト
 % sudo apachectl configtest
 エラーがなければ完了。

 IV. Apache の起動におけるパスフレーズの要求の解除
 1) Apacheの起動
  この段階ではシステム環境設定から起動できないので、Terminal (ターミナル) で起動。
 % sudo apachectl start
  すると,SSL のパスフレーズを訊ねてくる。
 Processing config directory: /private/etc/httpd/users/*.conf
  Processing config file: /private/etc/httpd/users/oooooo.conf
 Apache/1.3.29 mod_ssl/2.8.16 (Pass Phrase Dialog)
 Some of your private key files are encrypted for security reasons.
 In order to read them you have to provide us with the pass phrases.

 Server kakonacl.dip.jp:443 (RSA)
 Enter pass phrase: パスフレーズを入れる

 Ok: Pass Phrase Dialog successful.
 /User/sbin/apachectl start: httpd started

 
 そしてパーソナルファイアウォールの自動セットアップが起動するので、TCP/80と443を開放する。

 2) 起動時パスフレーズ要求の解除方法
 server.key (サーバの秘密鍵) の暗号化を解除してパスフレーズ要求をなくすと、自動起動できるようになり、システム環境設定からも起動できるようになる。
  2-i) Apacheの停止
 % sudo apachectl stop
  2-ii) パスフレーズ要求の解除
 % cd /etc/httpd/ssl.key
 % sudo cp server.key server.key.original
 % sudo openssl rsa -in server.key.original -out server.key
 Enter pass phrase for server.key.original: パスフレーズを入れる
 writing RSA key
 次に、アクセス権を変更しておく。
 実用サーバの設定でパスフレーズ要求の解除行うのは危険なので、解除したら一連のファイルへのアクセスはrootのみに制限する。
 % cd /etc/httpd/ssl.key
 % sudo chmod -R 400 server.* ca.* rand.dat

 V. SSLディレクトリへのアクセス制御の設定
パスワードファイルとアクセスコントロールファ(.htaccess)でアクセス制御をする。
以下は設定例:
1)Terminalを用いて  /etc/httpdディレクトリにパスワードファイル(x)を作成し、ユーザー(y)そのユーザーのパスワード(z)で登録する。
 % cd /etc/httpd/
 % sudo htpasswd -c -b x y z
2)アクセスコントローファイル(.htaccess)をpicoで編集してSSLディレクトリ置する。
 AuthType Basic
 AuthUserFile /etc/httpd/x
 AuthName "Special Guest Area"
 <Limit GET>
 require valid-user

 </Limit>
 
-
結果お試しサイトへのアクセスは下から。注意:不定期に運用。R18鍵コーナー。
特別会員のSSL暗号部屋テスト

ここから入場
 
現在停止中

この部屋(サイト)に入場するために必要なSSLの公開鍵と証明書は、自前で作成しました。認証局によるサイト証明書の発行ではないので、如何わしいサイトと警告されますが、暗号化通信は行われますので安心してご入場下さい。

ブラウザ動作確認
 Windows:IE6.0、Netscape4.7以降、Opera7.22、Slerpnir1.6
 MacOSX:Safari1.2、Netscape7.1、iCab2.98、OmniWeb4.5
 何故か?MacOSX版 Internet Explorer5.2は、SSL接続を確立出来ない。


ストリーミングムービー受信結果
圧縮コーデック(使用プレーヤー)
Embedded方式
Stand Alone方式
RealVideo8.5 (RealPlayer8以降)
受信不可
受信不可
WindowsMedia8(WindowsMediaPlayer7.1以降)
受信不可
(ただし、*)
受信不可
Apple MPEG-4 (QuickTimePlayer6以降)
受信可能
受信不可
上記ストリーミングムービーは、HTTPSプロトコルには対応していないはずだが、QuickTimeのEmbedded方式は再生可能。
*ただし、WindowsMediaのEmbedded方式はWindows版InternetExplorerでは再生可能。


| Kenのムービー計画へ >動画狂コーナーへ |