天天看點

安裝配置Apache+SVN+SSL

本文主要内容轉載自http://hi.baidu.com/taotling/blog/item/1e4b41502d89435a1138c212.html

做了些修改和标記,重新釋出在這裡了。呵呵,謝謝原作者。

環境:Windows

測試CollabNetSubversion-server-1.6.0-7.win32.exe安裝通過。 

1. 簡要說明

版本庫如果存放在本機,可以使用file://協定來通路,也可以将它們放在一個伺服器上,

使用http://或svn://協定來通路。http://和svn://這兩種協定也可以被加密成https://及svn+ssh://。

在所有的Subversion伺服器配置方式中,基于Apache的是最靈活的且好處多多的:

【WebDAV】

    基于Apache配置的Subversion伺服器使用了被許多其它程式支援的WebDAV協定。

    舉個例子,可以在Windows的資料總管中将這樣的一個版本庫挂載成一個“Webfolder”,

    然後像檔案系統中的其它檔案夾一樣通路它。

【浏覽版本庫】

    可以在不安裝Subversion用戶端的情況下,使用浏覽器來浏覽版本庫中的内容。

    這将使得更大範圍的使用者可以通路資料。

【使用者驗證】

    可以使用任何Apache支援的驗證機制,包括SSPI和LDAP。

【安全】

    Apache是非常的穩定和安全,是以你的版本庫自然而然地擁有同樣的安全性。包括SSL加密。

2. 下載下傳安裝Subversion

整合的Subversion從:http://www.collab.net/downloads/subversion/

的Subversion:CollabNet Subversion Server and Client v1.6.0 (for Windows)

得到:CollabNetSubversion-server-1.6.0-7.win32.exe安裝檔案。

圖形界面用戶端:從http://tortoisesvn.net/downloads

得到:TortoiseSVN-1.6.0.15855-win32-svn-1.6.0.msi安裝檔案。

運作CollabNetSubversion-server-1.6.0-7.win32.exe 進行Subversion伺服器的安裝:

可看出這個版本的Subversion不光有SVNSERVE,還附帶了Apache HTTP Server元件,

上面的Apache(MOD_DAV_SVN)就是。當然,這個版本還有自帶SSL需要的元件。

假設我們将軟體安裝在D:/Program/CollabNet Subversion Server/

選擇Subversion Server的端口與Repository路徑。并且将這個伺服器作為Windows的一個服務運作。

(SVN和Apache內建時,Subversion Server不需要啟動。)

配置Apache HTTP Server,同樣可選中“Install Apache to run as a Windows service”

将Apache注冊作為一個Windows服務。其中Repository Location Prefix (版本庫位置字首)

就是将要在httpd.conf配置檔案中配置的<Location /svn>中的/svn,

也就是在浏覽器中輸入的:http://localhost:82/svn/xxx ,(這裡指定了端口為82)

這一步的配置将被寫入D:/Program/CollabNet Subversion Server/httpd/httd.conf配置檔案中。

安裝完後,可以打開Windwos的服務,可以看到Subversion Server的服務的顯示名稱,

其服務名稱為svnserve。啟動類型是自動,也就是說在下次機器重新開機後,這個服務會自動運作。

安裝完後Subversion的相關路徑會自動加入環境變量PATH。

安裝Server的時間比較長,打開任務管理器,看到有類似nsXXX.tmp的程序在執行,

其中的XX是會遞增的變化的,這表示安裝還在進行之中,

至于為什麼這麼慢還未知(或許是我的系統的設定問題)...等待吧。

安裝完後,确定Apache伺服器已啟動,如果沒有啟動,到Suversion的安裝目錄下,

找到/httpd/bin/httpd.exe,執行這個程式啟動Apache伺服器。

如果啟動不了,注意檢查端口是否被占用。

如果端口被占用,在CMD下用netstat –na > C:/portnumber.txt指令,

将所有用到的端口号輸入portnumber.txt檔案,打開portnumber.txt檔案,

