热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Tomcat配置https方式访问

Tomcat配置https方式访问,Go语言社区,Golang程序员人脉社

1.准备安全证书

获得安全证书有两种方式:一种方式是到权威机构申购CA证书,还有一种方式是创建自我签名的证书。本文以自签名证书为例,使用SUN公司提供的证书制作工具keytool制作自签证书,JDK版本为1.8。首先打开cmd命令行,使用如下命令创建密钥库和密钥条目:

keytool -genkeypair -alias www.bo.org -keyalg RSA -keystore d:keystorebo.keystore -storetype pkcs12

输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  www.bo.org
您的组织单位名称是什么?
  [Unknown]:  xinwei
您的组织名称是什么?
  [Unknown]:  xinwei
您所在的城市或区域名称是什么?
  [Unknown]:  bj
您所在的省/市/自治区名称是什么?
  [Unknown]:  bj
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=www.bo.org, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn是否正确?
  [否]:  y

参数说明:

-genkeypair:生成一对非对称密钥并将公钥包装到X.509 v3自签名证书中;

-alias:指定密钥条目的别名,该别名是公开的;

-keyalg:指定加密算法,本例中的采用通用的RSA加密算法;

-keystore:指定密钥库的路径及名称,若密钥库不存在则创建。若不指定则默认在操作系统的用户目录下生成一个".keystore"的文件;

-storetype:指定密钥库的类型,如果不指定,默认是JKS。如果创建默认类型密钥库,命令行会提示转化为pkcs12类型,所以这里在创建时指定;

注:

1、执行上面命令后需要输入密钥库的口令,该口令需要配置在tomcat中,切记。

2、密钥库的密码至少必须6个字符,可以是纯数字或者字母或者数字和字母的组合等

3、"名字与姓氏"应该是输入域名,而不是我们的个人姓名,其他的可以不填

以上命令将在操作系统的指定目录:"D:keystore"下生成名为“bo.keystore”的密钥库文件,使用如下命令查看密钥库信息:

keytool -list -v -keystore D:keystorebo.keystore
 
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN
 
您的密钥库包含 1 个条目
 
别名: www.bo.org
创建日期: 2019-2-17
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=www.bo.org, OU=www.bo.org, O=xinwei, L=xinwei, ST=bj, C=bj
发布者: CN=www.bo.org, OU=www.bo.org, O=xinwei, L=xinwei, ST=bj, C=bj
序列号: 53e1769
有效期为 Sun Feb 17 21:42:31 CST 2019 至 Sat May 18 21:42:31 CST 2019
证书指纹:
         MD5:  D3:4B:91:FE:0D:08:77:D2:AC:8D:65:10:F1:26:30:2F
         SHA1: CB:43:4E:B5:03:5B:FC:60:FA:DC:BF:EC:02:E1:FA:C8:9C:53:D4:FE
         SHA256: 5D:44:89:D4:FF:1A:70:45:67:2D:3D:14:11:72:61:1D:D3:9A:EA:01:4B:
43:FD:38:F6:A9:38:B8:78:7D:53:3E
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
 
扩展:
 
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: C6 AB A5 21 DC 68 97 79   91 5C D1 0D A3 3A C4 DA  ...!.h.y....:..
0010: 64 F7 73 3A                                        d.s:
]
]
 
 
 
*******************************************
*******************************************

根据查询结果可知,生成的密钥库中包含一个名为"www.bo.org"的条目,该条目下包含一个私钥和一个封装公钥的自签证书。

2.配置tomcat服务器

打开"confserver.xml"配置文件,找到如下注释的代码行(本例为tomcat 8):

    

去掉注释并改为如下配置:

    

其中keystoreFile填写之前用keytool生成的密钥库的文件路径,keystorePass填写密钥库口令。注意,如果protocol="HTTP/1.1",需要将其替换为 protocol="org.apache.coyote.http11.Http11Protocol",否则可能报错:

