常用基础 - https主机配置

  • 作者:KK

  • 发表日期:2017.8.17


什么是https

这个如果有耐心的话麻烦你自己上网查哦,我讲得没别人那么好。

反正http不安全

简单地说,http协议的数据在网上是明文传输的,比如你一个登录表单虽然用了POST发送请求,可是这个数据包在网上传递的时候是看得见里面的内容的,如果经过某个路由器或地方节点的时候,这个网关拦截下数据包一看就会发现大概有这样的内容:

email=xxx@qq.com
password=hh3n431

懂了吧,意味着你的邮箱和密码都能被别人看到啊!那么黑客就可能入侵了这些节点拦截数据包查探有没有password之类的信息,就算网管也有可能在网关设定木马做拦截,说白了就是数据能被别人截获并直接查看啊,还能做更多手脚呢,比如欺骗、劫持什么的


https会加密传输

尽管数据包经过各个路网络节点时可以被坏人拦截复制下来,可是由于https协议通讯时,会将数据加密然后发送给接收方,只有接收的一方才能解密出这个数据包看到里面的真正内容,而中间人复制下来的数据包打开一看是加密的内容,都是乱码。就算要尝试破解加密内容,据说当今最强大的计算机也要运算一万年以上才有希望破解

因此https是安全的传输协议(无论是你发给服务器,还是服务器发给你,只有你们两个才能互相解密查看对方发来的数据)


前提准备:Apache需要加载ssl模块