查找一下相關端口被哪個程序占用,然後KILL這個程序釋放被占用的端口,

(或者修改httpd.conf中的listen值)然後可重新啟動Apache伺服器。

在浏覽器位址欄中輸入http://localhost:82或http://IPAddress:82出現It work!

說明這個版本自帶的Apache HTTP Server安裝配置成功。

如果将Apache安裝成一個服務,它将以本地system帳戶來運作。

為Apache建立一個單獨的使用者來運作它将會更安全一些。

如果在NTFS檔案系統下,要確定運作Apache的使用者有版本庫的完全通路權限。

否則,在用WEB方式通路版本庫的時候,通路是要被拒絕的,使用者會得到"禁止通路"的錯誤資訊,

在Apache的錯誤日志中表現為錯誤HTTP 500。。

3. 運作TortoiseSVN-1.6.0.15855-win32-svn-1.6.0.msi進行Subversion的用戶端安裝:

用戶端的安裝沒有什麼要注意的,但安裝完後要記得重新開機。

4. COPY相關檔案以及配置Apache HTTP Server 的httd.conf檔案:

使用資料總管,進入Sibversion的安裝目錄

(D:/Program/Subversion/CollabNet Subversion Server)下,找到檔案:

   libsvn_delta-1.dll

   libsvn_fs-1.dll

   libsvn_repos-1.dll

   libsvn_subr-1.dll

将這幾個檔案COPY到D:/Program /CollabNet Subversion Server/httpd/bin目錄中。

使用如記事本之類的文本編輯器編輯Apache的配置檔案

(D:/Program /CollabNet Subversion Server/httpd/conf/httd.conf),修改以下内容:

