WebDAVでSVNサーバーを立てたが、ローカルだと接続できたんだけど、職場からやるとhttpのREPORT,MKACTIVITYが職場のproxyではじかれる。PROPFINDはうごいてるっぽいんだが。。色々ググってみるとhttpsならOKらしいので、httpsにする。
まず、apache2のsslを有効にする。
$ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled/ssl.conf $ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ssl.load
#ここでググった結果、色々なところに書いてあるapache2-ssl-certificateがないことに気がつく・・・。う、この前ちょっといじった時にapache2.2になってる・・・。apache2.2にはないんだそうな・・・。この前phpがなくなっちゃったのはこのせいだったか・・・。というか、Debian etchになってるぞ?。ここから下はDebian SargeじゃなくてDebian etchとApache2.2.3の設定ってことになる。
[usr_cert] # This is OK for an SSL server. nsCertType = server [v3_ca] nsCertType=sslCA,emailCA
こうね。意味?わかんね・・・。というかOpenSSLの担う範囲がわかんね。。OpenSSLを使ったCAの構築←ここがわかりやすそう。後で読んでおこう。
そんで、CA認証ファイルを作ると。
#cd /usr/lib/ssl/misc #.CA.sh CA certificate filename (or enter to create) ←リターンでOK。demoCA以下に作られる。 Making CA certificate ... Generating a 1024 bit RSA private key ..++++++ ........++++++ writing new private key to './demoCA/private/./cakey.pem' Enter PEM pass phrase:←適当にパスワードを Verifying - 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]:←空でリターン State or Province Name (full name) [Some-State]:←リターン Locality Name (eg, city) []:←リターン Organization Name (eg, company) [Internet Widgits Pty Ltd]:←リターン Organizational Unit Name (eg, section) []:←リターン Common Name (eg, YOUR name) []:←なんか入れる。名前でもなんでも。XXXとか。 Email Address []:←リターン Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: ←リターン An optional company name []:←リターン Using configuration from /usr/lib/ssl/openssl.cnf Enter pass phrase for ./demoCA/private/./cakey.pem:←さっき入れたパスワード Check that the request matches the signature Signature ok Certificate Details: Serial Number: 0 (0x0) Validity Not Before: Feb 27 00:26:30 2008 GMT Not After : Feb 26 00:26:30 2011 GMT Subject: countryName = AU stateOrProvinceName = Some-State organizationName = Internet Widgits Pty Ltd commonName = XXX X509v3 extensions: X509v3 Basic Constraints: Netscape Cert Type: SSL Server Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: X509v3 Authority Key Identifier: Certificate is to be certified until Feb 26 00:26:30 2011 GMT (1095 days) Write out database with 1 new entries Data Base Updated
成功するとこんな感じでなんか出てくる。失敗しちゃったら、demoCAディレクトリごと消してもう一回やればいい。 有効期限は3年になってるね。
それと、さっき作られた秘密鍵をroot以外で見えなくしておく。
#cd demoCA/private #chmod 600 cakey.pem #cd .. #chmod 700 private
ここまででSAの設定は終わり。ここで出来た秘密鍵は名前の通りCAの秘密鍵。で、CAのデフォルトの設定が/usr/lib/ssl/openssl.cnfってファイルに書いてあるが、dir設定が相対パスになっているので、絶対パスに変えておく。
[ CA_default ] dir = /usr/lib/ssl/misc/demoCA # Where everything is kept
さっき設定とCA(認証局だそうな・・)とapache2をつなげてやらにゃいかん。ってさっきsslCA,mailCAを有効にしたけどmailCAはいらないんじゃ・・・まぁいいか。
さっきmod_sslは入れて、有効にした。で、今度はサーバーとクライアントでやり取りする鍵をapacheがクライアントに渡せるようにしなきゃならんと。
#cd /etc/apache2 #mkdir ssl #cd ssl #mkdir private
/etc/apache2/sslの中に公開鍵,ssl/privateの中に秘密鍵をおいておく。なので、/etc/apache2/sslの中でサーバーキーを作る。秘密鍵はserver_key.pemでcsr.pemは証明書要求ファイル。さっきと同じように認証のための項目が出てくるので入れる。これはサーバー用なのでさっきとは別のもの。パスワードも別にしておく。これが出来た後、csr.pemを使ってCAとの間で認証を取り、証明書を作ると。
#cd /etc/apache2/ssl #openssl req -new -keyout server_key.pem -out csr.pem
ここまででサーバー用の秘密鍵と証明書要求ファイルが出来た。次に、csr.pemをCAに送りつけて証明書を発行してもらう。/usr/lib/ssl/openssl.cnfを書き直しておかないとここでエラーが出る。ここでCAのパスワードを聞かれる。
#openssl ca -out cert.pem -infiles csr.pem Using configuration from /usr/lib/ssl/openssl.cnf Enter pass phrase for /usr/lib/ssl/misc/demoCA/private/cakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 2 (0x2) Validity Not Before: Feb 27 03:22:30 2008 GMT Not After : Feb 26 03:22:30 2009 GMT Subject: countryName = AU stateOrProvinceName = Some-State organizationName = Internet Widgits Pty Ltd commonName = XXX X509v3 extensions: X509v3 Basic Constraints: Netscape Cert Type: Netscape Comment: X509v3 Subject Key Identifier: X509v3 Authority Key Identifier: Certificate is to be certified until Feb 26 03:22:30 2009 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
有効期限が1年。
有効期限を延ばすなら
#openssl ca -days 2000 -out cert.pem -infiles csr.pem
とかってやればいい。CAの有効期限が3年だから3年以上は出来ないと思うけど。
ここで出来たファイルを見ると
#ls cert.pem csr.pem private server_key.pem
server_key.pemがサーバー用に作った秘密鍵、csr.pemがCAに対する証明書要求ファイル(証明書貰ったからいらないと思う)、cert.pemが証明書。
とりあえずserver_key.pemはprivateの中にあるべきらしいので、移す。
#mv server_key.pem private
それとapache2.2ではx509形式みたいなので変換
#openssl x509 -in cert.pem -out cert.crt
やっと準備ができた(まだhttpsまでだけど)。で、次、httpsの設定をするわけだが、ひな形があるらしい。apache2とapache2.2では違うので見つけるまでに時間がかかった。
#cd sites-available #cp /usr/share/doc/apache2.2-common/examples/apache2/extra/httpd-ssl.conf.gz . #Gzip -d httpd-ssl.conf.gz
んでもってhttpd-ssl.confを編集
<VirtualHost *:443> DocumentRoot "/home/html" ServerName XXX.ddo.jp:443 ErrorLog /var/log/apache2/error_log-443 TransferLog /var/log/apache2/access_log-443 SSLCertificateFile /etc/apache2/ssl/cert.crt SSLCertificateKeyFile /etc/apache2/ssl/private/server_key.pem
んでこのファイルをsites-enabledの中にシンボリックリンクを張る。張るんだが、専用のツールが用意されてた。知らんかった。というか、ここで絶対パスで指定するんなら、server_keyとかどこにあってもいいってことじゃん。
#a2ensite httpd-ssl.conf
こうすると、sites-enableの中にシンボリックリンクが張られる。で、apache2再起動。
#/etc/init.d/apache2 restart
アクセスしてみるも動かない。。・・そういえば、一番最初にapacheの設定をした時に、VirtualHostの設定があるとhttpd.confの値が上書きされるから、横着して読み込まないように変更したような・・・。がーん!VirtualHostの読み込み部分がコメントアウトしてある・・・。
しょうがないので、/etc/apache2/apache2.confの一番したのvirtualhostのところのコメントアウトをはずして、sites-availableのdefaultをhttpd.confと同じように書き換える。ここで*:80にしておかないと、80と443の区別がつかなくてエラーがでるので重要。VirtualHostってこういう用途に使う物なのか?。
NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot "/home/html/" <Directory "/home/html/"> Options All AllowOverride All allow from all </Directory> ErrorLog /var/log/apache2/error.log LogLevel warn CustomLog /var/log/apache2/access.log combined ServerSignature On </VirtualHost>
これでapacheの再起動!。すると、passを要求されるので、2つ目のサーバー用に作ったときのパスワードを入れる。
#/etc/init.d/apache2 restart Forcing reload of web server (apache2)... waiting Apache/2.2.3 mod_ssl/2.2.3 (Pass Phrase Dialog) Some of your private key files are encrypted for security reasons. In order to read them you have to provide the pass phrases. Server XXX:443 (RSA) Enter pass phrase: OK: Pass Phrase Dialog successful. .
これでhttps://192.168.11.9/とアクセスして”不明な認証機関で署名されています、接続しますか?”とかってのが出ればとりあえずhttpsはOK。
#この自分でCAたてちゃうやつを「オレオレ認証」って言うんだって。いい表現だなw。
それはいいとして、これって、サーバーの電源落としたらapacheは手動で立ち上げなきゃいけないのかな?。
CAの設定もapacheのSSL化もうまくいったのでいよいよSubversionをSSLにする。とは言ってもmods-enable/dav_svn.confにSSLRequireSSLと追加するだけ。
<Location /svn> DAV svn SVNParentPath /home/svn SSLRequireSSL </Location>
でapacheを再起動。すると、http://192.168.11.9/svn/moduleでは見れなくなって、https://192.168.11.9/svn/moduleで見れるようになる。
次はコマンドラインクライアントでテスト
$cd test $svn co https://192.168.11.9/svn/module Error validating server certificate for 'https://192.168.11.9:443': - The certificate is not issued by a trusted authority. Use the fingerprint to validate the certificate manually! - The certificate hostname does not match. Certificate information: ~略~ (R)eject, accept (t)emporarily or accept (p)ermanently? p←pを入力 Checked out revision 0.
host名が違いますとか出てるけど、LANの中でやってるからしょうがない。でも出来たっぽい。
いやぁ、長かったなぁ。ここまでやると、家へのアクセスが暗号化されるから職場のproxyに残らなくていいね。rep2とかもsslアクセスできると、いいかもしれない。
あとは、ルーターの443ポートを開けて、192.168.11.9に通してやるだけのはずだ。
Copyright (C) 2009 俺 All right reserved.