看看Apache的目录里有没有modules/mod_ssl.so文件,一般都会有,接下来再打开httpd.conf搜索mod_ssl,一般都会找到类似LoadModule ssl_module modules/mod_ssl.so这句加载命令,基本可以确定Apache加载了ssl模块(注意如果前面被#号注释掉了记得要解除注释啊亲)

https的更多细节就不在这里说了,接下来讲讲如何搭建实现一个https://xxx.com这样的网站主机吧


ssl证书的说明

所谓的证书其实是个文件,它的作用就是让网站用户的浏览器也知道如何加密数据,浏览器会下载服务器上的证书文件,然后通过它进行数据加密,加密的数据提交给服务器后,服务器也能解密。

有2种证书获取方式:

  1. 第三方机构颁发给你

    就像学校向学生颁发毕业证书,我们要加密证书也得找第三方机构颁发一份,许多机构都是要钱的,少部分是免费或首年免费,支持能力也不一样(比如有些证书不能用在多个域名上,只能指定一个域名)

  2. 自己成为一家机构,自己给自己颁发证书,其实就是敲几个命令的事情

    一般学习测试过程中我们都是用自己给自己颁发的证书,只是嘛……这种证书用起来会被浏览器提示“危险”之类的,这个危险提示其实你不用管(只是为了自己测试),至少传输是安全的

接一来就咱自己弄一份证书吧

第一步:生成私钥文件(.key)

Windows系统下生成私钥

好了我们接下来基于Windows系统,如果要给自己颁发一个证书就需要用openssl这个软件,怎么获得呢……

先命令行cd到Apache的bin目录下,这里有个openssl.exe,那我们就运行这样一个命令吧:openssl genrsa 1024 > test.key,会在目录下产生一个test.key,可是还带有报错

要解决这个错误怎么办呢,先删除刚产生的test.key准备重来一遍吧

然后我们先执行set OPENSSL_CONF=..\conf\openssl.cnf,这样在当前cmd会话就创建了一个OPENSSL_CONF的变量,可以执行echo %OPENSSL_CONF%输出该变量的值

然后再重新运行openssl genrsa 1024 > test.key就不会报错了,test.key也会照常产生,其实就是引用Apache/conf/openssl.cnf里的配置生成证书,否则生成的证书可能不适用于apache服务器(具体看你的openssl版本吧)


Linux系统下生成私钥

通常linux系统都会自带openssl这个软件(在/usr/bin/openssl),所以你直接执行openssl genrsa 1024 > test.key就可以了


第二步:生成证书请求文件(.csr)

执行openssl req -new -key test.key > test.csr,你大概理解为“基于test.key生成test.csr”就好了,当然目录下也要有test.key,前面已经生成过了

输入命令后它会让你填写很多东西,下面是各个选项的解释,自己对着填,并且另外备忘一份:

Country Name (2 letter code) [AU]: ISO国家代码(只支持两位字符),中国就填CN

State or Province Name (full name) [Some-State]: 所在省份,我填了guangdong

Locality Name (eg, city) []: 所在城市,我填了guangzhou

Organization Name (eg, company): 组织名称,例如公司名称也可以,我们自己练习,填test什么的就好了,不然你可以填Apple公司啊

Organizational Unit Name (eg, section) []: 部门名称,我填了IT Dept(IT部门)

Common Name (eg, YOUR name) []: 申请证书的域名,比如我填了www.kkh86.com

Email Address []: 管理员邮箱

Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: 交换密钥,目前测试我设的密码是121212

An optional company name []: 公司名称,选填,一般上面组织就行了,你所在的单位架构实在复杂再说吧,结果咱们就是不用填这个!

听说Common Name必须和httpd.conf中ServerName必须一致,否则apache不能启动(启动apache时错误提示为:RSA server certificate CommonName (CN) `Kedou' does NOT match server name!?),可是我自己试了是可以启动的,知道原因的求解释


第三步:领证了!向自己颁发证书文件!(.crt)

执行openssl req -x509 -days 365 -key test.key -in test.csr > test.crt,命令的意思你就理解为基于test.key和test.csr产生test.crt(就像生孩子一样,这三个东西形成了亲属关系!)

这个.crt文件和前面的.key文件是要部署到服务器上的,最后一步骤是得到crt文件,这一步骤通常叫做“颁发证书”,如今我们自己执行命令生成这个文件,就是自己向自己颁发

  • 关于有效期的说明:上面命令有一个-days 365的参数,意思是产生的test.crt只有365天(一年)的期限,过了之后就无效了,要重新颁发一个新证书,当然你可以设定为999年有效期……

第四步:创建https虚拟主机,配置私钥和证书文件

添加主机标签:

#添加443端口监听
Listen 443
<VirtualHost www.kkh86.com:443>  
	ServerName www.kkh86.com
	DocumentRoot "D:\projects\kk\web"
	
	#下面配置私钥和证书路径,自己找个合适的位置部署
	SSLEngine on
	SSLCertificateFile "conf/ssl/test.crt"
	SSLCertificateKeyFile "conf/ssl/test.key"

	<Directory "D:\projects\kk\web">
		Options FollowSymLinks ExecCGI
		AllowOverride All
		Order allow,deny
		Allow from all
		Require all granted
	</Directory>
</virtualhost>

第五步:重启服务器,测试

这下就尴尬了,访问https://www.kkh86.com居然被提示网站不安全

点击高级 - 继续前往还是可以访问的,不过每次启动浏览器第一次打开这个https站点时就会被提示这个,如果部署到线上……你想像一下用户们看到这个网站居然被浏览器提示不安全的反应,是不是很难做生意呀

想要去掉这个不安全的提示吗?——行,每年交钱,找第三方权威机构颁发证书给你吧,别自己用命令生成了亲 (接下来就进行解释)


实际的证书通常由第三方权威CA认证机构进行颁发

在实际线上软件应用中,通常我们并不是自己执行命令生成证书文件的,需要找到一个证书颁发机构(世界上好多,比如赛门铁克,上网搜关键词“ssl证书颁发机构有哪些”),按照它官网提供的流程,填好一些资料和认证,过一段时间人家就会通过邮件将证书相关文件发给你了,而且这个过程往往要收费,就算免费的话也不多,甚至第一年免费而已(腾讯云和阿里云都有)

你会问“为毛我们自己能生成证书却要找第三方机构!?”这个嘛……需要深入了解https的认证机制才好理解,自己上网详细了解https吧,反正你知道正常情况下要花钱找别人颁发就对了,我现在公司的证书一年费用是8000元

有些网站直接无视不安全的提示,继续在线上运作自己颁发证书的https网站

当你的网站用户不管是否安全都会访问的时候,你就可以用自己给自己颁发的证书,比如一些公司的管理后台,内部WEB站点(浏览器虽然提示不安全,但公司领导会说“没问题的,大家放心使用”,于是工作人员还是继续正常访问使用嘛哈哈)

我还见过一些赌博类的非法站点会这样搞,反正实际上是少数,要正正规规面向大众经营一个网站业务,并且在安全上做足功夫,就得花钱买ssl证书


保管好相关文件

有了.key才能生成.csr,有了.csr才能生成.crt,你可以丢失.crt然后重新生成,但是你不能丢失.key和.csr(本地测试你怎么丢都行,直接全部重新来一遍就能生成,但是在线部署的一般是找第三方机构颁发的,如果你换了.key和.csr那就它就认为你在为一个新的站点做证书,要另外再交一笔钱了,问你到时候痛不痛?)

不过有些机构会帮你保管好相关文件的……这些机构肯定会声称自己是安全的,能保管好的啦,如果你觉得没问题就好,实际上它会不会有内鬼偷你的证书就不知道咯