org.apache.catalina.core.StandardService initInternal
严重: Failed to initialize connector [Connector[HTTP/1.1-443]]
org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/1.1-443]]
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:106)
at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:814)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.startup.Catalina.load(Catalina.java:633)
at org.apache.catalina.startup.Catalina.load(Catalina.java:658)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:281)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)
Caused by: org.apache.catalina.LifecycleException: Protocol handler initialization failed
at org.apache.catalina.connector.Connector.initInternal(Connector.java:983)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
... 12 more
Caused by: java.lang.Exception: Connector attribute SSLCertificateFile must be defined when using SSL with APR
at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:507)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:610)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:429)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:981)
... 13 more

对于protocol有多种配置方式,如:是否启用apr的方式,不同的方式有不同的配置,具体可以参考官方文档。这里采用Http11Protocol,它采用的是bio的方式处理网络连接请求,至于bio,nio,apr三种方式的区别不在本文讨论之列。在互联网上,http协议的默认端口是80,https的默认端口是443,这里将端口改为了443,访问https时可不用加端口号。

标签相关属性说明如下表:

属 性 描  述
clientAuth 如果设置为true,表示Tomcat要求所有的SSL客户端出示安全证书,对SSL客户端进行身份验证。
keystoreFile 指定密钥库文件的存放位置,可以指定绝对路径,也可以指定相对于 (Tomcat安装目录)环境变量的相对路径。若没有设定,默认情况下,Tomcat将从当前操作系统用户的用户目录下读取名为 “.keystore”的文件。
keystorePass 指定密钥库的密码,如果此项没有设定,在默认情况下,Tomcat将使用“changeit”作为默认密码。
truststoreFile 指定信任库文件的存放位置,同keystoreFile配置。客户端信任证书将导入此库,它用来验证客户端证书。
truststorePass 指定信任库的密码,如果此项没有设定,在默认情况下,Tomcat将使用“changeit”作为默认密码。
sslProtocol 指定套接字(Socket)使用的加密/解密协议,默认值为TLS,用户不应该修改这个默认值。
ciphers 指定套接字可用的用于加密的密码清单,多个密码间以逗号","分隔。若此项没有设定,在默认情况下,套接字可以使用任意一个可用的密码。

3.启动tomcat进行测试

上述配置的证书域名是"www.bo.org",但是该域名不存在,这里为了测试效果将其映射到本机ip,配置hosts文件,添加如下内容:

127.0.0.1  www.bo.org

使用IE浏览器访问 https://www.bo.org 页面提示:

.

选择继续浏览方可打开tomcat主页,但是会提示证书有问题:

.

使用火狐浏览器访问 https://www.bo.org 页面提示:

.

选择添加例外继续浏览,出现tomcat主页:

.

打开火狐浏览器证书管理页面发现已经将"www.bo.org"的证书添加到例外信任证书列表:

.

4.导入证书到客户端

以IE浏览器为例,如果服务端的证书为非CA机构签发,这种情况下让客户端信任服务端证书,则需要将证书链中的中级证书添加到中级证书机构、将根证书添加到受信任根证书机构,因为客户端在校验服务端证书时会通过证书链逐级向上校验直到根证书,根证书是自签名证书,客户端对根证书无条件信任。本例中服务端的证书是自签名证书,证书链中只有它本身,可视作根证书,所以只需将其导入到受信任根证书机构即可通过客户端的证书校验,步骤如下:

1)导出服务端证书(链)

使用tomcat配置的密钥库文件"d:keystorebo.keystore"导出证书到"d:keystorebo.crt",cmd命令:

keytool -exportcert -alias www.bo.org -keystore d:keystorebo.keystore -file d:keystorebo.crt

输入密钥库口令:
存储在文件  中的证书

2)客户端导入证书(链)

打开IE浏览器的Internet选项  ----> 内容  ----> 证书

.

选择"受信任的根证书颁发机构"  ----> 导入证书

.

将之前生成的证书导入进来,其余的步骤直接下一步即可

.

.

4.配置https双向认证

打开"confserver.xml",将第二步中标签的配置改为如下:

    

