Https配置

距离上一次提笔写博客已经过去5个月了!工作固然是比较忙,但更多地其实是自己变成越来越懒惰了。人都是有惰性的,由懒惰到勤奋难,由勤奋到懒惰却是非常简单。笔者时常提醒自己不忘初心,毕业3年就已经差不多忘了自己从何出发、为何出发、终点在哪里!对于自己的定位仍然是一名程序员,目标仍然是成为优秀的架构师!

言归正传,本篇文章主要是介绍如果配置一套基于的Httpsweb环境,文章以实际操作为重点,并附带罗列一些理论基础,所以并不是从零开始。在阅读本篇文章之前,读者需要具备以下知识:

  1. TLS/SSL协议
  2. tomcat
  3. 数字证书和CA

本文的主要内容包括:

  1. Https概要介绍
  2. 自签名证书
  3. tomcat中配置https

Https基础

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。(来自百度百科

为什么需要Https

在讲为什么需要https之前,应该讲讲http协议本身有什么缺陷。

  1. http协议是不安全的。http协议报文在网络传输过程中全部都是明文。用户上网浏览过、提交过的内容,所有在后台工作的人,比如路由器的所有者、网线途径路线的不明意图者、省市运营商、运营商骨干网、跨运营商网关等都能够查看。
  2. http协议没有提供身份认证机制,其无法保证用户访问能直达目标网站,而没有被中间人攻击和劫持。

https协议主要就是为了解决这些问题而诞生的。https主要有以下特性:

  1. 传输数据加密。使用https协议传输的报文都是经过加密的,就是报文被中间人拦截,如果不知道加密算法和密钥也无法知晓数据内容。
  2. 身份认证。使用https协议的站点都需要申请数字证书,这个证书就是站点的“身份证”,如果服务站点没有出示有效的证书,那么浏览器就会对用户发出警告。当然,除了服务端认证之外,服务端也可以反向认证用户的合法性,也可以同时进行这两种认证,称为双向认证。

SSL数字证书

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。SSL是由Netscape公司研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。

SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。正常的SSL证书都是由受认证的证书颁发机构——我们称之为CA(Certificate Authority)机构来颁发,针对企业与个人的不同,可申请的证书的类型也不同,价格也不同。

Https配置

虽然诸如google等互联网大佬都在呼吁摒弃不安全的http协议,直接使用https协议。不过,由于历史原因,目前绝大多少的站点仍然在使用http协议,也并没有想要拥抱https的意思。为了迎合市场需求,目前几乎所有的Web容器默认使用的仍然是http协议。不过,较高版本的Web容器都是支持https协议的,但是都需要做一些额外的配置(包括开启https、配置证书等)

自签名证书

之前的章节中已经简要地介绍了SSL数字证书,要合法地使用https服务,必须要在Web容器中配置数字证书。商用数字证书需要花钱购买(目前市面也有免费商用证书,可以在各大云供应商免费购买)。如果是实验用途,使用自签名证书就足够了。下面以Windows操作系统(Linux等其他操作系统类似)为例,介绍如何利用keytool工具生成SSL证书。

keytool是一个Java中的密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。【转自百度百科

在使用keytool之前,要确保操作机器上已安装并配置好了java环境。本文的重点并不在环境的搭建上,如果还未安装java环境,请参考从零开始搭建Java环境

keytool常用参数说明:

  • -genkey 在用户主目录中创建一个默认文件”.keystore”,还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书(在没有指定生成位置的情况下,keystore会存在用户系统默认目录)
  • -alias 产生别名 每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写
  • -keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中)
  • -keyalg 指定密钥的算法 (如 RSA DSA,默认值为:DSA)
  • -validity 指定创建的证书有效期多少天(默认 90)
  • -keysize 指定密钥长度 (默认 1024)
  • -storepass 指定密钥库的密码(获取keystore信息所需的密码)
  • -keypass 指定别名条目的密码(私钥的密码)
  • -dname 指定证书发行者信息 其中: “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名 称,ST=州或省份名称,C=单位的两字母国家代码”
  • -list 显示密钥库中的证书信息 keytool -list -v -keystore 指定keystore -storepass 密码
  • -v 显示密钥库中的证书详细信息
  • -export 将别名指定的证书导出到文件 keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 - - - -storepass 密码
  • -file 参数指定导出到文件的文件名
  • -delete 删除密钥库中某条目 keytool -delete -alias 指定需删除的别 - -keystore 指定keystore – storepass 密码
  • -printcert 查看导出的证书信息 keytool -printcert -file g:\sso\michael.crt
  • -keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new 新密码 -storepass keystore密码 - - - - -keystore sage
  • -storepasswd 修改keystore口令 keytool -storepasswd -keystore g:\sso\michael.keystore(需修改口令的keystore) -storepass pwdold(原始密码) -new pwdnew(新密码)
  • -import 将已签名数字证书导入密钥库 keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书

    下面介绍如何利用keytool生成自签名证书。

    同时按下win+R快捷组合键,在弹出的运行窗口,输入cmd 并回车,打开命令行窗户,输入如下命令:

