Tomcat与HTTPS单向认证:深入了解与配置指南
一、引言
随着互联网技术的不断发展,Web应用的安全性越来越受到关注。
作为广泛使用的开源Web服务器和Servlet容器,Apache Tomcat在实现安全通信方面扮演着重要角色。
其中,HTTPS单向认证作为一种常见的安全通信方式,能够确保客户端与服务器之间的数据传输安全。
本文将详细介绍Tomcat与HTTPS单向认证的相关知识,包括其原理、配置方法和常见问题解决。
二、HTTPS单向认证概述
HTTPS单向认证是一种基于SSL/TLS的安全通信协议,其主要目的是在客户端和服务器之间建立加密通道,确保数据传输的安全性和完整性。
在HTTPS单向认证过程中,服务器向客户端提供自己的公钥证书,客户端验证服务器证书的合法性后,与服务器建立安全连接。
在此过程中,客户端不需要提供证书给服务器,因此称为单向认证。
三、Tomcat中的HTTPS配置
1. 生成密钥库和证书
在配置Tomcat的HTTPS之前,需要生成密钥库和证书。
可以使用Java的keytool工具生成密钥库和自签名证书。
生成过程中需要设置密钥库密码、别名、密钥密码等参数。
生成完成后,将密钥库文件(.jks或.pfx)保存在服务器上的安全位置。
2. 配置Tomcat的server.xml文件
在Tomcat的conf目录下找到server.xml文件,进行以下配置:
(1)配置HTTP连接器,将协议从HTTP更改为HTTPS。例如:
“`xml
<br> “`
其中,keystoreFile参数指定密钥库文件的路径,keystorePass参数指定密钥库密码。clientAuth属性设置为false表示不进行双向认证。
(2)配置SSL证书的相关信息。例如:
“`xml
<br type=RSA>
“`
3. 配置Tomcat的web.xml文件(可选)
如果需要针对特定的Web应用进行HTTPS配置,可以在web.xml文件中进行配置。
例如,可以配置安全约束和登录配置等。
四、HTTPS单向认证过程
1. 客户端发起HTTPS请求;
2. 服务器响应请求,发送自己的公钥证书;
3. 客户端验证服务器证书的合法性;
4. 客户端与服务器建立SSL/TLS加密通道;
5. 客户端和服务器进行数据交换。
五、常见问题及解决方式
1. 客户端无法验证服务器证书:确保服务器证书是由受信任的证书颁发机构(CA)签发的,或者客户端配置了信任自定义证书的信任库。
2. 客户端提示证书不受信任:需要将服务器证书导入客户端的信任库中,或者配置客户端信任自签名证书。
3. Tomcat启动失败:检查server.xml文件中的配置是否正确,特别是密钥库路径、密码等参数是否正确。
4. HTTPS连接不稳定:检查网络状况,确保服务器和客户端之间的网络连接稳定。还需检查证书是否过期,以及服务器和客户端的时钟是否同步。
六、总结与展望
本文详细介绍了Tomcat与HTTPS单向认证的相关知识,包括其原理、配置方法和常见问题解决。
通过合理配置Tomcat的server.xml和web.xml文件,可以实现HTTPS单向认证,确保Web应用的安全性。
随着网络安全需求的不断提高,未来的Tomcat版本可能会引入更多的安全特性和配置选项,以满足更严格的安全要求。
因此,建议读者关注Tomcat的最新版本和相关安全动态,以便更好地保障Web应用的安全。
tomcat只能处理http协议的请求吗
在默认的配置中tomcat采用Http11Protocol这个类来处理接收到的请求,Http11Protocol又调用JIoEndpoint类实现对数据的接收,JIoEndpoint类调用Http11Processor类实现对数据的解析。
当然还可以采用jno的方式接收请求,它的特点是处理并发请求效率高。
原因是采用jno处理socket,不用为每个socket都分配线程。
因为jno中增加了选择器selector,它可以监视各个TCP连接,把准备好的TCP连接交给上层来处理。
这个还是得操作系统支持这种监视TCP连接的特性,在一个不支持此特定的操作系统上用jno也是枉然,关于tomcat采用jno方式接收请求,还需用业余时间好好了解下。
具体说明一下JIoEndpoint类,它是怎样接收数据的。
在init()方法中serverSocket = (port, backlog, address);创建serverSocket监听8080端口,说明了tomcat原来是用socket来接收请求的。
然后启动了Acceptor线程这个线程的run方法:Socket socket = (serverSocket);再看的实现public Socket acceptSocket(ServerSocket socket)throws IOException {return ();}一个典型的socket应用方式。
serverSocket监听请求。
再接收到socket后,处理这个socket。
这个socket就是浏览器或其他客户端与服务器建立的TCP连接。
在这个连接中,传输了http协议格式的内容。
protected boolean processSocket(Socket socket) {try {if (executor == null) {getWorkerThread()(socket);} else {(new SocketProcessor(socket));}} catch (Throwable t) {// This means we got an OOM or similar creating a thread, or that// the pool and its queue are ((), t);return false;}return true;}如果有jdk的线程池,就采用jdk自带的线程池处理它。
如果没有就用JIoEndpoint类中实现的简易线程池处理。
默认的情况下没有配置jdk线程池,于是采用简易线程池处理。
简易线程池是JIoEndpoint类的内部类WorkerStack以及Worker实现的。
worker是一个线程,处理socket,同时加入了生产者WorkerStack包含worker的数组以及对这个数组的处理。
getWorkerThread()是从WorkerStack中拿一个已经启动的worker线程出来。
重点讲述worker。
assign(socket) 调用worker的assign方法。
以下是worker的三个重要方法以及一个重要的变量availableprotected boolean available = false;synchronized void assign(Socket socket) {// Wait for the Processor to get the previous Socketwhile (available) {try {wait();} catch (InterruptedException e) {}}// Store the newly available Socket and notify our = socket;available = true;notifyAll();}private synchronized Socket await() {// Wait for the Connector to provide a new Socketwhile (!available) {try {wait();} catch (InterruptedException e) {}}// Notify the Connector that we have received this SocketSocket socket = ;available = false;notifyAll();return (socket);}public void run() {// Process requests until we receive a shutdown signalwhile (running) {// Wait for the next socket to be assignedSocket socket = await();if (socket == null)continue;// Process the request from this socketif (!setSocketOptions(socket) || !(socket)) {// Close sockettry {();} catch (IOException e) {}}// Finish up this requestsocket = null;recycleWorkerThread(this);}}首先worker线程是运行着的,它执行到await()的时候,available为false,这时等待,不再继续执行。
调用assign的时候,available为false,不执行wait,方法继续执行,获得了一个socket,然后通知这个线程可以继续执行了。
于是在await()方法中,开始继续执行,返回Socket socket,run方法继续执行处理这个socket.处理完毕后,再次调用await(),available为false,再次等待。
直到再次assign唤醒它。
这样一个线程可以为多个socket服务。
先总结到这里。
线程同步,如果写不好。
就用jdk自带的线程池吧。
centos中tomcat的ssl证书怎么配置
步骤:假设我们tomcat的路径为/opt/tomcat,在此目录下新建ssl目录用于存放证书:cd /opt/tomcat/ssl一、首先,我们需要生成SSL证书,用到keytool工具,关键有三步:①生成keystone,用以下命令#keytool -genkey -alias ssologin -keyalg RSA -keypass changeit -storepass changeit -keystore -validity 3650注:changeit是jdk中证书默认的密码②从keysotre中导出别名为tomcat-cas-server的证书,生成文件#keytool -export -trustcacerts -alias ssologin -file -storepass changeit③将导入到jre的可信任证书仓库#keytool -import -trustcacerts -alias ssologin -file -keystore$JAVA_HOME/jre/lib/security/cacerts -storepass changeit注意:如果是windows主机,使用%JAVA_HOME%,如果是linux就使用$JAVA_HOME二、配置好证书之后,我们需要配置tomcat支持SSL修改conf/文件,其中SSL部分如下,其它不用动:<Connector port=443 protocol=HTTP/1.1 connectionTimeout=5000 URIEncoding=UTF-8 scheme=https secure=true SSLEnabled=true clientAuth=false sslProtocol=TLS keystoreFile=/opt/tomcat/ssl/ keystorePass=changeit/>修改后之后,重启tomcat即可生效再正式访问之前,记得把防火墙的443端口打开,centos的iptables配置如下:#vi /etc/sysconfig/iptables添加以下配置:-A INPUT -m state –state NEW -m tcp -p tcp –dport 443 -j ACCEPT配置完之后记得重启iptables:#service iptables restartiptables重启之后,你就可以通过浏览器访问了三、tomcat作为SSL的客户端如果我们的应用作为客户端需要与开启SSL的服务器进行通信,那我们必须将服务器证书安装在jre的可信列表中.具体步骤是:将上述第一步中的第②小步生成的分发给需要使用的客户端,然后在客户端用keytool工具导入到jre的可信列表,如下命令:#keytool -import -trustcacerts -alias ssologin -file -keystore%JAVA_HOME%/jre/lib/security/cacerts -storepass changeit注意:我这里的机器是windows机器,所以使用%JAVA_HOME%,其实这个导入过程和一.③是一样的四、其它可能会用到的证书相关命令①列出系统仓库中存在的证书名称:#keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit如本文中添加的证书,会找到这么一行ssologin, 2014-9-4, trustedCertEntry,认证指纹 (MD5): 12:3B:02:6F:78:6E:A6:D3:AB:96:CA:63:7D:7B:55:04②消除系统中存在的名为ssologin的证书#keytool-delete-aliasssologin-keystore$JAVA_HOME/jre/lib/security/cacerts -storepass changeit#keytool -delete -alias ssologin -storepass changeit
如何切割tomcat时间段日志
(1)首先安装cronologyum install cronolog -y(2)修改Tomcat配置文件先停止tomcat服务,然后修改以下文件:%CATALINA_HOME%/bin/将 $@ start \>> $CATALINA_BASE/logs/ 2>&1 &替换为 $@ start 2>&1 \| /usr/sbin/cronolog $CATALINA_BASE/logs/catalina.%Y-%m-% >> /dev/null &修改完毕后重新启动tomcat服务。