zoukankan      html  css  js  c++  java
  • 用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,它的安全证书不指定使用者可选名称。

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

  • 相关阅读:
    WordPress WooCommerce ‘hide-wc-extensions-message’参数跨站脚本漏洞
    WordPress WP-Realty插件‘listing_id’参数SQL注入漏洞
    WordPress Videowall插件‘page_id’参数跨站脚本漏洞
    MySQL备忘点(上)
    Print工具类
    用于图片缩放的工具类
    重载、重写、方法相同
    Try-Catch-Finally代码块中的return
    Fltiss项目的架构、包名的定义和类的划分
    优化版快速排序
  • 原文地址:https://www.cnblogs.com/blingblingXY/p/13939852.html
Copyright © 2011-2022 走看看