SVN+Apache+SSL的配置说明.docx_第1页
SVN+Apache+SSL的配置说明.docx_第2页
SVN+Apache+SSL的配置说明.docx_第3页
SVN+Apache+SSL的配置说明.docx_第4页
SVN+Apache+SSL的配置说明.docx_第5页
免费预览已结束,剩余116页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SVN+Apache+SSL的配置说明二零一零年十月目录目 录第 1 章 前言1第 2 章 COLLABNETSUBVERSION1第 3 章 SSL的个人浅见2第 4 章 SVN+APACHE+SSL环境搭建过程54.1 第一步:安装CollabNetSubversion服务端54.2 第二步:安装Subversion客户端84.3 第三步:创建测试用的版本库(repository)114.4 第四步:配置Apache服务114.4.1 配置Apache 和 Subversion的集成114.4.2 配置Apache响应客户端提交的svn访问请求124.4.3 创建Apache服务要求的基本认证密码文件“passwd”134.5 第五步:测试Apache服务144.6 第六步:使用SVN客户端在测试版本库TestRepository1中创建若干测试项目文件夹264.7 第七步:配置版本库目录精确授权访问284.8 第八步:使用SVN客户端在测试版版本库精确目录授权访问功能314.9 第九步:为Apache服务配置SSL功能(不进行客户端身份鉴别)364.9.1 虚拟一个CA认证中心384.9.2 SVN服务器端向CA中心申请数字证书394.9.3 CA中心为SVN服务器端颁发数字证书424.9.4 启用Apache的SSL功能464.9.5 配置SSL功能模块474.9.6 测试SSL功能5 测试启用了SSL的Apache服务5 测试启用了SSL的版本库访问6 采用TortoiseSVN客户端测试基于SSL的版本库访问634.9.7 在客户端安装CA根证书6 在客户端浏览器中安装数字证书6 在TortoiseSVN客户端中安装CA根证书734.9.8 再次测试SSL功能(在客户端安装了CA根证书后)7 测试启用了SSL的Apache服务7 测试启用了SSL的版本库访问80 采用TortoiseSVN客户端测试基于SSL的版本库访问814.10 第十步:为Apache服务配置SSL功能(要求进行客户端身份鉴别)854.10.1 客户端向CA中心申请数字证书864.10.2 CA中心为客户端颁发数字证书884.10.3 配置SSL启用客户端身份鉴别功能904.10.4 在客户端安装个人专用的客户端数字证书10 在客户端浏览器中安装个人客户端数字证书10 在TortoiseSVN客户端中安装个人数字证书1074.10.5 测试要求进行客户端身份鉴别的SSL功能(在客户端安装了CA根证书以及个人客户端证书后)1 测试启用了SSL的Apache服务1 测试启用了SSL的版本库访问1 采用TortoiseSVN客户端测试基于SSL的版本库访问114II SVN+Apache+SSL的配置说明第 1 章 前言花了3天的时间终于搞定了SVN+Apache+SSL的环境搭建,网上疯狂的搜索大部分都是针对SVN+svnserve或者SVN+Apache的配置(都比较简单,照着网上的文章配置成功率很高),但是针对SVN+Apache+SSL的配置都讲得太过简单,可操作性不强,下面把自己的辛苦经历归纳整理成文,希望能够帮助到新手少走弯路。第 2 章 CollabNetSubversionSVN(Subversion)是一个开源项目,有很多赞助商提供免费的维护升级,我这里选择的是CollabNet提供的版本,目前该公司提供了一个集成了SVN+Apache+ViewVC的集成安装版本,叫:CollabNetSubversionEdge,于是下载了最新版:CollabNetSubversionEdge-1.2.2,安装后试用后各项功能都比较方便(基本上不用进行配置),提供了基于浏览器的管理平台,所有的版本库、用户、目录授权等都可以基于该管理平台实现,并且给客户端提供了ViewVC应用(客户端可以直接使用浏览器查看版本库内容)。但是唯一不好使的是启用SSL后就不能够正常访问了,并且其安装目录下的各配置文件目录结构,包括配置内容都与早期SVN+Apache版本大相径庭,相去甚远,从网络上搜索的资料都没法实验(这个集成安装版本出来还没有几天,资料匮乏)。最终也没有能够使用这个集成安装版本(CollabNetSubversionEdge-1.2.2)实现基于SSL的安全访问(https:/),当时就想怎么给配起来能够正常运转,也没有弄清楚SSL的真实含义和应用机制以及验证流程(只知道是比http安全,数据内容都是加密传输),结果是囫囵了大半天也未果,对于出现的错误没有办法发挥主观能动性进行积极的思考。痛定思痛后,决定先搞清楚SSL是个啥,经过多方查阅后,从应用层面上对SSL算是基本搞清楚了。第 1 页 共 117页第 3 章 SSL的个人浅见SSL(Secure Sockets Layer 安全套接层)主要用于实现http请求会话的客户端和服务器端的双向身份认证,并对会话过程中的数据进行加密传输,从而保证网络访问的安全性。这些安全功能都是由客户端浏览器和服务器端http服务之间协作自动完成的,对使用者完全透明,使用者只是看见了一个https而已。但是现在是要自己来配置实现就不得不搞清楚其验证机制了,网上有较多文章对该验证过程进行了详细的描述,摘抄部分如下:-以下来自百度百科-服务器认证阶段: 1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接; 2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息; 3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器; 4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。 用户认证阶段: 在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。 -以下来自:/ast_224/archive/2009/01/19/3837155.aspx,这里面还有详尽的图示,值的一看- SSL握手过程:摘录自SSL与TLS目的:1. 客户端与服务器需要就一组用于保护数据的算法达成一致;2. 它们需要确立一组由那些算法所使用的加密密钥;3. 握手还可以选择对客户端进行认证。 过程:1. 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器;2. 服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数;3. 客户端对服务器的证书进行验证(有关验证证书,可以参考数字签名),并抽取服务器的公用密钥;然后,再产生一个称作pre_master_secret的随机密码串,并使用服务器的公用密钥对其进行加密(参考非对称加/解密),并将加密后的信息发送给服务器;4. 客户端与服务器端根据pre_master_secret以及客户端与服务器的随机数值独立计算出加密和MAC密钥(参考DH密钥交换算法)。5. 客户端将所有握手消息的MAC值发送给服务器;6. 服务器将所有握手消息的MAC值发送给客户端。 上述SSL验证流程的说明都没有结合CA(认证中心)讲解数字证书在整个验证过程的应用模式,在此将个人理解补充如下。下面会涉及到公钥和私钥的概念,个人简单理解就是:他们是成对出现的,如果有这么一对公钥/私钥(公钥是P,私钥是S),那么用P加密后的数据必须用S才能够正确解密,反过来也是一样的,用S加密的数据只有用P才能解密。至于他们到底干啥用的,举个形象的例子来说明。财务室有个上锁的保险柜(比拟服务器端),xm是财务出纳并且分配拥有一把钥匙,保险柜知道目前公司只有xm具备钥匙(xm比拟为客户端,锁比拟为公钥P,钥匙比拟为私钥S,保险柜里面的钱比拟为用公钥P加密后的数据),而锁和钥匙是成对出现的,如果现在有人用钥匙把锁打开了并拿到了钱(比拟为通过用私钥S对公钥P加密的数据进行了正确解密,并得到了解密后数据-钱!),保险柜当即就认为开锁从保险柜拿钱的人是xm,因为他知道只有公司出纳xm才拥有钥匙,当初是因为信任xm才会分发钥匙给他的,现在锁开了就认定这个拿钱人一定是xm,从而实现了拿钱人(数据访问者/客户端)身份的鉴别,总之就是可以用于在网络会话中鉴别对方的身份。数字证书在整个SSL会话验证过程中的完整应用机制如下图所示:经过后面的摸索过程才知道上图中的SSL只进行了服务器端身份的鉴别,并没有进行客户端身份的鉴别。SSL可以配置是否要求鉴别客户端身份,这个在后面详述。下面就先针对这种不鉴别客户端身份的SVN+Apache+SSL应用环境阐述其在Windows下的搭建过程。第 118 页 共 117页第 4 章 SVN+Apache+SSL环境搭建过程4.1 第一步:安装CollabNetSubversion服务端可以从官网/downloads/subversion/svn1.5.html下载最新版的CollabNet Subversion Server and Client,目前最新版本是 v1.6.13 (for Windows),注意不要下载CollabNetSubversionEdge集成安装包,下面的搭建过程对其不适用。这里我采用了默认的安装目录 C:Program FilesCollabNetSubversion Server安装过程中的下面这个步骤要特别注意,下图中的Apache(MOD_DAV_SVN)一定要勾上,表示安装Apache http服务,并且集成对SVN的访问处理。附带说明一下图中的SVNSERVE是适用于局域网的SVN服务,支持svn:的访问处理,安装Apache后可以支持svn服务的http:访问处理,后面我们再为Apache配置上SSL,那么就可以支持svn服务的https:访问处理了。安装向导要求输入服务的端口号,SVNSERVE的端口缺省填入的是3690,Apache服务的端口缺省填入的是80,因为我有安装IIS(80已被占用),故调整为8080。然后还要求输入SVN版本库的安装目录,我选择:e:svn_repository向导界面上的其他选项保持缺省值不变,然后下一步直至安装完成,安装完毕后会在windows服务中注册两个服务程序。注意:如果是XP等具备Windows防火墙的操作系统,需要将上述TCP端口号3690和8080添加至正常访问列表中,可通过防火墙设置程序来添加例外通过的端口号,也可以通过以下命令行脚本来添加(在运行框或DOS窗口中执行即可)。执行下面这行表示添加TCP 3690端口号至防火墙例外通过的端口列表中netsh firewall set portopening protocol = TCP port = 3690 name = SvnservePort mode = ENABLE scope = SUBNET profile = CURRENT执行下面这行表示添加TCP 8080端口号至防火墙例外通过的端口列表中netsh firewall set portopening protocol = TCP port = 8080 name = ApachePort mode = ENABLE scope = SUBNET profile = CURRENT关于SVNSERVE的配置比较简单(略过),如果只允许通过http:访问SVN,那么可以不用安装SVNSERVE服务,下面针对Apache进行配置说明。4.2 第二步:安装Subversion客户端实际上在SVN服务端是不需要安装Subversion客户端的,但是如果安装了那么我们在创建版本库的时候会很便捷,可以抛弃比较繁琐的命令行方式。这里我选择的Subversion客户端是赫赫有名的TortoiseSVN,他很好的与Windows资源管理器进行了集成,并且最有价值的是提供了非常有用的帮助文档,可以对SVN服务的配置有个全面的认识,但是里面对Apache的SSL配置太模糊,使我走了很多弯路。可以从官网(/downloads)下载最新版本,目前是1.6.11,记得同时下载简体中文语言安装包(在同一个下载页面的底部)。TortoiseSVN安装界面如下:简体中文语言包安装界面如下:接着需要设置客户端语言环境为中文:在Windows资源管理器任意地方点击右键选择TortoiseSVN菜单中的Settings在设置界面上的Language选项中选择:中文(简体)即可。4.3 第三步:创建测试用的版本库(repository)在windows资源管理器中打开我选择的版本库目录:e:svn_repository,新建文件夹TestRepository1,然后再新建的TestRepository1文件夹上点击鼠标右键,选择TortoiseSVN菜单”在此创建版本库”,该测试版本库留待后面的Apache服务配置完成后进行测试使用。4.4 第四步:配置Apache服务4.4.1 配置Apache 和 Subversion的集成如果采用上述安装包进行Subversion和Apache的集成安装,那么安装向导会自动完成了大部分在Apache服务中集成SVN的配置,例如完成了mod_dav_svn.so和mod_authz_svn.so文件的拷贝处理,但仍有小量的配置工作要做。用UltraEdit之类的文本编辑器打开Apache服务的配置文件(D:Program FilesCollabNetSubversion Serverhttpdconfhttpd.conf)进行如下配置:搜索到下面这行配置内容,去掉首字符#(带#表示注释信息,去掉#表示生效的配置信息)#LoadModule dav_fs_module modules/mod_dav_fs.so将以下配置内容添加到 LoadModule 节的末尾LoadModule authz_svn_module modules/mod_authz_svn.so从D:Program FilesCollabNetSubversion Server目录下拷贝以下文件至Apache的bin目录(D:Program FilesCollabNetSubversion Serverhttpdbin):libdb41.dlllibapr-1.dlllibaprutil-1.dlllibsvn_delta-1.dlllibsvn_fs-1.dlllibsvn_repos-1.dlllibsvn_subr-1.dll拷贝过程中如果提示目标文件已经存在,可以选择否(不覆盖)。注意:上述这些文件必须确保都存在于Apache的bin目录,否则Apache服务将无法启动,报cannot load mod_dav_svn.so的错误信息。4.4.2 配置Apache响应客户端提交的svn访问请求在Apache服务的配置文件(D:Program FilesCollabNetSubversion Serverhttpdconfhttpd.conf)末尾将节的配置内容替换为如下内容: #的意思是Subversion版本库的URL是http:/servername/svn #告诉Apache是哪个模块响应那个URL的请求此刻是Subversion模块。 DAV svn #对于 Subversion 1.3 或者更高版本,这个指示会列出所有 SVNParentPath 中的版本库。 SVNListParentPath on #告诉Subversion需要查看的版本库位于e:svn_repository之下 SVNParentPath e:svn_repository #激活基本认证,就是用户名/密码 AuthType Basic #指定当客户端在访问版本库时弹出要求用户输入认证信息的认证对话框上显示的信息 AuthName Subversion repositories login: #指定使用的认证密码文件,passwd是用户密码验证文件,要求放置在httpd子目录下 AuthUserFile passwd #指定精确的控制版本库目录访问的授权文件路径, #svnaccessfile是目录授权文件(可对访问用户进行版本库中任意目录的授权),要求放置在httpd目录下 #如果不需要进行细粒度的目录授权控制,则可以把下面这行配置内容用#注释掉 #AuthzSVNAccessFile svnaccessfile #指定只有输入了正确的用户/密码的用户可以访问URL Require valid-user 4.4.3 创建Apache服务要求的基本认证密码文件“passwd”这个密码文件的文件名在前面的配置文件中由下面这句话指定了: #指定使用的认证密码文件,passwd是用户密码验证文件,要求放置在httpd子目录下 AuthUserFile passwd打开命令行提示符(DOS 窗口),进入 D:Program FilesCollabNetSubversion Serverhttpdbin 目录,通过输入下面的命令创建密码文件passwd,并添加一个访问用户xm,后续会要求输入用户的密码。htpasswd c .passwd xm用下面的命令增加其它用户:htpasswd .passwd otherusername至此,Apache集成Subversion服务的配置基本完成(不开启SSL),下面进行测试。4.5 第五步:测试Apache服务在Windows服务管理界面找到CollabNet Subversion Apache服务,并启动/重新启动它,如果前面的配置都没有遗漏的话应该就可以顺序启动Apache服务了。注意:下面的图示都是直接在Apache服务端进行测试,如果在另一台客户端机器上做测试,需要将地址栏中的localhost替换为该Apache服务器的计算机名称或IP地址。在IE浏览器中输入地址http:/localhost:8080,显示It works!,表示Apache服务已经在工作了。下面进一步测试Apache对Subversion请求的处理是否正常。在IE浏览器中输入地址:http:/localhost:8080/svn/,并且输入我们之前创建的版本库用户名和密码后,浏览器显示出了我们之前创建的测试版本库TestRepository1,表示Apache与Subversion已经正确集成,可以处理客户端提交的svn访问请求。Apache服务配置文件内容实例此时,整个Apache服务配置文件(D:Program FilesCollabNetSubversion Serverhttpdconfhttpd.conf)的内容如下:# This is the main Apache HTTP server configuration file. It contains the# configuration directives that give the server its instructions.# See for detailed information.# In particular, see # # for a discussion of each configuration directive.# Do NOT simply read the instructions in here without understanding# what they do. Theyre here only as hints or reminders. If you are unsure# consult the online docs. You have been warned. # Configuration and logfile names: If the filenames you specify for many# of the servers control files begin with / (or drive:/ for Win32), the# server will use that explicit path. If the filenames do *not* begin# with /, the value of ServerRoot is prepended - so logs/foo.log# with ServerRoot set to C:Program FilesCollabNetSubversion Server/httpd will be interpreted by the# server as C:Program FilesCollabNetSubversion Server/httpd/logs/foo.log.# NOTE: Where filenames are specified, you must use forward slashes# instead of backslashes (e.g., c:/apache instead of c:apache).# If a drive letter is omitted, the drive on which Apache.exe is located# will be used by default. It is recommended that you always supply# an explicit drive letter in absolute paths, however, to avoid# confusion.# # ThreadsPerChild: constant number of worker threads in the server process# MaxRequestsPerChild: maximum number of requests a server process servesThreadsPerChild 250MaxRequestsPerChild 0 # ServerRoot: The top of the directory tree under which the servers# configuration, error, and log files are kept.# Do not add a slash at the end of the directory path. If you point# ServerRoot at a non-local disk, be sure to point the LockFile directive# at a local disk. If you wish to share the same ServerRoot for multiple# httpd daemons, you will need to change at least LockFile and PidFile.#ServerRoot C:Program FilesCollabNetSubversion Server/httpd # Listen: Allows you to bind Apache to specific IP addresses and/or# ports, instead of the default. See also the # directive.# Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses ()#Listen 8:80Listen 8080 # Dynamic Shared Object (DSO) Support# To be able to use the functionality of a module which was built as a DSO you# have to place corresponding LoadModule lines at this location so the# directives contained in it are actually available _before_ they are used.# Statically compiled modules (those listed by httpd -l) do not need# to be loaded here.# Example:# LoadModule foo_module modules/mod_foo.so#LoadModule actions_module modules/mod_actions.soLoadModule alias_module modules/mod_alias.soLoadModule asis_module modules/mod_asis.soLoadModule auth_basic_module modules/mod_auth_basic.so#LoadModule auth_digest_module modules/mod_auth_digest.so#LoadModule authn_anon_module modules/mod_authn_anon.so#LoadModule authn_dbm_module modules/mod_authn_dbm.soLoadModule authn_default_module modules/mod_authn_default.soLoadModule authn_file_module modules/mod_authn_file.so#LoadModule authz_dbm_module modules/mod_authz_dbm.soLoadModule authz_default_module modules/mod_authz_default.soLoadModule authz_groupfile_module modules/mod_authz_groupfile.soLoadModule authz_host_module modules/mod_authz_host.soLoadModule authz_user_module modules/mod_authz_user.soLoadModule autoindex_module modules/mod_autoindex.so#LoadModule cern_meta_module modules/mod_cern_meta.soLoadModule cgi_module modules/mod_cgi.so#LoadModule dav_module modules/mod_dav.soLoadModule dav_fs_module modules/mod_dav_fs.so#LoadModule deflate_module modules/mod_deflate.soLoadModule dir_module modules/mod_dir.soLoadModule env_module modules/mod_env.so#LoadModule expires_module modules/mod_expires.so#LoadModule file_cache_module modules/mod_file_cache.so#LoadModule headers_module modules/mod_headers.soLoadModule imagemap_module modules/mod_imagemap.soLoadModule include_module modules/mod_include.so#LoadModule info_module modules/mod_info.soLoadModule isapi_module modules/mod_isapi.soLoadModule log_config_module modules/mod_log_config.soLoadModule mime_module modules/mod_mime.so#LoadModule mime_magic_module modules/mod_mime_magic.soLoadModule proxy_module modules/mod_proxy.so#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so#LoadModule proxy_connect_module modules/mod_proxy_connect.so#LoadModule proxy_http_module modules/mod_proxy_http.so#LoadModule proxy_ftp_module modules/mod_proxy_ftp.soLoadModule negotiation_module modules/mod_negotiation.so#LoadModule rewrite_module modules/mod_rewrite.soLoadModule setenvif_module modules/mod_setenvif.so#LoadModule speling_module modules/mod_speling.so#LoadModule status_module modules/mod_status.so#LoadModule unique_id_module modules/mod_unique_id.soLoadModule userdir_module modules/mod_userdir.so#LoadModule usertrack_module modules/mod_usertrack.so#LoadModule vhost_alias_module modules/mod_vhost_alias.so#LoadModule ssl_module modules/mod_ssl.soLoadModule dav_module modules/mod_dav.soLoadModule dav_svn_module modules/mod_dav_svn.soLoadModule authz_svn_module modules/mod_authz_svn.so # Main server configuration# The directives in this section set up the values used by the main# server, which responds to any requests that arent handled by a# definition. These values also provide defaults for# any containers you may define later in the file.# All of these directives may appear inside containers,# in which case these default settings will be overridden for the# virtual host being defined.# # ServerAdmin: Your address, where problems with the server should be# e-mailed. This address appears on some server-generated pages, such# as error documents. e.g. #ServerSignature OnServerAdmin localhostlocaldomain # ServerName gives the name and port that the server uses to identify itself.# This can often be determined automatically, but we recommend you specify# it explicitly to prevent problems during startup.# If your host doesnt have a registered DNS name, enter its IP address here.#ServerName localhost:8080 # DocumentRoot: The directory out of which you will serve your# documents. By default, all requests are taken from this directory, but# symbolic links and aliases may be used to point to other locations.#DocumentRoot C:Program FilesCollabNetSubversion Server/httpd/htdocs # Each directory to which Apache has access can be configured with respect# to which services and features are allowed and/or disabled in that# directory (and its subdirectories). # First, we configure the default to be a very restrictive set of # features. # Options FollowSymLinks AllowOverride None Order deny,allow Deny from all Satisfy all # Note that from this point forward you must specifically allow# particular features to be enabled - so if somethings not working as# you might expect, make sure that you have specifically enabled it# below.# # This should be changed to whatever you set DocumentRoot to.# # # Possible values for the Options directive are None, All, # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that MultiViews must be named *explicitly* - Options All # doesnt give it to you. # # The Options directive is both complicated and important. Please see # /docs/2.2/mod/core.html#options # for more information. # Options Indexes FollowSymLinks # # AllowOverride controls what directives may be placed in .htaccess files. # It can be All, None, or any combination of the keywords: # Options FileInfo AuthConfig Limit # AllowOverride None # # Controls who can get stuff from this server. # Order allow,deny Allow from all # DirectoryIndex: sets the file that Apache will serve if a directory# is requested.# DirectoryIndex index.html # The following lines prevent .htaccess and .htpasswd files from being # viewed by Web clients. # Order allow,deny Deny from all # ErrorLog: The location of the error log file.# If you do not specify an ErrorLog directive within

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论