ちなみに私は、「Web ちゃっと(たかのちゃっと)」を SSL で動かしています。多分、ちゃっと業界初の快挙では無いかっ!!と自負しています(^^;V。
毎回、ブラウザから問いかけがうっとうしいと感じられる方や、「CA の認証書」がどうったモノであるかを知りたい方は、私の作った CA の DER をブラウザに組み込んでみてください。あ、この DER は httpsd の向こう側にあります(^^;;。 http://www.running-dog.net/CA/RunDogCA.der
今回は、
日本ベリサインに「ベリサイン・セキュア・サーバ ID」をもらう
自分で CA を立てる場合
と、二つの方法に付いて記述します。当然、apache_SSL インストール、SSLeay のインストール方法に付いても取り上げて見たいと思います。
と、言う事で早速必要となるファイルを持って来ましょう。
1.apache1.2.6 を拾ってきます。 → apache_1.2.6.tar.gz
2.apache1.2.6 を SSL 仕様にするパッチを拾ってきます。 → apache_1.2.6+ssl_1.17.tar.gz
3. 認証に利用するSSLeay を拾ってきます。 → SSLeay-0.8.0.tar.gz
・SLeay-0.8.0 のコンパイル
以上で準備は整いました。では早速コンパイルに掛かりましょう。まず最初は、SSLeay-0.8.0.tar.gz のコンパイルを行い、SSL に対するコマンド群を作製します。詳細に付いては、同梱の INSTALL ファイルを見てコンパイルしてください。
---------------- # cd /usr/local/src # tar xvzfp SSLeay-0.8.0.tar.gz # cd SSLeay-0.8.0 # perl util/perlpath.pl /usr/local/bin *1 # perl util/ssldir.pl /usr/local/ssl *2 # make -f Makefile.ssl links # ./Configure FreeBSD # make clean # make depend;make # make rehash *3 # make test *4 # make install # ----------------*1. Configure 等を実行する為に perl スクリプトの path を変更します。
一応、これで SSL はインストールされました。インストール先は /usr/local/ssl です。
尚、余談ですが、solaris-x86-gcc で make した場合、もしかしたら x509 の make の所で止まってしまうかもしれません。as が失敗するでしょう。原因は Solaris{2.6,2.5.1} for x86 のアセンブラにあるみたいです。そー言う時は、GNU の製品である binutils-2.9.tar.gz をインストールしてあげると無事に通る様になります。
・apache_SSL のインストール
さて、次は apache1.2.6 をコンパイルしましょう。これは、SSL 用のパッチを当ててから make します。
---------------- # cd /usr/local # tar apache_1.2.6.tar.gz # cd apache_1.2.6 # mkdir apache_SSL # cd apache_SSL # cp ~/apache_1.2.6+ssl_1.17.tar.gz ./apache_SSL # tar xvzfp apache_1.2.6+ssl_1.17.tar.gz # cd ../ # tar cvzfp src_ORG.tgz ./src *1 必要であれば backup を。 # cat apache_SSL/SSLpatch | patch # cd src # cp /usr/local/src/apache_1.2.6/apache_SSL/src/* ./ # mule Configuration *2 # ./Configure # make # ----------------*1. 必要であれば src ディレクトリのバックアップを取ってください。
---------------- SSL_BASE=/usr/local/ssl SSL_INCLUDE= -I$(SSL_BASE)/include SSL_CFLAGS= -DAPACHE_SSL $(SSL_INCLUDE) SSL_LIB_DIR= $(SSL_BASE)/lib SSL_LIBS= -L$(SSL_LIB_DIR) -lssl -lcrypto SSL_APP_DIR= $(SSL_BASE)/apps ----------------これで make が正常終了すれば src のディレクトリ内に httpsd と言うファイルが出来ます。これが SSL 用の httpd です。これを適当なディレクトリにコピーして環境を作りましょう。
もし、コンパイル出来ない場合は、以下のパッチを当ててください。CACHE_SESSIONS を FALSE にしないと多分 httpsd が立ち上がらないと思います。httpsd でのキャッシュ機能のようですが、FALSE で問題無いと思われます。もしどうしても使いたい様でしたら、/usr/local/src/apache_1.2.6/apache_SSL/src に入っているので、/usr/local/src/apache_1.2.6/src に cp してください。
---------------- *** apache_ssl.c Wed Aug 5 15:41:53 1998 --- apache_ssl.c.ORG Tue Aug 4 17:21:03 1998 *************** *** 88,97 **** #if SSLEAY_VERSION_NUMBER >= 0x0800 /* Do session caching - only available with SSLeay 0.8.x */ - /* # define CACHE_SESSIONS TRUE - */ - # define CACHE_SESSIONS FALSE #endif /* define this true when SSLeay can do an SSL_free without falling over */ --- 88,94 ---- ----------------
---------------- # cd /usr/local # ln -s /usr/local/src/apache_1.2.6 /usr/local/apache_SSL # cd apache_SSL # cp src/httpsd ./ # cd conf # cp access.conf-dist access.conf # cp httpd.conf-dist httpd.conf # cp srm.conf-dist srm.conf # cp /usr/local/src/apache_1.2.6/apache_SSL/SSLconf/conf/httpd.conf httpd.conf.SSL # ----------------apache を起動させる為には全部で 4 個のファイルが必要になります。access.conf srm.conf mime.types は普通版 apache のをそのまま使っても結構ですが、httpd.conf は SSL 版のを使います。と、言うか、マージして使った方が良いと思われます。一応、以下が apache_SSL に必要と思われる項目の設定例。
---------------- # SSL Port Port 443 # Listen: Listen 443 # SSL SetUP # Disable SSL. Useful in combination with virtual hosts. Note that SSLEnable is # now also supported. #SSLDisable # Set the path for the global cache server executable. # If this facility gives you trouble, you can disable it by setting # CACHE_SESSIONS to FALSE in apache_ssl.c #SSLCacheServerPath /www/ssl/key # Set the global cache server port number, or path. If it is a path, a Unix # domain socket is used. If a number, a TCP socket. #SSLCacheServerPort /www/ssl_work/gcache_port # Set the session cache timeout, in seconds (set to 15 for testing, use a # higher value in real life) #SSLSessionCacheTimeout 15 #SSLSessionCacheTimeout 30 # Set the CA certificate verification path (must be PEM encoded). # (in addition to getenv("SSL_CERT_DIR"), I think). SSLCACertificatePath /www/ssl/key # Set the CA certificate verification file (must be PEM encoded). # (in addition to getenv("SSL_CERT_FILE"), I think). SSLCACertificateFile /www/ssl/key/CryptoCA-crt.pem # Point SSLCertificateFile at a PEM encoded certificate. # If the certificate is encrypted, then you will be prompted for a pass phrase. # Note that a kill -1 will prompt again. # A test certificate can be generated with "make certificate". SSLCertificateFile /www/ssl/key/crypto.pem # If the key is not combined with the certificate, use this directive to # point at the key file. If this starts with a '/' it specifies an absolute # path, otherwise it is relative to the default certificate area. That is, it # means "と、言う項目を追加しました。これらの設定の説明に付いては、以下の URL を参照してください。 → http://japache.infoscience.co.jp/japanese/manual/mod/directives.html/private/ ". SSLCertificateKeyFile /www/ssl/key/crypto-himitsu.key # Set SSLVerifyClient to: # 0 if no certicate is required # 1 if the client may present a valid certificate # 2 if the client must present a valid certificate # 3 if the client may present a valid certificate but it is not required to # have a valid CA SSLVerifyClient 0 # How deeply to verify before deciding they don't have a valid certificate SSLVerifyDepth 10 # Translate the client X509 into a Basic authorisation. This means that the # standard Auth/DBMAuth methods can be used for access control. The user name # is the "one line" version of the client's X509 certificate. Note that no # password is obtained from the user. Every entry in the user file needs this # password: xxj31ZMTZzkVA. See the code for further explanation. SSLFakeBasicAuth ----------# List the ciphers that the client is permitted to negotiate. See the source # for a definitive list. For example: #SSLRequiredCiphers RC4-MD5:RC4-SHA:IDEA-CBC-MD5:DES-CBC3-SHA # These two can be used per-directory to require or ban ciphers. Note that (at # least in the current version) Apache-SSL will not attempt to renegotiate if a # cipher is banned (or not required). #SSLRequireCipher #SSLBanCipher # A home for miscellaneous rubbish generated by SSL. Much of it is duplicated # in the error log file. Put this somewhere where it cannot be used for symlink # attacks on a real server (i.e. somewhere where only root can write). SSLLogFile /usr/local/apache_SSL/logs/marugoto_ssl_log ------
起動する時、普通の httpd は port80 を使用しますが、httpsd の場合は port443 を使います。と、言う事は一台の FreeBSD に二つの httpd が立ち上がると言う事ですね。ただ、現在はまだ、鍵を作ってないので多分立ち上がらないでしょう。では次の項目で実際に鍵を作ってみましょう。
・日本ベリサインに資料提出する為の準備
先にインストールした SSLeay0.8.0 を使います。一応、path に /usr/local/ssl/bin を通してから実際に作業した方がらくちんです。と、言う事で下の順序に従って作っていってみましょう。
まず、その前に今回必要なモノをリストアップしてみましょう。
・まず、SSL で守るドメイン名(FQDN)。今回は以下の URL にします。 httpsd://kuro.running-dog.net/ ・SSL Server で必要とする 秘密鍵 ・ベリサインに提出する書類の一部である CSR ・等々。この他に会社の印鑑証明とか登記簿謄本とかが必要になるでしょう;-)尚、以下で打つコマンドはほとんどが /usr/local/ssl に入っているので path に入れておくと幸せになれます。
--- 1. SSL Server で必要とする秘密鍵を生成する # mkdir -p /www/ssl/key # cd /www/ssl/key # genrsa -des3 -rand /usr/local/bin/mule:/usr/local/bin/tcsh:/bin/sh 1024 > kuro-himitsu.key 1427644 semi-random bytes loaded Generating RSA private key, 1024 bit long modulus ...................+++++ ..+++++ e is 65537 (0x10001) Enter PEM pass phrase: パスフレーズそのいちを入力 Verifying password - Enter PEM pass phrase: パスフレーズそのにを入力 # cat kuro-himitsu.key -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,C9D0FD7141999818 5LHVKxAk7n2tHRYyoLlsaf4/nxjhbZDDxd/6S/cgSHAqDemNHwZFwQn4apu3a947 hoIPPOOULi7iE1abZ3pHGfEjWyJgFMzRCsE5B6rn8MAdzLLVA6G0HxQKLlNmEvA0 vjnEtWOvpITXMP68e05o6BKB6DJlPJp+ZOqYbYrQSbNJV+Vm8zGWPfRQeMQVK02N otG5A3gPr+EQwKVk5XwvDSx4wOfQVRfgjABhKCN5D6j3168lA7Jno92d9/mHWMvv f0nVsiQ3BsmKcYz0+HbM79XH8iwvV0vhURfdH2BS7vANJSEbH3CEEaX9G4ojBTg7 HUsdzOnN6XYDqzJ1hYoqUA543jNoH6cbr1gGHWCRJVMwEJkA0n4llhR6G/pwbqSN dkRuCCwX5t0Ui1p6crW6b8r0nv57iYpzbi9DadBg0DEffiK5DECvLEPFzCdsDI2I KbNdezAN8M70HQC6lxuf9NXMpsukrwRz6xxTQZ31u7NZGK+D29Woyo7haaDg0rk/ cbRey0953kCtqhuAxhCeaBMafdpraeK7sNLMWy/11I5dzwoShLqAOiW7ga0NkVAr BXIxkQab2V5mvzVYWB/FQ0dEmBrwCdM1jo1438fpkpvjY1UVZnlAcP4geIf8/iTX 7F1nBGJF8yAwyYmDaFWm/m4rNpbHqanJZtHg3Vyw5nx3jC7FStY4HNOHj0XC7fp2 LsKYu8GpDJTzSS+DhJiXcv/ZGyuUxP5bvFCGbN2j8R+mglczgYIVs2smedpEHeJ3 ZEwiD/psCa7DUaTaeE9fS0UNLRNW+xlqbUtud8vJ5zmTiZuo/jZpOA== -----END RSA PRIVATE KEY----- # ----------------と、言う事で、SSL Server の秘密鍵が出来ました。ふふふ(^^)。こんな感じです。で、genrsa コマンドの -rand のオプションですが、乱数を取る為に大きいバイナリファイルを 5 個位指定してちょ。って書いてありました。ふみふみ。
で、これで作った秘密鍵は httpsd 起動時、毎回、秘密鍵のパスフレーズを入力しないと起動しません。そんな時は以下のコマンドで、秘密鍵にちょっと手を加える事も可能です。
---------------- # rsa -in kuro-himitsu.key -out kuro-himitsu-nosign.key read RSA private key Enter PEM pass phrase: パスフレーズを入力 writing RSA private key # ----------------出来た kuro-himitsu-nosign.key を httpd.conf の SSLCertificateKeyFile に書いても OK です。さ、続いて、ベリサインに提出する書類の一部である、CSR を作成します。先程作成した秘密鍵を利用します。
---------------- # req -new -key kuro-himitsu.key > kuro.csr Using configuration from /usr/local/ssl/lib/ssleay.cnf Enter PEM pass phrase: 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]:Tokyo 県名を入力 Locality Name (eg, city) []:Shinjuku 市町村を入力 Organization Name (eg, company) [Internet Widgits Pty Ltd]:Running-dog Network 会社を入力 Organizational Unit Name (eg, section) []:Kuro SSL Server 会社名、その他を入力 Common Name (eg, YOUR name) []:kuro.running-dog.net FQDN サーバ名を入力 Email Address []:takachan@running-dog.net 管理者を入力 Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: # ----------------さささ、これで出来上がった、kuro.csr(証明書)をベリサインに送って、署名してもらいましょう。ベリサンインにサインをしてもらった CSR、は、通称、署名付き証明書と言う様で、既に認証局(ベリサインの事)にサインしてもらってあるので httpd.conf に記述しましょう。
SSLCertificateFile /www/ssl/key/kuro.pem
今は kuro.epm と言う名ですが、本当はどういった名前なんでしょうねぇ。私は貧乏人なのでとてもじゃ有りませんが日本ベリサインにはサインしてもらえません・・(^^;;
さて、これとは別に、日本ベリサンは多分、「認証局の証明書」なるものを発行してくれるか、もしくはダウンロード出来る URL を持っていると思います。そこに行って CA の証明書なるモノを取得しましょう。そして、httpd.conf の以下の設定に記述します。何度もいいますが、私はベリサインにサインをしてもらった事は無いの出正式なファイル名を知りません。今回は、CA-crt.pem と言う名にしておきます。
SSSLCACertificateFile /www/ssl/key/CA-crt.pem
更に、先程作った秘密鍵を httpd.conf の以下の設定に記述します。
SSLCertificateKeyFile /var/www/ssl/key/kuro-himitsu-nosign.key
これら三行は必須になりますので、これを記述したら準備は完了。すかさず起動してみましょう。
---------------- # /usr/local/apache_SSL/httpsd -f /usr/local/apache_SSL/conf/httpd.conf ----------------・自分で CA を建ててみよう
---------------- # cd /usr/local/ssl/ # CA.sh -newca CA certificate filename (or enter to create) RunDogCA.conf # ----------------コマンドを実行したディレクトリに demoCA と言うディレクトリを作ってくれます。またこの時、CA のキーファイル名を聞いてきますが、ま、失敗しても特に問題は無いです(^^;;。demoCA と言うディレクトリは作れましたか?では次のステップです。
次に CA の環境設定ファイルを作成して上げます。一応、サンプルは、/usr/local/ssl/lib/ssleay.cnf になりますが、これを適当にカスタマイズしてから、/usr/local/ssl/demoCA に入れて上げましょう。一応、私の CA のコンフィグファイルはこれになります。 → RunDogCA.conf CA の運営方針とかポリシーがあると思うので、思い思いに設定してください;-)。
続いて、CA の公開鍵/秘密鍵のペアを作ります。以下のコマンドです。
---------------- # req -config ./RunDogCA.conf -x509 -new > certs/RunDogCA-ca-key.pem Using configuration from ./RunDogCA.conf Generating a 1024 bit RSA private key .........+++++ ...............+++++ writing new private key to 'private/RunDogCA-homitsu.pem' Enter PEM pass phrase: パスフレーズそのいちを入力 Verifying password - Enter PEM pass phrase: パスフレーズそのにを入力 ----- 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) [JP]: JP 国を入力 State or Province Name (full name) [Some-State]:Tokyo 県名を入力 Locality Name (eg, city) []:Shinjuku 市町村を入力 Organization Name (eg, company) [Internet Widgits Pty Ltd]:Running-dog Network 会社を入力 Organizational Unit Name (eg, section) []:Running-dogCA 会社名、その他を入力 Common Name (eg, YOUR name) []:RunDogCA CA の名前を入力 Email Address []:takachan@running-dog.net 管理者を入力 # ----------------これで、公開鍵/秘密鍵のペアが出来ました。これらの名前と格納ディレクトリは conf ファイルに記述します。注意深く書き込みましょう。
公開鍵 certs/RunDogCA-ca-key.pem
秘密鍵 private/RunDogCA-homitsu.pem
第一段の段階である、CA の原型が完成しました。メデタシめでたし。続いて次のステップに移りましょう。
・CA の証明書の作成
、さ、公開鍵/秘密鍵を大切に保管するとともに、続いて、CA の証明書を発行して、自分の CA でその「CA の証明書」に署名して上げましょう;-)。人の証明書に署名する前にまずは自分のに対して署名します。
まず、第一段階として、「CA の証明書」を作成します。以下の手順になります。
---------------- # req -config ./RunDogCA.conf -new > RunDogCA-ca Using configuration from ./RunDogCA.conf Generating a 1024 bit RSA private key ..............................+++++ ...................+++++ writing new private key to 'private/RunDogCA-homitsu.pem' Enter PEM pass phrase: CA のパスフレーズそのいちを入力 Verifying password - Enter PEM pass phrase: CA のパスフレーズそのにを入力 ----- 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) [JP]:JP 国を入力 State or Province Name (full name) [Some-State]:Tokyo 県名を入力 Locality Name (eg, city) []:Shinjuku 市町村を入力 Organization Name (eg, company) [Internet Widgits Pty Ltd]:Running-dog Network 会社を入力 Organizational Unit Name (eg, section) []:Running-dogCA 会社名、その他を入力 Common Name (eg, YOUR name) []:RunDogCA CA の名前を入力 Email Address []:takachan@running-dog.net 管理者を入力 Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: # ----------------これで 「CA の証明書」が出来ました。この、「自分で作った CA の証明書」に対して、「自分で作った CA の証明書に署名」してあげます(^^;;。
---------------- # ca -config ./RunDogCA.conf -in RunDogCA-ca > RunDogCA-ca-cert.pem Using configuration from ./RunDogCA.conf Enter PEM pass phrase: Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows countryName :PRINTABLE:'JP' stateOrProvinceName :PRINTABLE:'Tokyo' localityName :PRINTABLE:'Shinjuku' organizationName :PRINTABLE:'Running-dog Network' organizationalUnitName:PRINTABLE:'Running-dogCA' commonName :PRINTABLE:'RunDogCA' emailAddress :IA5STRING:'takachan@running-dog.net' Certificate is to be certified until Sep 16 07:12:28 1999 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 を信用してくれる人々に配る事にしましょう;-)。と、言う事で一般公開します。普通、認証してもらう SSL Server 管理者 は、自分の httpsd の、httpsd.conf に
SSSLCACertificateFile /www/ssl/key/RunDogCA-ca-cert.pem
と、言う様な感じで宣言します。これで、SSL Server は起動する様になるでしょう。ふみふみ。順調に進んでいますね。では次のステップに進みましょう;-)。
・SSL Server 証明書に署名をする
今回は、kuro.running-dog.net と言う FQDN を持つ SSL Server を建てています。その CSR (証明書)に署名するつものですので、すかさず、自分の作った CA で kuro.running-dog.net の SSL Server の証明書に署名してあげましょう。
---------------- # ca -config ./RunDogCA.conf -in ./kuro.csr > ./kuro-ssl.cer Using configuration from ./RunDogCA.conf Enter PEM pass phrase: Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows countryName :PRINTABLE:'JP' stateOrProvinceName :PRINTABLE:'Tokyo' localityName :PRINTABLE:'Shinjuku' organizationName :PRINTABLE:'Running-dog Network' organizationalUnitName:PRINTABLE:'Kuro SSL Server' commonName :PRINTABLE:'kuro.running-dog.net' emailAddress :IA5STRING:'takachan@running-dog.net' Certificate is to be certified until Sep 16 07:12:28 1999 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 の環境が正しく整っていない事を示しています。conf ファイルを正しく設定して、CA の 公開鍵/秘密鍵の作成の所から実行しなおしましょう。
さて、このコマンドを実行する事により、kuro.running-dog.net の CSR に対してサイン(署名)し、CER がが出来ました。これで、CA のお仕事も無事完了です。ふみふみ。
・最後に 再度 SSL Server の設定
さささ、CA で二つのファイルに署名しました。その署名したファイルをいよいよ、SSL Server に設定します。管理者は自分の httpsd の、httpsd.conf に
SSSLCACertificateFile /www/ssl/key/RunDogCA-ca-cert.pem
SSLCertificateFile /www/ssl/key/kuro.cer
SSLCertificateKeyFile /var/www/ssl/key/kuro-himitsu-nosign.key
と、言う様な感じで宣言します。上から順に
・CA の署名付き証明書
・SSL Server の証明書(CA の署名入り)
・SSL Server の秘密鍵
SSL Server のセットアップは完了となります。これで完了になります。後、httpd.conf、srm.conf、access.conf には他にいもいろいろな設定が出来るのですが、SSL に直接関係する所はこれ位(と、これとは別に上の方で書いていますのでそっちを参考にしてください)なので、一切はしょっています。他の設定は自分で頑張ってください。
さて、CA の方ですが、公開するといろいろな人から「この鍵、サインしてよ。」等とメールが届く様になります;-)。まぁ、お友達感覚は CA として重宝さされる様になる事でしょう。と、言う事で、ブラウザに登録する情報を DER として変換して、Web からダウンロード出来る様にしましょう。
---------------- # x509 -inform pem -outform der < certs/RunDogCA-ca-key.pem > RunDogCA.der ----------------CA の公開鍵を der 形式で、RunDogCA.der と言うのを作成します。これを CA のサーバからダウンロード出来る様にします。私の場合でしたら、http://www.running-dog.net/CA/RunDogCA.der からダウンロード出来る様にしています。この時、www.running-dog.net の httpd の mime の設定ファイルである mime.types に以下の行を追加してあげましょう。
---------------- application/x-x509-ca-cert der pem ----------------・SSL Server その後、と・・。
最後にですが、「日本ベリサイン」等と結構固有名詞を出してしまったりしてしまいましたが、これはだいじょぶなのかな?ごめんなさい。> 日本ベリサインさん(^^;;。ちなみに ベリサインも apache SSL の証明書にもサインしてくれる様になりました。皆さんもどしどし SSL サーバ立てましょう;-)。高いけどね・・;-P。