第二步的https配置其实是单向SSL认证,即只是客户端验证服务端身份;此处将clientAuth属性设为true,意为tomcat服务端也要求验证客户端的身份,客户端在访问服务端时需要出具安全证书以证明身份合法,即SSL双向认证。truststoreFile和truststorePass属性分别设置tomcat服务端信任库文件的路径和密码,信任库文件存放各个客户端的信任证书,用来校验客户端证书合法性,为了简便这里使用keystoreFile来替代truststoreFile。

为客户端生成安全证书:

keytool -genkey -keyalg RSA -alias client -keystore D:keystoreclient.p12 -storetype pkcs12

输入密钥库口令:
密钥库口令太短 - 至少必须为 6 个字符
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  bo
您的组织单位名称是什么?
  [Unknown]:  xinwei
您的组织名称是什么?
  [Unknown]:  xinwei
您所在的城市或区域名称是什么?
  [Unknown]:  bj
您所在的省/市/自治区名称是什么?
  [Unknown]:  bj
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=bo, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn是否正确?
  [否]:  y

注:为了能将证书顺利导入至IE和Firefox,因此证书格式应该是PKCS12,后缀为".p12"。

导出客户端信任证书:

keytool -exportcert -alias client -keystore D:keystoreclient.p12 -file D:keystoreclient.crt

输入密钥库口令:
存储在文件  中的证书

客户端信任证书导入到服务端信任库:

keytool -importcert -file D:keystoreclient.crt -keystore D:keystorebo.keystore

输入密钥库口令:
所有者: CN=bo, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn
发布者: CN=bo, OU=xinwei, O=xinwei, L=bj, ST=bj, C=cn
序列号: 1be3c916
有效期为 Tue Feb 19 23:54:52 CST 2019 至 Mon May 20 23:54:52 CST 2019
证书指纹:
         MD5:  4A:2E:1D:D2:1C:19:D0:8F:E9:40:8B:3E:A5:57:81:8C
         SHA1: 69:47:00:1A:7D:69:8B:F8:2C:5A:5F:19:D0:E7:6E:EA:A7:07:E1:77
         SHA256: E5:5B:B1:7B:A3:75:29:58:E9:BA:89:8E:24:4F:22:9C:21:34:D3:FD:98:
01:19:35:70:FA:F7:C8:EC:8D:0E:47
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: F5 9F 5D BB 34 55 BD B2   FB FC D5 4F 89 29 47 16  ..].4U.....O.)G.
0010: 54 D5 8F 52                                        T..R
]
]

是否信任此证书? [否]:  y
证书已添加到密钥库中

注:最后提示是否信任该证书,选择信任,或者在导入时添加"-trustcacerts"参数信任导入的证书。

重启tomcat,浏览器访问 https://www.bo.org,页面提示:

.

这是因为浏览器客户端还未安装身份证书,将上面生成的"client.p12"安全证书安装到火狐浏览器,打开选项-隐私与安全-查看证书界面,选择"您的证书"并导入:

.

提示“请输入被用来加密此证书备份的密码”时随便输入一个即可,导入后界面如下:

.

再次访问https://www.bo.org恢复正常:

.

IE浏览器安装客户端身份证书步骤:

双击client.p12文件安装或者在IE浏览器中"Internet选项 - 内容 - 证书 - 个人" 选项卡导入,然后一路next,私钥密码随便即可:

.

IE地址栏输入https://www.bo.org,提示“确认证书”(可能存在多个身份证书),选择刚才导入的证书即可并确认:

.

正确跳转到tomcat主页面,地址栏显示小锁头安全标志: 

.

5.配置http自动跳转https

