用OpenSSL搭建的CA配置tomcat部署https网站
之前在Ubuntu环境下用OpenSSL搭建了CA,现在用自己搭建的CA去配置tomcat来部署https网站
HTTPS的原理
HTTPS协议 = HTTP协议 + SSL/TLS协议,在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密,需要用HTTP对加密后的数据进行传输,由此可以看出HTTPS是由HTTP和SSL/TLS一起合作完成的。
在HTTPS的传输过程中,当客户端接收到服务器的数字证书的时候,会进行如下验证:
- 首先客户端会用设备中内置的CA的公钥尝试解密数字证书,如果所有内置的CA的公钥都无法解密该数字证书,说明该数字证书不是由一个全球知名的CA签发的,这样客户端就无法信任该服务器的数字证书。
- 如果有一个CA的公钥能够成功解密该数字证书,说明该数字证书就是由该CA的私钥签发的,因为被私钥加密的密文只能被与其成对的公钥解密。
- 除此之外,还需要检查客户端当前访问的服务器的域名是与数字证书中提供的“颁发给”这一项吻合,还要检查数字证书是否过期等。
参考书籍:
- 《图解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
此服务器无法证明它是 localhost
在Chrome下访问https://localhost:8443/hello/login.html时出现了
在Edge下访问https://localhost:8443/hello/login.html时出现了
两者的报错都差不多是:此服务器无法证明它是 localhost,它的安全证书不指定使用者可选名称。
我试图去查阅资料,但是没能找到解决办法。