用OpenSSL搭建的CA配置tomcat,部署https网站

用OpenSSL搭建的CA配置tomcat部署https网站

之前在Ubuntu环境下用OpenSSL搭建了CA,现在用自己搭建的CA去配置tomcat来部署https网站

HTTPS的原理

HTTPS协议 = HTTP协议 + SSL/TLS协议,在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密,需要用HTTP对加密后的数据进行传输,由此可以看出HTTPS是由HTTP和SSL/TLS一起合作完成的。

在HTTPS的传输过程中,当客户端接收到服务器的数字证书的时候,会进行如下验证:

  1. 首先客户端会用设备中内置的CA的公钥尝试解密数字证书,如果所有内置的CA的公钥都无法解密该数字证书,说明该数字证书不是由一个全球知名的CA签发的,这样客户端就无法信任该服务器的数字证书。
  2. 如果有一个CA的公钥能够成功解密该数字证书,说明该数字证书就是由该CA的私钥签发的,因为被私钥加密的密文只能被与其成对的公钥解密。
  3. 除此之外,还需要检查客户端当前访问的服务器的域名是与数字证书中提供的“颁发给”这一项吻合,还要检查数字证书是否过期等。

参考书籍:

  • 《图解HTTP》
  • 《深入浅出HTTPS:从原理到实践》

参考博客:

CA的结构

其中在private文件夹中存放了根目录证书ca.crt,users文件夹中存放了客户端证书client.crt

配置tomcat

我参考了tomcat的官方文档https://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html#SSL_and_Tomcat

The final step is to configure the Connector in the $CATALINA_BASE/conf/server.xml file, where $CATALINA_BASE represents the base directory for the Tomcat instance. 
An example <Connector> element for an SSL connector is included in the default server.xml file installed with Tomcat.
To configure an SSL connector that uses JSSE, you will need to remove the comments and edit it so it looks something like this:
<!-- Define an SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="${user.home}/.keystore" keystorePass="changeit"
           clientAuth="false" sslProtocol="TLS"/>

在tomcat安装目录下打开conf/server.xml,将其中的原有的8080端口语句注释掉:

<!-- <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" /> -->

依照官方文档的提示修改:

keystoreFile="conf/client.p12"

keystorePass即为client.p12证书的导入密码——xieyi

keystoreType为证书格式PKCS120

最终在conf/server.xml加入了如下内容:

<!-- Define an SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="conf/client.p12" keystorePass="xieyi" keystoreType="PKCS12"
           clientAuth="false" sslProtocol="TLS"/>

最后将CA目录下的users/client.p12复制到tomcat下conf目录下,保存conf/server.xml即可

配置目标浏览器

这里我们使用Firefox和IE两种浏览器进行测试

Firefox

进入Firefox选项页隐私与安全栏目

点击查看证书

在证书颁发机构栏目中点击导入

选择ca/private/ca.crt导入

两项全部勾选,并确定

随后便能在证书颁发机构栏目中找到这个证书

Internet Explorer

进入Internet Explorer设置的Internet选项内容栏目

点击证书

选取受信任的根证书颁发机构并将ca/private/ca.crt导入

随后便能在这一栏最后找到这个证书

访问自己部署的HTTPS网站

进入tomcat的安装目录

进入Tomcat 9.0/webapps,将自己的web项目文件夹复制进去

这里是一个名字为hello的web项目

进入Tomcat 9.0/bin,运行startup.bat启动tomcat

Firefox

进入Firefox,输入https://localhost:8443能看到tomcat的本机服务器界面

输入https://localhost:8443/hello/login.html能进入自己部署的web项目网站

Internet Explorer

进入Internet Explorer,输入https://localhost:8443能看到tomcat的本机服务器界面

输入https://localhost:8443/hello/login.html能进入自己部署的web项目网站

在这两个浏览器的网址输入框旁边都成功出现了锁

网站部署过程中的出现问题

签名算法不安全

首次搭建完自己的CA后,我按照以上步骤配置导入,访问网站时出现了这样的问题

这个时候我查看了证书的内容发现

client.crt使用的签名算法是MD5算法,显然已经不安全了

于是我在配置CA的步骤中找到用根证书私钥为客户端证书签名那一步

openssl ca -in users/client.csr -cert private/ca.crt -keyfile private/ca.key -out users/client.crt -config "/home/xieyi/ca/conf/openssl.conf"

查阅了OpenSSL的ca命令参数后,我对其进行了修改

openssl ca -md sha256 -in users/client.csr -cert private/ca.crt -keyfile private/ca.key -out users/client.crt -config "/home/xieyi/ca/conf/openssl.conf"

新一次的签名我使用了sha256算法

后来我在ca/conf/openssl.conf中发现了问题,这里面的默认签名算法default_md的值就是md5,于是我便将其修改为sha256

使用OpenSSL搭建CA

此服务器无法证明它是 localhost

在Chrome下访问https://localhost:8443/hello/login.html时出现了

在Edge下访问https://localhost:8443/hello/login.html时出现了

两者的报错都差不多是:此服务器无法证明它是 localhost,它的安全证书不指定使用者可选名称。

我试图去查阅资料,但是没能找到解决办法。

posted @ 2020-11-07 09:33  临渊履冰  阅读(462)  评论(0编辑  收藏  举报