渣科最近学习Apache, 学会了怎么搭建单向和双向的https服务,文中所有步骤亲测有效,希望能够帮助大家!
先放张图,为了这个锁头,我奋斗了很久。使用的是自签名证书,域名也是在本地配的,全程不需要联网。
这是我的Apache版本:httpd-2.4.41-lre302-x64-vc14。希望大家可以先了解https怎么通信,减少配置过程中的一些疑惑:
https://www.runoob.com/w3cnote/http-vs-https.html
0. 搭建好Apache,就可以访问我们的网站。
下载安装教程:https://blog.csdn.net/mikasoi/article/details/80976425
安装完成,打开http://127.0.0.1,可以看到Apache的欢迎页面。
恭喜,你已经搭好了一个http服务了!
为了配置HTTPS,我们还需要一点点的准备工作。
简单介绍一下Apache三个配置文件(不想看可以直接绕过,去查官网的会说的更仔细):
- httpd.conf 是核心的配置文件,我们可以在里面添加或删除Apache的功能模块(比如mod_proxy就是代理模块)。
httpd.conf中的LISTEN用来表示Apache监听的端口,默认是80。
- extra/httpd-vhost.conf,我们一般不会在httpd.conf中直接写我们的配置,而是把配置转移到httpd-vhost.conf中,让httpd.conf保留最干净的配置和功能(添加/删除功能模块,或者定义全局属性)。httpd-vhost.conf用来进行虚拟机配置,虚拟机配置就是一个标签<VirtualHost>,你可以把很多指令配置到一个<VirtualHost>,这些指令只对此<VirtualHost>生效,下面配置的时候会说到。
- extra/httpd-ssl.conf,关于SSL的全局配置就写在这里面。当我们使用HTTPS的时候就会用到这里面的全局配置。有全局自然也有局部,你可以在自己的Virtualhost中重写这些配置。
- 为了方便测试,本文用到的域名和证书都在本机生成和设置,模拟生产实际环境。
域名通过修改C:\Windows\System32\drivers\etc\hosts 文件。
比如www.myApahce.com是我要测试域名,那么我就在里面加上这行。
试试访问:
自签名证书生成网上有很多资料,下面我也会说到。
- 开始部署一个Https服务。
最终的效果:
1.1 Https分为单向验证和双向验证。
这里我简单说明一下,HTTPS单向验证,就是只有服务端证书,客户端验证服务端证书的真伪后即可进行通信。HTTPS双向验证,客户端验证服务端身份后,还要把客户端证书发给服务端,服务端也要验证客户端身份,通过后才进行通信。
我们先部署一个单向https服务,再基于单向HTTPS 配置 双向的https服务。
1.2 有关于HTTPS的配置,都依赖于mod_ssl模块,这个模块在我们安装Apache的时候默认就打开了。打开httpd.conf中可以看到:
如果加载了mod_ssl,默认也会加载httpd-ssl.conf文件,httpd-ssl.conf里有关于ssl的全局配置:
1.3 开始部署一个单向验证的Https服务。
1.3.1 证书准备,我们要生成Https需要的相关证书,这里使用java的keytool工具生成我们的相关证书,用什么工具不重要,只要能拿到证书就行。
> 生成私钥证书库[注意命令中的路径名,如果你没有D盘记得修改路径]:
keytool -genkeypair -alias apache -keysize 2048 -keyalg RSA -validity 60 -keystore D:\apache.jks -storetype JKS -ext SAN=DNS:www.myApache.com
> 将证书库从keystore类型转成p12类型: keytool -importkeystore -srckeystore D:\apache.jks -destkeystore D:\apache.p12 -srcstoretype jks -deststoretype pkcs12 -alias apache
> 从库中导出 私钥和证书给apache。
如果提示没有OPENSSL这个命令,请下载OPENSSL。
https://blog.csdn.net/sunhuansheng/article/details/82218678
#####秘钥不加密,不要证书,只要私钥。
openssl pkcs12 -in D:\apache.p12 -nodes -nocerts -out D:\apache.key
#####不要私钥,导出证书链。
openssl pkcs12 -in D:\apache.p12 -out D:\apache.pem -nokeys
> 从库中导出根证书 给浏览器安装
keytool -export -alias apache -keystore D:\apache.jks -file D:\apache.cer
> apache.key和apache.pem是给Apache部署https使用,apache.cer是给客户端校验服务器身份时使用。
打开你的D盘,看到这些文件。
1.3.2 Apache准备,我们新建一个端口8888,让8888成为https服务。
> 在httpd.conf文件中 加上LISTEN 8888.
> 在httpd.conf中去掉httpd-vhosts.conf前面的注释,默认是有注释的:
> 在httpd-vhost.conf中加上这段虚拟机配置,它作用在ip=127.0.0.1,端口号为8888上面:
<VirtualHost 127.0.0.1:8888> ServerAdmin myAdmin@qq.com ServerName www.myApache.com SSLEngine On SSLCertificateFile "D:/apache.pem" SSLCertificateKeyFile "D:/apache.key"
</VirtualHost> |
SSLEngine On表示开启HTTPS服务,
SSLCertificateFile是证书的公钥文件位置,SSLCertificateKeyFile是证书的私钥位置。
1.3.3 客户端准备,安装证书用来校验服务器,双击apache.cer,安装证书到 信赖的根证书。
一路点击Next,直到Finish。
1.3.4 验收成果,重启Apache, 然后关闭所有开着的浏览器,打开一个新的浏览器,
输入https://www.myApache.com:8888/,就可以发现https部署成功,可以看到我们漂亮的锁头。太棒了!你成功了!
这是chrome:
这是IE:
1.4 在https单向的基础上,完成的Https双向的配置。就是客户端也必须有一个证书,提供给服务端校验,效果:
部署https双向认证后,当你再次访问https://www.myApache.com:8888时,会提示你没有客户端证书。
你必须在浏览器安装一个客户端证书,选择证书后,才能访问。
1.4.1 证书准备:这里验证客户端所需要的证书,我们使用上面生成的apache.pem,apache.pk12,
首先声明,服务端证书和客户端证书之间是没有半毛钱关系的,这里我是为了方便,直接使用了服务端证书 同时作为客户端证书,你也再可以生成一份新的证书作为客户端证书!
1.4.2 Apache配置,在上面的VirtualHost中,加上一段客户端认证的配置:
<VirtualHost 127.0.0.1:8888> ServerAdmin myAdmin@qq.com ServerName www.myApache.com SSLEngine On SSLCertificateFile "D:/apache.pem" SSLCertificateKeyFile "D:/apache.key"
SSLVerifyClient require SSLCACertificateFile "D:/apache.pem"
</VirtualHost> |
服务端Apahce通过SSLVerifyClient true知道了要检验客户端身份,通过SSLCACertificateFile知道了服务端信赖的证书是哪些。
1.4.3 客户端准备,客户端要带着证书去访问服务端,在浏览器中加入apache.pk12到个人证书中。
> 打开chrome浏览器:
> 导入我们的apache.pk12:
> 输入PK12文件的密码,之后一直点next,然后保存。
1.4.4 验收成果,重启Apache,关闭所有浏览器,重新输入https://www.myApache.com:8888 .你可以看到会弹出一个 客户端证书的选择,
选择证书后点击确定,就可以访问到了!
恭喜!使用Apache搭建https双向认证服务,你做到了!
渣科 用了很久的时间才基本搞明白什么是HTTPS,单向认证和双向认证,反向代理,以及Apache一些重要的命令,希望大家也不要操之过急。弄懂了一些基本知识之后才开始进行实际的操作配置,但还是遇到了很多的问题,坎坎坷坷,到最后终于配置成功,还是很开心的,过程中涉及到的一些知识如果大家没有明白,最好还是先去查一下,我的建议是,看完到不懂的再去官网看描述或者查看别的博客。
什么是https(这篇文章只是讲了单向的https): https://www.runoob.com/w3cnote/http-vs-https.html
什么是keytool:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html
Apache的命令:http://httpd.apache.org/docs/2.4/mod/directives.html
还有一个很好,值得思考的问题:https://www.v2ex.com/amp/t/411144
//加油吧,渣科。