安装配置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,保持空白即可。

你可能感兴趣的:(安装配置Apache+SVN+SSL)