1
keytool -genkey -alias tomcat -keyalg RSA -keystore D:xialei.keystore

-keystore D:xialei.keystore参数指定生成的证书文件名和位置,可根据实际情况更改。

执行结果如下图所示。系统提示需要输入查看证书的密码(至少6个字符),请务必记住自己输入的密码,否则无法查看生成keystore信息,也无法做进一步的处理。

keytool-p1

接下来需要填写证书信息。在【您的名字与姓氏是什么】处填写将要使用本证书的网站的hostname,可以是域名或者IP地址。例如:由于笔者需要在本机上部署https服务并且使用本次生成的证书,所有在这一栏中填写了127.0.0.1,在访问站点时也使用这个IP地址。

其他信息可以随意填写,由于证书是自己生成的,不存在审核的问题,随意填写其他信息并不会影响证书的正常使用。

keytool-p2

全部执行完毕之后,可以看到在D盘下已经生成了xialei.keystore证书文件。

keytool-p3

我们可以使用keytool -list -v -keystore D:xialei.keystore命令来查看证书信息。执行完毕后提示需要输入密码,输入第1步中设置的密码即可。

keytool-p4

tomcat配置

在tomcat中只需要简单地配置一下就可以开启https服务,下面以tomcat 1.7.x版本为例介绍配置方式。打开${TOMCAT_HOME}/conf/server.xml,插入下面的代码。注意:keystoreFile要配置正确的.keystore文件路径,keystorePass配置在生成证书文件时输入的密码。

1
2
3
4
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="D:\ProgramFiles\apache-tomcat-7.0.40\conf\xialei.keystore" keystorePass="123456"
clientAuth="false" sslProtocol="TLS" />

启动tomcat服务,在浏览器中输入https://127.0.0.1就可以打开https网站了。
tomcat-ssl1

然后,当使用chrome浏览器打开站点时,出现的却是警告界面,页面提示【您的连接不是私密连接】。接下来依次点击【高级】,【继续前往127.0.0.1(不安全)】按钮后,可以跳转到到正确的页面,不过地址栏中仍然显示如下图所示的“不安全锁”。

tomcat-ssl2

明明已经安装好了数字证书,为何还是完全正确地使用https服务呢。原因就是给这个站点颁发证书的“认证中心”(其实就是我们自己)并不被浏览器客户端认可,那么其颁发的证书自然不是有效的证书。接下来需要在浏览器中配置。

浏览器配置

之前生成.keystore文中包含两种数据:

  1. 密钥实体(Key entity)—— 密钥(secret key)又或者是私钥和配对公钥。
  2. 自签名证书实体(trusted certificate entries)—— 只包含公钥

下面需要从.keystore文件中导出证书文件。

执行下面的命令,就可以在D盘下找到生成的xialei.crt证书文件。

1
keytool -export -alias tomcat -keystore D:xialei.keystore -file D:xialei.crt

keytool-p5

一般情况下,.crt文件在windows操作系统中可以用默认关联程序打开的。直接运行生成的xialei.crt证书文件,按照windows程序的惯用操作即可完成证书安装操作。

brower-ssl1

brower-ssl2

brower-ssl3

操作完毕后,重新打开浏览器,访问相同的网址后,可以看到地址栏中出现的绿色小锁,这表明https已配置成功。

brower-ssl4


参考文章

java keytool证书工具使用小结

JDK 中的证书生成和管理工具 keytool


本文由xialei原创,转载请说明出处http://hinylover.space/2017/07/09/https-config/