httpsでSubversion

 WebDAVでSVNサーバーを立てたが、ローカルだと接続できたんだけど、職場からやるとhttpのREPORT,MKACTIVITYが職場のproxyではじかれる。PROPFINDはうごいてるっぽいんだが。。色々ググってみるとhttpsならOKらしいので、httpsにする。

apache2のsslを有効にする

 まず、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の設定ってことになる。

CA(認証局 Certificate Authority)の設定

 opensslそのものはインストールされているので、/etc/ssl/openssl.confを編集。

[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

サーバー用の証明書とkeyを作る

さっき設定と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 

apache2をhttpsでうごくようにする

 やっと準備ができた(まだ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は手動で立ち上げなきゃいけないのかな?。


SubversionをSSLにする

 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に通してやるだけのはずだ。

ME6000 前へ戻る