去掉以下行的注釋(将開頭的#删除):

   #LoadModule dav_fs_module modules/mod_dav_fs.so

在LoadModule節的最後添加以下一行:

   LoadModule authz_svn_module modules/mod_authz_svn.so

以上是讓Apache HTTP Server裝載子產品,以支援Subversion以Web的方式浏覽版本庫。

現在,Apache還不知道如果處理像TortoiseSVN一樣的Subversion用戶端。

要讓Apache知道哪個URL将被Subversion使用,

要像下面這樣編輯Apache HTTP Server的配置檔案

(D:/Program/CollabNet Subversion Server/httpd/conf/httd.conf)

在配置檔案的最後添加下面這些行:

   <Location /svn>

    DAV svn

    SVNParentPath D:/SVN

    AuthType Basic

    AuthName "Subversion repositories"

    AuthUserFile D:/passwd

    #AuthzSVNAccessFile D:/svnaccessfile

    Require valid-user

   </Location>

這樣配置表示:所有的版本庫将位于D:/SVN目錄下,

要通路版本庫可以使用這樣的URL:http://localhost:82/svn/p1

(其中P1或P1是版本庫中的子項目,這裡假定已經将D:/SVN /P1目錄做為一個版本庫了,

而P1中的P是不分大小寫的,也就是說可以是http://localhost:82/svn/p1 ,

也可以是http://localhost:82/svn/P1。

另外,URL裡的svn即上上面httd.conf中配置最後所添加的<Location /svn>中的svn,

注意浏覽器中輸入的svn要與<Location /svn>中的一樣,大寫小寫是區分的,

比如<Location /SVN>與<Location /svn>是兩個不同的配置),

通路權限将由passwd檔案中的使用者名/密碼來限制。

注意,上面的URL不能寫成:http://localhost:82/svn 這樣是通路不到的,

即使把D:/svnabc也當作一個版本庫,也通路不到。會出現HTTP404的錯誤。

(這個問題應該能解改寫配置檔案來解決,先暫留。)

關于上面這段配置檔案内容的說明:

<Location /svn>

   表示可通過URL(http://hostname/svn)來通路Subversion版本庫,

   注意紅字部分與配置中所寫的要一樣,而且大小寫是區分的。

DAV svn

   讓Apache知道負責此部分的子產品是哪個。

SVNListParentPath on

   在Subversion 1.3及更高版本中,

   這個配置使得Subversion列出由SVNParentPath指定的目錄下所有的版本庫

SVNParentPath D:/SVN

   告訴Subversion在目錄D:/SVN下尋找版本庫

AuthType Basic

   啟用基本的驗證,比如使用者名/密碼驗證

AuthName "Subversion repositories"

   當一個驗證對話框彈出時,告訴使用者這個驗證是用來做什麼的

   在彈出的對話框中的“Subersion repositories in taotling.com”

   就是前面配置檔案中所寫的相關AuthName的内容。

AuthUserFile D:/passwd

   指定D:/passwd為密碼檔案,用來驗證使用者的使用者名及密碼

   注意如果這個密碼檔案的路徑帶有空格,要加上雙引号,比如:

   AuthUserFile “D:/Program/CollabNet Subversion Server/httpd/conf/passwd”

   如果不加上雙引号,啟動Apache HTTP Server時會報錯找不到這個檔案。

   對于配置檔案中的與路徑相關的,如果路徑帶有空格,要注意将路徑用雙引号引起來。

AuthzSVNAccessFile D:/svnaccessfile

   指定D:/svnaccessfile來限定各個使用者或組在版本庫中目錄的通路權限

Require valid-user

   限定使用者隻有輸入正确的使用者名及密碼後才能通路這個路徑

   如果想讓所有使用者對版本庫都有讀的權限而隻有特定的使用者才有寫的權限,

   可以将這行Require valid-user改為:

    <LimitExcept GET PROPFIND OPTIONS REPORT>

     Require valid-user

    </LimitExcept>

上面的配置使用了passwd檔案将你所有的版本庫作為一個單元來限定通路權限。

如果想獲得更多的控制,如限定某個使用者可以通路版本庫中的哪個目錄,可以把下面這行的#去掉:

   #AuthzSVNAccessFile D:/svnaccessfile

然後用文本編輯器建立一個Subversion授權檔案。

Apache将確定隻有有效的使用者可以通路/svn的位置,

然後将使用者名傳到AuthzSVNAccessFile子產品,

這樣可以依據Subversion授權檔案得到更精細的權限控制。

注意,路徑将被指定為[庫:路徑]或者簡單的[路徑]。

如果不明确指定一個庫,通路規則将應用到由SVNParentPath指定的目錄下所有的版本庫中。

一個授權檔案例子可能像這樣:

   [groups]

    admin = john, kate

    devteam1 = john, rachel, sally

    devteam2 = kate, peter, mark

    docs = bob, jane, mike

    training = zak

   # 為所有庫指定預設通路規則

   # 所有人可以讀,管理者可以寫,危險分子沒有任何權限

   [/]

    * = r

    @admin = rw

    dangerman =

   # 允許開發人員可以完全通路他們的項目版本庫

   [proj1:/]

    @devteam1 = rw

   [proj2:/]

    @devteam2 = rw

   [bigproj:/]

    @devteam1 = rw

    @devteam2 = rw

    trevor = rw

   # 文檔編寫人員對所有的docs目錄有寫權限

   [/trunk/doc]

    @docs = rw

   # 教育訓練人員可以完全通路教育訓練版本庫

   [TrainingRepos:/]

    @training = rw

要建立passwd檔案,可以打開指令行(DOS視窗),

将目前目錄切換到apache2目錄(D:/Program/CollabNet Subversion Server/httpd),

然用指令建立檔案:

   bin/htpasswd -c passwd <username>

此指令執行bin目錄下的htpasswd.exe來建立一個密碼檔案,比如:

   bin/htpasswd –c passwd taotling

這表示通過htpasswd.exe的-c參數,建立一個檔案名為passwd的檔案,

檔案裡有使用者名和對應的密碼,使用者名為taotling,其密碼是MD5的算法得出的一串字元串。

将産生的這個檔案(passwd,位于D:/Program/CollabNet Subversion Server/httpd下)

移動到httd.conf最後配置的AuthUserFile “PATH” 中的PATH的位置,重新開機Apache服務。

将浏覽器指向http://localhost/svn/P1(P1是之前建立的Subversion版本庫)。

如果一切正常,你将被提示輸入使用者名密碼,輸入正确的使用者名密碼後你就可以看到版本庫中的内容了。

5. 使用SSL增強伺服器的安全:

以上的工作已經可以讓svn伺服器正常工作了。如果要更安全一些,可以配置ssl來保護伺服器。

Subversion自帶了SSL所需要的元件,下面這些相應的檔案都處于

D:/Program/CollabNet Subversion Server/httpd/modules相應的目錄内;

另外,還可從D:/Program/CollabNet Subversion Server/httpd/conf/extra中找到http-ssl.conf檔案,

這個配置檔案是Apache下使用SSL的配置檔案。

打開Apache配置檔案(httpd.conf),去掉這行的注釋:

   #LoadModule ssl_module modules/mod_ssl.so

這是使Apache裝載支援SSL的子產品。

對D:/Program/CollabNet Subversion Server/httpd/conf/extra/http-ssl.conf檔案進行配置:

安裝完Subversion後,對于http-ssl.conf,Subersion并沒有自動去配置好,

是以需要進行比配置httpd.conf還要多很多的工作,找到以下的配置項:

   SSLSessionCache "shmcb:D:/vinithra/build/svn_1.5.1/subversion/../httpd/tmp/httpd/Apache/logs/ssl_scache(512000)"

   DocumentRoot "D:/vinithra/build/svn_1.5.1/subversion/../httpd/tmp/httpd/Apache/htdocs"

   ServerName www.example.com:443

   ServerAdmin [email protected]

   ErrorLog "D:/vinithra/build/svn_1.5.1/subversion/../httpd/tmp/httpd/Apache/logs/error.log"

   TransferLog "D:/vinithra/build/svn_1.5.1/subversion/../httpd/tmp/httpd/Apache/logs/access.log"

   SSLCertificateFile "D:/vinithra/build/svn_1.5.1/subversion/../httpd/tmp/httpd/Apache/conf/server.crt"

   SSLCertificateKeyFile "D:/vinithra/build/svn_1.5.1/subversion/../httpd/tmp/httpd/Apache/conf/server.key"

   <Directory "D:/vinithra/build/svn_1.5.1/subversion/../httpd/tmp/httpd/Apache/cgi-bin">

    SSLOptions +StdEnvVars

   </Directory>

   CustomLog "D:/vinithra/build/svn_1.5.1/subversion/../httpd/tmp/httpd/Apache/logs/ssl_request.log" /

          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x /"%r/" %b"

将以上的路徑改為安裝Subversion的相應的路徑,并注意路徑分隔符要用/;

對于ServerName,如果是本地機,請用其本地的IP,如果是伺服器,用伺服器的IP位址或域名;如:

   SSLSessionCache "shmcb: D:/Program/CollabNet Subversion Server/httpd/logs/ssl_scache(512000)"      

   #----修改路徑

   DocumentRoot " D:/Program/CollabNet Subversion Server/httpd/htdocs"

   #----修改路徑

   ServerName 192.168.1.2:443

   #----修改伺服器名或IP或域名

   ServerAdmin [email protected]

   #----修改郵箱位址

   ErrorLog " D:/Program/CollabNet Subversion Server/httpd/logs/error.log"

   #----修改路徑

   TransferLog " D:/Program/CollabNet Subversion Server/httpd/logs/access.log"

   #----修改路徑

   SSLCertificateFile " D:/Program/CollabNet Subversion Server/httpd/conf/ssl/server.der.crt"

   #----修改路徑;注意這個路徑是将來生成認證與密鑰後存放的位置。

   SSLCertificateKeyFile " D:/Program/CollabNet Subversion Server/httpd/conf/ssl/server.key"

   #----修改路徑;注意這個路徑是将來生成認證與密鑰後存放的位置。

   <Directory " D:/Program/CollabNet Subversion Server/httpd/cgi-bin">

   #----修改路徑

   SSLOptions +StdEnvVars

   </Directory>

    CustomLog " D:/Program/CollabNet Subversion Server/httpd/logs/ssl_request.log" /

     "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x /"%r/" %b"

   #----修改路徑

生成認證書:

用openssl來生成認證書,需要一個配置檔案:openssl.cnf ,

這個檔案處于D:/Program/CollabNet Subversion Server/httpd/conf 目錄下,

但顯示在Windows中時,是operssl,有點像一個快捷方式,

可以用檔案編輯器打開這個檔案進行配置。

下面要建立一個SSL證書。打開一個指令行視窗,

然後cd到Apache目錄(比如D:/Program/CollabNet Subversion Server/httpd),

用以下指令生成 .rnd、privkey.pem、server.csr三個檔案:

   bin/openssl req -config conf/openssl.cnf -new -out server.csr

回車後将被問及一句密碼短語。

   D:/Program/CollabNet Subversion Server/httpd>bin/openssl req -config conf/openssl.cnf -new -out server.csr

   Loading 'screen' into random state - done

   Generating a 1024 bit RSA private key

   .................++++++

   ......++++++

   writing new private key to 'privkey.pem'

   Enter PEM pass phrase:I’m a hero.

   Verifying - Enter PEM pass phrase:I’m a haro

   Verify failure

   Enter PEM pass phrase:I’m a hero.

   Verifying - Enter PEM pass phrase:I’m a hero.

   -----

   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]:CN

   State or Province Name (full name) [Some-State]:Beijing

   Locality Name (eg, city) []:Beijing

   Organization Name (eg, company) [Internet Widgits Pty Ltd]:Paradise

   Organizational Unit Name (eg, section) []:nonsection

   Common Name (eg, YOUR name) []:Paradise

   Email Address []:[email protected]

   Please enter the following 'extra' attributes to be sent with your certificate request

   A challenge password []:不填

   An optional company name []:不填

   D:/Program/CollabNet Subversion Server/httpd>

下一步,敲入以下指令生成 server.key 檔案:

   bin/openssl rsa -in privkey.pem -out server.key

   D:/Program/CollabNet Subversion Server/httpd>bin/openssl rsa -in privkey.pem -out server.key

   Enter pass phrase for privkey.pem:I’m a hero.

   writing RSA key

   D:/Program/CollabNet Subversion Server/httpd>

上面的指令會提示Enter pass phrase for privkey.pem:

輸入上一個指令時輸入的Enter PEM pass phrase:即可。

下一步,建立一個4000天後才過期的證書server.cert 檔案:

   bin/openssl x509 -in server.csr -out server.cert -req -signkey server.key -days 4000

   D:/Program/CollabNet Subversion Server/httpd>bin/openssl x509 -in server.csr -out server.cert -req -signkey server.key -days 4000

   Loading 'screen' into random state - done

   Signature ok

  subject=/C=CN/ST=Beijing/L=Beijing/O=Paradise/OU=NONE/CN=taotling/[email protected]

   Getting Private key

   D:/Program/CollabNet Subversion Server/httpd>

最後用指令建立檔案server.der.crt :

   bin/openssl x509 -in server.cert -out server.der.crt -outform DER

   D:/Program/CollabNet Subversion Server/httpd>bin/openssl x509 -in server.cert -out server.der.crt -outform DER

   D:/Program/CollabNet Subversion Server/httpd>

這些指令在Apache目錄下建立了一些檔案

(server.der.crt, server.csr, server.key, .rnd, privkey.pem, server.cert)。

将server.der.crt和server.key檔案拷貝到目錄conf/ssl

(比如C:/program files/apache group/apache2/conf/ssl),ssl目錄可自己建立。

然後重新開機Apache服務。

現在可以用類似這樣的url來通路你的版本庫了https://localhost/svn/P1

強制通過SSL來通路

當配置了SSL來提高版本庫安全時,可能想禁用無SSL的http通路方式,而隻允許通過https通路。

要達到這種效果,要在httd.conf配置檔案中的<Location>塊加入另外一個訓示器SSLRequireSSL。

一個示例<Location>塊可能像這樣:

   <Location /svn>

    DAV svn

    SVNParentPath D:/SVN

    SSLRequireSSL

    AuthType Basic

    AuthName "Subversion repositories"

    AuthUserFile passwd

    #AuthzSVNAccessFile svnaccessfile

    Require valid-user

   </Location>

一旦使用了SSLRequireSSL,對于版本庫的通路,隻能通過https:// 的方式來通路,

如果用http:// 的方式來通路,會收到HTTP 403錯誤

(此錯誤(HTTP 403 禁止)表示此程式可以連接配接到該網站,但是沒有檢視該網頁的權限。)

配置不成功或Apache HTTP Server啟動不了的第一個要做的事就是确定你的端口沒有被占用。

注意事項:

1. 确定你的80和443端口沒有被占用:

   在CMD下可用netstat -ano來檢視,如果太多,可将其生成一個txt檔案,

    netstat -ano > c:/portnumber.txt

   再用較好的文本編輯器查找,比如EditPlus。

   如果都被占又無法丢掉正占用這些端口的程式,就改掉端口号。

   相應在httpd.conf與http-ssl.conf中改掉。

2. 如果Apache服務啟動不了,請用Windows自帶的事件檢視器檢視是什麼原因,比如:

    The Apache service named reported the following error:>>>

    (OS 10048)通常每個套接字位址(協定/網絡位址/端口)隻允許使用一次。

    : make_sock: could not bind to address 0.0.0.0:443.

   這表示你重複使用了443端口,去看看有沒有其他程式使用這個端口。

   或者看看httpd.conf中是否也定義了這個端口,比如用了以下的定義:Listen 443 。

3. 檢查配置檔案是否有問題可以用:

    httpd.exe -w -t -f ./conf/httpd.conf

   或開始菜單中Apache HTTP Server 2.2/Configure Apache Server/Test Configuration

   這實際上是一個上面指令的快捷方式。

4. 對于将mod_dav_svn.so 與mod_authz_svn.so

   拷貝到D:/Program/Apache Software Foundation/Apache2.2/modules 目錄下後,

   通過httpd.exe -w -t -f 或事件檢視器看到

    httpd.exe: Syntax error on line 87 of

    D:/Program/Apache Software Foundation/Apache2.2/conf/httpd.conf:

    Cannot load D:/Program/Apache Software Foundation/Apache2.2/modules/mod_dav_svn.so

    into server:

   與

    httpd.exe: Syntax error on line 88 of

    D:/Program/Apache Software Foundation/Apache2.2/conf/httpd.conf:

    Cannot load D:/Program/Apache Software Foundation/Apache2.2/modules/

    mod_authz_svn.so into server:

   這兩個錯誤的解決:在Apache 2.2.9下,

   将D:/Program/CollabNet Subversion Server目錄下的以下dll拷貝進

    D:/Program/Apache Software Foundation/Apache2.2/modules

   或

    D:/Program/Apache Software Foundation/Apache2.2/bin目錄下可解決:

    intl3_svn.dll(不是必須的)

    libdb41.dll(不是必須的)

    libsvn_delta-1.dll

    libsvn_fs-1.dll

    libsvn_repos-1.dll

    libsvn_subr-1.dll

5. 對于log檔案中出現[error] Init: SSLPassPhraseDialog builtin is not supported on Win32

   (key file D:/Program/CollabNet Subversion Server/httpd/conf/ssl/server.key),

   是因為 SSLPassPhraseDialog 這個對話框(輸入密碼對話框)不能在win32下顯示,

   其解決辦法是在建立證書的過程中不要輸入challenge password,保持空白即可。