我们都知道,http协议是明文传送,安全性很差,被用得越来越少,正在被https协议取代。很多浏览器例如chrome只要访问一个http协议网站,就会弹出风险提示,让用户感觉这个网站不靠谱、有病毒、会泄漏账号密码,不敢进,从而对网站发展产生不利影响。
所以,对于要搞副业/创业的程序员来说,搭建web服务一定要支持https。本文就是要教你如何让web服务支持https协议。
假如你对https协议中的SSL证书、CA等概念还不太熟悉,建议先学习一下相关基础,可以参考本篇。
现在我们开始搭建https,首先需要一个合法的SSL证书(后文简称”证书”)。怎么得到合法证书呢?基本上只有两条路。
向权威CA机构购买证书。
自己创建CA(经过一系列配置,效果等价于权威机构颁发的SSL证书)。
向权威CA机构购买证书的方案是正规渠道,可以实现网站HTTPS化,使网站可信,防劫持、防篡改、防监听、安全加密,适合知名大型网站。然而缺点很明显,就是要花钱,而且不是一次性购买得到的,而是被设置了有效期的,有效期到了之后还要续费才能继续使用,因此不太适合中小型网站/app。
购买证书方案的操作比较简单,只要在云平台上找到相应服务,填资料,然后付款即可。
不过,这世界上也是有免费的权威CA机构的,可以试试这家免费CA。如果这个能用,就不用自己搭CA了。这家免费CA机构名为Let\’s Encrypt,地址 https://letsencrypt.org/,在国外比较有名气。
(某国内排名第一的云平台为什么不推荐这家CA?钱的问题?)
另一个方案就是自己建CA,把CA证书部署到自己的客户端,再用自己的CA给web服务颁发证书。效果上是可以实现https安全性,而且不用花钱买证书,缺点只是没有权威机构的认可罢了。其实,不管是买证书还是自己搭建CA,底层原理都一样。
下面就介绍怎么自己搭建CA,然后给自己的web服务创建证书,最终在自己的app上实现https。
一、创建自己的CA
你可能认为搭建CA很复杂,需要安装服务端软件、写配置文件等。然而,实际上,搭建CA的步骤异常简单。在任意一台安装了openssl(一般系统默认安装好了)的Linux机器上,用以下命令生成CA private key:
执行以上命令之后,要求输入一个密码(给这个CA private key用)。如果不输入密码,其他人拿到这个CA private key之后,不用输入密码就可以冒充你。输入完密码之后,输出如下:
然后,执行以下命令生成根证书(CA证书):
然后输入前面CA private key的密码,回答一系列问题(即查看证书时显示出来的单位名称、国家、地区之类的信息)。
到目前为止,已经创建了2个文件 myCA.key(即CA private key)和myCA.pem(CA根证书)。持有这2个文件,你就已经成为一个CA,当然,是不出名的那种。
二、CA证书安装到客户端
有了CA private key和CA证书之后,把CA根证书安装到客户端上,这个客户端访问自己的web服务就是https的了。但是,没有安装CA证书的客户端访问你的web服务,依然不支持https。
不同平台的客户端安装CA证书的方法不太一样,例如在Android手机上,可以访问”设置->安全和隐私->更多安全设置->加密和凭据”来查看已经安装的CA证书(凭据)和安装自己的CA证书。
三、给web服务器创建证书
有了CA private key 和 CA根证书后,我们就可以对web服务的证书进行签名了。web服务器也需要自己创建一个证书(然后拿去给CA签名),步骤如下。首先创建一个web server用的private key,命令如下:
然后,创建一个CSR(Certificate Signing Request)文件,
这里的操作与上面生成CA证书的操作类似。
接下来,再创建一个配置文件。这个配置文件(文本文件)主要是用来定义Subject Alternative Name (SAN) 扩展的(具体见https://deliciousbrains.com/https-locally-without-browser-privacy-errors/#creating-self-signed-certificate)。例如,创建下面这样的配置文件(需要根据你的网站/app名做一些修改):
authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = dev.mergebot.com DNS.2 = dev.mergebot.com.192.168.1.19.xip.io
最后就是用CSR文件、CA private key 、CA根证书和刚才创建的配置文件,执行以下命令生成证书(用自己的CA签名):
openssl x509 -req -in dev.mergebot.com.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial \ -out dev.mergebot.com.crt -days 1825 -sha256 -extfile dev.mergebot.com.ext
提示输入CA private key的密码,输入之后,就得到web服务的证书CRT文件了。
四、把CRT证书文件部署至Linux服务器
把CRT证书文件部署到web服务器有很多种方法,操作不大相同,这里介绍:1)如何把CRT部署到Nginx上;2)把CRT整合到Spring Boot项目中。这两个方法应该满足大多数项目的需要了。另外,独立部署的tomcat服务器应该也支持配置CRT证书,可以自行搜索资料学习。
1)CRT部署到Nginx服务器
让web服务器支持https需要安装Nginx,这里假设nginx服务已经部署好了。打开nginx的配置文件(例如/etc/nginx/sites-available/yoursite.com),找到server段,增加以下指令:
listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate /crt文件路径/; ssl_certificate_key /web服务privateKey文件路径;
修改完nginx配置文件之后,再通过以下命令重启nginx即可实现https!
sudo service nginx reload
2)CRT部署到Spring Boot项目
把CRT集成到Spring Boot项目非常简单(主要原因是Spring Boot太强了),只需要在项目配置文件(例如application.properties)中修改名为”server.ssl.***”的属性即可,例如:
通过配置文件支持https之后,原来的http访问方式就不再支持了。如果还需要支持http的访问方式,让http跳转到https,那么还需要在Spring中部署以下代码:
权威讲解建议参考SpringBoot官方文档 https://docs.spring.io/spring-boot/docs/2.1.8.RELEASE/reference/html/howto-embedded-web-servers.html#howto-configure-ssl
这样,https服务就搭建起来了。
现在你学会如何把http服务升级到https了吧?有没有试着搭建一下自己的CA(只需要2条命令)?本文所述方法有什么缺点吗?有更简单的方法吗?欢迎留言。
内容出处:,
声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.com/share/15013.html