打开"confweb.xml",在该文件末尾处标签后面加上这样一段:

  
      
    CLIENT-CERT  
    Client Cert Users-only Area  
  
  
      
      
        SSL  
        /*  
      
      
        CONFIDENTIAL  
      

这步的目的是让非ssl的connector跳转到ssl的connector去,所以还需前往server.xml进行配置,将如下redirectPort改成ssl的connector的端口443:



上述配置完成后,重启tomcat便会生效,例:浏览器输入"http://www.bo.org:8080"将自动跳转到"https://www.bo.org"。

参考资料

配置Tomcat使用https协议

Tomcat如何配置https访问

Apr方式配置Tomcat的https

Https原理及tomcat配置https

Https原理及tomcat配置https双向认证

Tomcat如何配置CA证书


推荐阅读
  • 如何利用Git实现高效的多人协作开发(远程仓库应用实例)——Ares Zhao
    Git作为一种分布式版本控制系统,每位开发者都是本地仓库的管理者。然而,为了实现团队间的高效协作,需要将本地的开发成果推送至远程共享仓库,以便其他成员能够同步更新。本文将以GitHub为例,详细介绍如何通过设置和使用远程仓库,实现多人协作开发的最佳实践。 ... [详细]
  • 本文深入探讨了Java枚举类型的使用与实践,详细解析了枚举的基本用法及其在实际开发中的应用。首先介绍了枚举作为常量的替代方案,自JDK 1.5起,通过枚举可以更加简洁、安全地定义常量,避免了传统方式中可能出现的错误。此外,文章还探讨了枚举在实现单例模式、状态机等场景中的优势,并提供了多个实际案例,帮助开发者更好地理解和运用这一强大的语言特性。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 在搭建Hadoop集群以处理大规模数据存储和频繁读取需求的过程中,经常会遇到各种配置难题。本文总结了作者在实际部署中遇到的典型问题,并提供了详细的解决方案,帮助读者避免常见的配置陷阱。通过这些经验分享,希望读者能够更加顺利地完成Hadoop集群的搭建和配置。 ... [详细]
  • 技术日志:Ansible的安装及模块管理详解 ... [详细]
  • Java 模式原型在游戏服务器架构中的应用与优化 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
  • 深入解析JWT的实现与应用
    本文深入探讨了JSON Web Token (JWT) 的实现机制及其应用场景。JWT 是一种基于 RFC 7519 标准的开放性认证协议,用于在各方之间安全地传输信息。文章详细分析了 JWT 的结构、生成和验证过程,并讨论了其在现代 Web 应用中的实际应用案例,为开发者提供了全面的理解和实践指导。 ... [详细]
  • 在Python编程中,掌握高级技巧对于提升代码效率和可读性至关重要。本文重点探讨了生成器和迭代器的应用,这两种工具不仅能够优化内存使用,还能简化复杂数据处理流程。生成器通过按需生成数据,避免了大量数据加载对内存的占用,而迭代器则提供了一种优雅的方式来遍历集合对象。此外,文章还深入解析了这些高级特性的实际应用场景,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 深入解析 Unity URP/SRP 渲染管线:匠心打造的全面指南
    本文深入探讨了Unity中的URP、SRP和HDRP渲染管线,详细解析了它们之间的关系及各自的特点。首先介绍了SRP的基本概念及其在Unity渲染架构中的作用,随后重点阐述了URP和HDRP的设计理念与应用场景。文章还分析了SRP诞生的背景,解释了为何Unity需要引入这一灵活的渲染框架,以满足不同项目的需求。通过对比URP和HDRP,读者可以更好地理解如何选择合适的渲染管线,以优化项目的性能和视觉效果。 ... [详细]
  • 本文深入解析了如何通过自定义 ViewGroup 实现类似支付宝风格的酷炫雷达脉冲动画效果。文章详细介绍了自定义 ViewGroup 的原理和实现步骤,并结合实际案例展示了如何在 Android UI 设计中应用这一技术,为开发者提供了宝贵的参考和实践指导。 ... [详细]
  • MySQL索引详解及其优化策略
    本文详细解析了MySQL索引的概念、数据结构及管理方法,并探讨了如何正确使用索引以提升查询性能。文章还深入讲解了联合索引与覆盖索引的应用场景,以及它们在优化数据库性能中的重要作用。此外,通过实例分析,进一步阐述了索引在高读写比系统中的必要性和优势。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • RancherOS 是由 Rancher Labs 开发的一款专为 Docker 设计的轻量级 Linux 发行版,提供了一个全面的 Docker 运行环境。其引导镜像仅 20MB,非常适合在资源受限的环境中部署。本文将详细介绍如何在 ESXi 虚拟化平台上安装和配置 RancherOS,帮助用户快速搭建高效、稳定的容器化应用环境。 ... [详细]
author-avatar
309283099_882fa8
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有