一般的网页传输都是基于http协议,在网络中流通的信息都为明文,非常容易泄密。为保证网站信息不被中间服务器或者其它探测软件捕获,一般企业都使用SSL对网页内容加密,下面介绍tomcat中的SSL加密,详细可参考链接:http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html
tomcat的加密根据自身的特色分两种情况,一种为使用Java runtime(非APR),一种为OpenSSL library (through APR/Tomcat-Native). 这两种的配置完全不同,下面分别介绍,读者可以按自己应用的情况分别选择。
一、Java runtime(非APR)情况
1、产生client /server java key store
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.SignatureException;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.util.Date;
import javax.security.auth.x500.X500Principal;
import javax.security.auth.x500.X500PrivateCredential;
import org.bouncycastle.jce.provider.asymmetric.ec.KeyPairGenerator;
import org.bouncycastle.x509.X509V3CertificateGenerator;
/**
*
* Tomcat HTTPS client/server key Certificate generator
*
*/
public class TomcatKey {
//Client Certificate
static String TRUST_STORE_NAME = "client";
static char[] TRUST_STORE_PASSWORD = "test".toCharArray();
//Server Certificate
static String SERVER_NAME = "server";
static char[] SERVER_PASSWORD = "test".toCharArray();
static String SERVER_HOST = "localhost";
/**
* @param args
*/
public static void main(String[] args) {
try {
// trustsotre, my root certificate
KeyStore store = KeyStore.getInstance("JKS");
// initialize
store.load(null, null);
KeyPair rootPair = generateKeyPair();
X500PrivateCredential rootCredential = createRootCredential(rootPair);
store.setCertificateEntry(TRUST_STORE_NAME, rootCredential
.getCertificate());
store.store(new FileOutputStream(TRUST_STORE_NAME + ".keystore"),
TRUST_STORE_PASSWORD);
// server credentials
store = KeyStore.getInstance("JKS");
store.load(null, null);
store.setKeyEntry(SERVER_NAME, rootCredential.getPrivateKey(),
SERVER_PASSWORD, new Certificate[] { rootCredential
.getCertificate() });
store.store(new FileOutputStream(SERVER_NAME + ".keystore"),
SERVER_PASSWORD);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
//generate Key Pair
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException,
NoSuchProviderException {
// create the keys
java.security.KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(1024, new SecureRandom());
return generator.generateKeyPair();
}
//generate certificate
public static X500PrivateCredential createRootCredential(KeyPair rootPair) throws Exception {
X509Certificate rootCert = generateX509V3RootCertificate(rootPair);
return new X500PrivateCredential(rootCert, rootPair.getPrivate());
}
public static X509Certificate generateX509V3RootCertificate(KeyPair pair)throws NoSuchAlgorithmException,
NoSuchProviderException, CertificateEncodingException, InvalidKeyException,
IllegalStateException, SignatureException {
X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
certGen.setIssuerDN(new X500Principal("CN=" + SERVER_HOST+ ", OU=GoldenSF, O=SHA, C=cn"));
certGen.setNotBefore(new Date(System.currentTimeMillis() - 5000L));
certGen.setSubjectDN(new X500Principal("CN=" + SERVER_HOST+ ", OU=GoldenSF, O=SHA, C=cn"));
certGen.setPublicKey(pair.getPublic());
certGen.setSignatureAlgorithm("SHA1WithRSA");
certGen.setNotAfter(new Date(System.currentTimeMillis() + Integer.MAX_VALUE));
return certGen.generate(pair.getPrivate(), new SecureRandom());
}
}
2、将产生的文件:client.keystore, and server.keystore放到apache-tomcat-7/conf下面
3、修改/conf/server.xml如下:
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<!--<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> -->
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="443" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="conf/server.keystore" keystorePass="test"
truststoreFile ="conf/client.keystore" truststorePass="test"/>
<Connector port="8009" enableLookups="false" redirectPort="443" protocol="AJP/1.3" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" resolveHosts="false"/>
</Host>
</Engine>
</Service>
</Server>
4、启动tomcat, 如果 https://localhost/ 能正常打开,说明配置成功。
一些注意:
1)如果不使用JAVA文件生成keystore,也可以通过JDK自带的命令生成,
如生成服务器端证书 keytool -genkey -keyalg RSA -dname "cn=localhost,ou=test,o=test,l=hongkong,st=hk,c=hk" -alias server -keypass asdfzxcv23 -keystore server.jks -storepass asdfzxcv23 -validity 3650 客户端的CN可以是任意值,具体的可以参考相关文章
2)在修改server.xml时,需要将tomcat的默认APR配置删除
<!--<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> -->
3)如果之前有APR的配置,需要删除文件bin\tcnative-1.dll
4)注意JAVA文件生成的key和密码一定要与配置中的一致,区分大小写。
二、OPENSSL library (through APR/Tomcat-Native)情况
1、首先需要到OPENSSL网站下载OpenSSL-Win32(或者Linux),安装非常简单
2、利用OPENSSL生成公钥
D:\OpenSSL-Win32\bin>openssl
genrsa -des3 -out key1.pem 2048
enter pwd: test, to get a file : key1.pem
3、继续利用OPENSSL生成私钥
req -new -x509 -key key1.pem -out key1cert.pem -days 1095
得到文件: key1cert.pem
4、将这两个文件放到apache-tomcat-7\conf目录下,并修改server.xml为如下内容:
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false"
SSLEnabled="true"
protocol="org.apache.coyote.http11.Http11AprProtocol"
SSLCertificateFile="D:\apache-tomcat-7\conf\key1cert.pem"
SSLCertificateKeyFile="D:\apache-tomcat-7\conf\key1.pem"
SSLPassword="test"
/>
<Connector port="8009" enableLookups="false" redirectPort="443" protocol="AJP/1.3" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" resolveHosts="false"/>
</Host>
</Engine>
</Service>
</Server>
5、启动tomcat ,https://localhost如果能正常打开,说明配置成功。
几点注意:
1)、注意APR是否已经正常配置,
2)、在启动tomcat前需要确认任务管理器中没有其它tomcat进程在执行(一般删除所有javaw.exe即可),免得造成冲突,提示:java.lang.Exception: Socket bind failed;
3)、密码要一致,文件名不可写混。
以上是我在tomcat环境下配置HTTPS的一点心得,欢迎大家指正。
分享到:
相关推荐
本文将详述如何在Tomcat服务器上安装SSL证书,确保您的应用能够提供安全的HTTPS服务。 首先,我们需要理解SSL(Secure Socket Layer)和HTTPS(HyperText Transfer Protocol Secure)的基本概念。SSL是一种网络通信...
【描述】: "本文将详述如何为正式的Tomcat环境设置双向SSL认证,以提高Web服务的安全性。我们将参照IBM developerWorks中国网站2002年5月的一篇文章,并针对Tomcat 5系列的配置差异和现有实践中的问题进行优化。" ...
本文档将详述如何在Tomcat服务器上部署SSL证书,使其支持安全的HTTPS访问,同时以沃通电子认证服务有限公司提供的数字证书为实例,介绍具体的步骤和注意事项。 首先,获取SSL证书是部署SSL/TLS的第一步。用户需要从...
【描述】: "本文详述了如何在Apache Tomcat 9中使用免费的Https证书来加密网站,确保数据传输的安全性,适用于需要保护敏感信息的站点。" 【标签】: "Tomcat9, 网站加密证书, Tomcat9 Https加密网站" 【正文】: ...
通过调整Tomcat的配置,我们可以实现负载均衡、集群、SSL加密、JNDI服务、连接池等功能,使其成为满足复杂需求的强大后端支持。同时,对于初学者,了解和掌握Tomcat的基本操作,如启动、停止、部署应用,以及配置...
4. 安全管理:讲解如何加强Tomcat的安全性,防止未授权访问和攻击,包括用户认证、角色管理以及SSL/TLS配置。 5. 故障排查:分享诊断和解决Tomcat常见问题的方法,帮助开发者快速定位和修复问题。 接下来是...
本篇将详述一个公司在进行HTTPS改造时可能涉及的关键配置文件,包括`nginx.conf`和`Tomcat`的`server.xml`。 首先,`nginx.conf`是Nginx服务器的主要配置文件,用于定义服务器的行为、监听端口、虚拟主机以及如何...
- **Config Reference**:详述了Tomcat的配置文件(如server.xml、context.xml等)中的元素和属性,是配置Tomcat的必备资料。 - **Javadocs**:包含了Tomcat所有公开API的详细文档,对于理解和使用Tomcat的API进行...
3. **配置与管理**:详述如何配置Tomcat,包括server.xml、context.xml等配置文件的解析,以及如何通过管理工具如Manager App和Host Manager进行应用部署、监控和管理。 4. **安全性**:讲解如何保护Tomcat服务器免...
3. **部署与配置**:详述如何配置Tomcat服务器,包括server.xml、web.xml等配置文件的解析,以及WAR文件的部署方式。 4. **安全性**:讨论Tomcat的安全机制,如SSL/TLS配置、用户认证、角色管理以及防火墙规则设置...
4. **安全管理**:理解Tomcat的安全配置,包括设置用户角色、访问控制、SSL/TLS配置,以及如何使用 Realm组件进行身份验证。 5. **日志管理**:了解如何配置和分析Tomcat的日志,这对于排查问题和优化性能至关重要...
5. **配置参考**:详述了Tomcat的配置文件,如server.xml、web.xml、context.xml等,以及它们的元素、属性和用法。这有助于理解并自定义Tomcat的行为。 6. **FAQ**:常见问题解答部分,针对用户在使用过程中可能...
10. **安全指南** - 提供了关于Tomcat安全性的最佳实践,包括如何配置SSL/TLS、管理权限和保护敏感数据。 通过深入研究这些文档,不仅可以了解Tomcat的内部工作原理,还能提高你在实际项目中对Tomcat的使用效率,...
5. **增强的安全性**:新版本修复了已知的安全漏洞,并提供了更好的安全配置选项,如加强的SSL/TLS配置,有助于保护Web应用免受攻击。 6. **更好的性能和稳定性**:Tomcat 9.0经过了大量测试和优化,提升了性能和...
3. **配置文档**:详述Tomcat的配置文件(如server.xml、web.xml)的用法和常见设置。 4. **源码分析**:展示已编写的Java Web项目的源代码,以便学习者研究和模仿。 5. **环境搭建指南**:步骤指导如何在本地机器上...
为了保持内容的丰富性和实用性,这里没有详述每个技术的内部细节,但提供了足够的信息以展现Tomcat在其早期版本中所扮演的角色以及与Linux等技术的结合。如果需要深入学习,可以参考Linux公社发布的专业教程和文章,...
2. **安装与配置**:详述了Tomcat的下载、安装过程,以及如何配置server.xml等核心配置文件,以满足不同环境需求。 3. **部署应用**:介绍了WAR文件的部署方式,以及如何在Tomcat目录结构下手动部署和管理应用程序...
【描述】:本文将详述Apache Tomcat 6和7的安装与配置过程,旨在帮助初学者和有经验的开发者理解这两个版本的Tomcat服务器如何在不同的操作系统上进行部署和管理。 **一、Apache Tomcat简介** Apache Tomcat是一款...
6. **SECURITY.html**: 关于Tomcat安全性的指南,包括如何配置SSL/TLS连接、用户认证和访问控制。 7. **MANAGER/html**: 提及Tomcat的Manager应用,用于部署、管理、监控Web应用程序。 8. **HOST-MANAGER/html**: ...
2. **安装与配置**:详述了在多种操作系统上安装Tomcat的过程,以及如何根据需求进行配置,如调整内存分配、设置端口、管理用户权限等。 3. **部署Web应用**:涵盖了WAR文件的部署、目录结构、部署描述符(web.xml...