文档章节

在 Tomcat 中配置 SSL/TLS 以支持 HTTPS

waylau
 waylau
发布于 2016/03/18 23:37
字数 1629
阅读 1165
收藏 124

本文同步至 http://waylau.com/tomcat-ssl-tls/

本件详细介绍了如何通过几个简单步骤在 Tomcat 中配置 SSL/TLS 、使用 JDK 生成自签名的证书,最终实现在应用中支持 HTTPS 协议。

生产密钥和证书

Tomcat 目前只能操作 JKS、PKCS11、PKCS12 格式的密钥存储库。JKS 是 Java 标准的“Java 密钥存储库”格式,是通过 keytool 命令行工具创建的。该工具包含在 JDK 中。PKCS12 格式一种互联网标准,可以通过 OpenSSL 和 Microsoft 的 Key-Manager 来。

创建一个 keystore 文件保存服务器的私有密钥和自签名证书:

Windows:

"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA

UNIX:

$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA

执行该命令后,首先会提示你提供 keystore 的密码。Tomcat 默认使用的密码是 changeit(全部字母都小写),当然你可以指定一个自定义密码(如果你愿意)。同样,你也需要将这个自定义密码在 server.xml 配置文件内进行指定,稍后再予以详述。

接下来会提示关于证书的一般信息,比如组织、联系人名称,等等。当用户试图在你的应用中访问一个安全页面时,该信息会显示给用户,所以一定要确保所提供的信息与用户所期望看到的内容保持一致。

最后,还需要输入密钥密码(key password),这个密码是这一证书(而不是存储在同一密码存储库文件中的其他证书)的专有密码。keytool 提示会告诉你,如果按下回车键,则自动使用密码存储库 keystore 的密码。当然,除了这个密码,你也可以自定义自己的密码。如果选择自定义密码,那么不要忘了在 server.xml 配置文件中指定这一密码。

下面是详细步骤:

C:\Users\admin>"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  waylau
您的组织单位名称是什么?
  [Unknown]:  waylau.com
您的组织名称是什么?
  [Unknown]:  waylau.com
您所在的城市或区域名称是什么?
  [Unknown]:  hangzhou
您所在的省/市/自治区名称是什么?
  [Unknown]:  zhejiang
该单位的双字母国家/地区代码是什么?
  [Unknown]:  china
CN=waylau, OU=waylau.com, O=waylau.com, L=hangzhou, ST=zhejiang, C=china是否正确
?
  [否]:  y

输入 <tomcat> 的密钥口令
        (如果和密钥库口令相同, 按回车):

如果操作全部正常,我们现在就会创建一个新的 JKS 密码存储库,该密码库包含一个自签名的证书。创建一个新的 JKS 密码存储库,该密码库包含一个自签名的证书。

该命令将在用户的主目录下创建一个新文件:.keystore

要想指定一个不同的位置或文件名,可以在上述的 keytool 命令上添加 -keystore 参数,后跟到达 keystore 文件的完整路径名。你还需要把这个新位置指定到 server.xml 配置文件上,见后文介绍。例如:

Windows:

"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA -keystore \path\to\my\keystore

Unix:

$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA
-keystore /path/to/my/keystore

修改配置

取消对 Tomcat 安装目录下 /conf/server.xml 中 “SSL HTTP/1.1 Connector” 一项的注释状态,并制定 keystore 的路径和密码:

 <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
			   keystoreFile="${user.home}/.keystore" keystorePass="changeit"
               clientAuth="false" sslProtocol="TLS" />

Tomcat 指定了 8443 端口为 HTTPS 访问端口。

效果

首先,浏览器访问没有 HTTPS 支持的页面,http://localhost:8080

接着,浏览器访问 HTTPS 的页面:https://localhost:8443/

当用户首次访问你站点上的安全页面时,页面通常会提供给他一个对话框,包含证书相关细节(比如组织及联系方式等),并且询问他是否愿意承认该证书为有效证书,然后再进行下一步的事务。一些浏览器可能会提供一个选项,允许永远承认给出的证书的有效性,这样就不会在用户每次访问站点时打扰他们了。但有些浏览器不会提供这种选项。一旦用户承认了证书的有效性,那么在整个的浏览器会话期间,证书都被认为是有效的。

火狐浏览器提示

此连接不受信任

您想使用 Firefox 安全连接至 localhost:8443,但是我们无法确认此连接是否安全。

通常,当您尝试安全连接时,站点会出示受信任的凭据,以证明您访问的是正确的位置。然而现在,此网站的身份无法核实。
怎么办?

如果您过去曾连接到此网站且没有遇到该问题,那么此错误表示可能有人试图冒充该网站,因此您应该停止浏览。

localhost:8443 使用了无效的安全证书。

该证书因为其自签名而不被信任。
该证书仅对 waylau 有效。

(错误码: sec_error_unknown_issuer)

如果您了解现在所发生的一切,您可以让 Firefox 开始信任此站点的凭据。即便您信任此站点,这个错误也可能表明有人试图干涉您的连接。

不要随便添加例外,除非您知道并认同该网站不使用受信任标识的理由。

而谷歌浏览器则提示如下:

总结

虽然 SSL 协议的意图是尽可能有助于提供安全且高效的连接,但从性能角度来考虑,加密与解密是非茶馆耗费计算资源的,因此将整个 Web 应用都运行在 SSL 协议下是完全没有必要的,开发者需要挑选需要安全连接的页面。对于一个相当繁忙的网站来说,通常只会在特定页面上使用 SSL 协议,也就是可能交换敏感信息的页面,比如:登录页面、个人信息页面、购物车结账页面(可能会输入信用卡信息),等等。应用中的任何一个页面都可以通过加密套接字来请求访问,只需将页面地址的前缀 http: 换成 https: 即可。

参考引用

© 著作权归作者所有

共有 人打赏支持
waylau

waylau

粉丝 524
博文 100
码字总数 182147
作品 2
深圳
架构师
私信 提问
加载中

评论(6)

waylau
waylau

引用来自“zxl78585”的评论

你还差一个强制跳转的,在web.xml文件中增加内容的
嗯,在我的原文上已经作了更新
zxl78585
zxl78585
你还差一个强制跳转的,在web.xml文件中增加内容的
yangjh_chs
yangjh_chs
https在容器上做好不好?如果单独用nginx之类的http server来做会不会好一些?
pantrick
pantrick
我们内网用的全https
waylau
waylau

引用来自“车开源”的评论

如今看来,启用SSL所花费的资源可忽略了,淘宝不是全站SSL嘛
JDK 生成只是“自签名”的证书,若要安装公认的 CA 证书,这个是要花大价钱的。
车开源
车开源
如今看来,启用SSL所花费的资源可忽略了,淘宝不是全站SSL嘛
开启全站HTTPS时代-Nginx SSL+tomcat集群

目录: 1、凭证申请 Let’s Encrypt 2、Nginx支持多域名ssl证书 3、Nginx强制使用https访问(http跳转到https) 4、配置 Tomcat SSL For Free 免费 SSL 凭证申请 Let’s Encrypt 什么是Let’s...

Javen205
2017/11/18
0
0
spring security3.x学习(19)_tomcat的SSL

本文为转载学习 原文链接:http://blog.csdn.net/dsundsun/article/details/11880683 在日常使用在线站点时,你很可能已经听说或使用过SSL。安全套接字层(SSL)协议,以及其后续的传输层安全...

heroShane
2014/02/02
0
0
HTTPS配置指导书

HTTPS配置指导书 版本:v1.0 作者:白树潮 SSL的证书类型? DV (Domain Validation): 面向个体用户,安全体系相对较弱,验证方式就是向 whois 信息中的邮箱发送邮件,按照邮件内容进行验证即可...

baishuchao
2017/08/22
0
0
Confluence 6 通过 SSL 或 HTTPS 运行

Atlassian 应用可以通过 HTTPS 进行访问,但是 Atlassian 并不提供有关访问的支持服务,同时 Atlassian 不能保证能够提供所有的支持。 如果你的 assistance 在证书转换方面有相关服务的需求,...

honeymose
2018/08/09
0
0
Nginx+Tomcat SSL配置指南|Nginx+Tomcat实现https安全链接

什么是HTTPS? HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加...

红薯
2012/02/28
6.3K
3

没有更多内容

加载失败,请刷新页面

加载更多

生产者消费者问题(PV操作)

一、明确定义 要理解生产消费者问题,首先应弄清PV操作的含义:PV操作是由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的值减...

shzwork
9分钟前
0
0
重新认识网络通信协议

OSI网络分层 应用层 http, smtp,pop3这些都属于应用层协议 为用户的应用程序提供服务 表示层 确保一个系统的应用层发送的信息被另一个系统的应用层接收到 会话层 通过传输层建立数据传输的通...

最胖的瘦子
20分钟前
0
0
【转】分布式数据流的轻量级异步快照

本篇翻译自论文:Lightweight Asynchronous Snapshots for Distributed Dataflows,Flink的容错快照模型即来源于该论文。原文地址:https://arxiv.org/pdf/1506.08603.pdf 分布式数据流的轻量...

yiduwangkai
22分钟前
0
0
java使用反射机制设置私有成员变量的值

写一个方法:public void setProperty(Objectobj, String propertyName, Object value){}, 此方法可将obj对象中名为propertyName的属性的值设置为value。(这里不知道obj对象的propertyNam...

群星纪元
28分钟前
0
0
用 Tapestry 的方式在页面模板中加入注释

<span jwcid="$remove$">这里是注释</span>

LeoXu
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部