tomcat配置https详述

一般的网页传输都是基于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
Java代码  收藏代码
  1. import java.io.FileOutputStream;  
  2. import java.math.BigInteger;  
  3. import java.security.InvalidKeyException;  
  4. import java.security.KeyPair;  
  5. import java.security.KeyStore;  
  6. import java.security.NoSuchAlgorithmException;  
  7. import java.security.NoSuchProviderException;  
  8. import java.security.SecureRandom;  
  9. import java.security.SignatureException;  
  10. import java.security.cert.Certificate;  
  11. import java.security.cert.CertificateEncodingException;  
  12. import java.security.cert.X509Certificate;  
  13. import java.util.Date;  
  14. import javax.security.auth.x500.X500Principal;  
  15. import javax.security.auth.x500.X500PrivateCredential;  
  16. import org.bouncycastle.jce.provider.asymmetric.ec.KeyPairGenerator;  
  17. import org.bouncycastle.x509.X509V3CertificateGenerator;  
  18. /** 
  19.  *  
  20.  * Tomcat HTTPS client/server key Certificate generator 
  21.  *  
  22.  */  
  23. public class TomcatKey {  
  24.  //Client Certificate  
  25.  static String TRUST_STORE_NAME = "client";  
  26.  static char[] TRUST_STORE_PASSWORD = "test".toCharArray();  
  27.    
  28.  //Server Certificate   
  29.  static String SERVER_NAME = "server";  
  30.  static char[] SERVER_PASSWORD = "test".toCharArray();  
  31.  static String SERVER_HOST = "localhost";  
  32.  /** 
  33.   * @param args 
  34.   */  
  35.  public static void main(String[] args) {  
  36.   try {  
  37.    // trustsotre, my root certificate  
  38.    KeyStore store = KeyStore.getInstance("JKS");  
  39.    // initialize  
  40.    store.load(nullnull);  
  41.    KeyPair rootPair = generateKeyPair();  
  42.    X500PrivateCredential rootCredential = createRootCredential(rootPair);  
  43.    store.setCertificateEntry(TRUST_STORE_NAME, rootCredential  
  44.      .getCertificate());  
  45.    store.store(new FileOutputStream(TRUST_STORE_NAME + ".keystore"),  
  46.      TRUST_STORE_PASSWORD);  
  47.    // server credentials  
  48.    store = KeyStore.getInstance("JKS");  
  49.    store.load(nullnull);  
  50.    store.setKeyEntry(SERVER_NAME, rootCredential.getPrivateKey(),  
  51.      SERVER_PASSWORD, new Certificate[] { rootCredential  
  52.        .getCertificate() });  
  53.    store.store(new FileOutputStream(SERVER_NAME + ".keystore"),  
  54.      SERVER_PASSWORD);  
  55.   } catch (NoSuchAlgorithmException e) {  
  56.    e.printStackTrace();  
  57.   } catch (NoSuchProviderException e) {  
  58.    e.printStackTrace();  
  59.   } catch (Exception e) {  
  60.    e.printStackTrace();  
  61.   }  
  62.  }  
  63.  //generate Key Pair  
  64.  public static KeyPair generateKeyPair() throws NoSuchAlgorithmException,  
  65.    NoSuchProviderException {  
  66.   // create the keys  
  67.   java.security.KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");  
  68.   generator.initialize(1024new SecureRandom());  
  69.   return generator.generateKeyPair();  
  70.  }  
  71.  //generate certificate  
  72.  public static X500PrivateCredential createRootCredential(KeyPair rootPair) throws Exception {  
  73.   X509Certificate rootCert = generateX509V3RootCertificate(rootPair);  
  74.   return new X500PrivateCredential(rootCert, rootPair.getPrivate());  
  75.  }  
  76.    
  77.  public static X509Certificate generateX509V3RootCertificate(KeyPair pair)throws NoSuchAlgorithmException,   
  78.  NoSuchProviderException, CertificateEncodingException, InvalidKeyException,  
  79.  IllegalStateException, SignatureException {  
  80.     
  81.   X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();  
  82.     
  83.   certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));  
  84.     
  85.   certGen.setIssuerDN(new X500Principal("CN=" + SERVER_HOST+ ", OU=GoldenSF, O=SHA, C=cn"));  
  86.     
  87.   certGen.setNotBefore(new Date(System.currentTimeMillis() - 5000L));  
  88.     
  89.   certGen.setSubjectDN(new X500Principal("CN=" + SERVER_HOST+ ", OU=GoldenSF, O=SHA, C=cn"));  
  90.     
  91.   certGen.setPublicKey(pair.getPublic());  
  92.     
  93.   certGen.setSignatureAlgorithm("SHA1WithRSA");  
  94.     
  95.   certGen.setNotAfter(new Date(System.currentTimeMillis() + Integer.MAX_VALUE));  
  96.     
  97.   return certGen.generate(pair.getPrivate(), new SecureRandom());    
  98.  }  
  99. }  


  2、将产生的文件:client.keystore, and server.keystore放到apache-tomcat-7/conf下面

  3、修改/conf/server.xml如下:
Java代码  收藏代码
  1. <?xml version='1.0' encoding='utf-8'?>  
  2. <Server port="8005" shutdown="SHUTDOWN">    
  3.   <!--<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />  -->  
  4.   <Listener className="org.apache.catalina.core.JasperListener" />  
  5.   <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />  
  6.   <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />  
  7.   
  8.   <GlobalNamingResources>  
  9.     <Resource name="UserDatabase" auth="Container"  
  10.               type="org.apache.catalina.UserDatabase"  
  11.               description="User database that can be updated and saved"  
  12.               factory="org.apache.catalina.users.MemoryUserDatabaseFactory"  
  13.               pathname="conf/tomcat-users.xml" />  
  14.   </GlobalNamingResources>  
  15.   
  16.   <Service name="Catalina">  
  17.         <Connector port="443" SSLEnabled="true"   
  18.                maxThreads="150" scheme="https" secure="true"   
  19.                clientAuth="false" sslProtocol="TLS"                  
  20.                keystoreFile="conf/server.keystore" keystorePass="test"   
  21.               truststoreFile ="conf/client.keystore" truststorePass="test"/>   
  22.     <Connector port="8009" enableLookups="false" redirectPort="443" protocol="AJP/1.3" />      
  23.       
  24.     <Engine name="Catalina" defaultHost="localhost">      
  25.       <Realm className="org.apache.catalina.realm.LockOutRealm">      
  26.         <Realm className="org.apache.catalina.realm.UserDatabaseRealm"  
  27.                resourceName="UserDatabase"/>  
  28.       </Realm>  
  29.       <Host name="localhost"  appBase="webapps"  
  30.             unpackWARs="true" autoDeploy="true">  
  31.         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"    
  32.                prefix="localhost_access_log." suffix=".txt"  
  33.                pattern="%h %l %u %t &quot;%r&quot; %s %b" resolveHosts="false"/>  
  34.       </Host>  
  35.     </Engine>  
  36.   </Service>  
  37. </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为如下内容:

Java代码  收藏代码
  1. <?xml version='1.0' encoding='utf-8'?>  
  2. <Server port="8005" shutdown="SHUTDOWN">    
  3.   <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />  
  4.   <Listener className="org.apache.catalina.core.JasperListener" />  
  5.   <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />  
  6.   <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />  
  7.   
  8.   <GlobalNamingResources>  
  9.     <Resource name="UserDatabase" auth="Container"  
  10.               type="org.apache.catalina.UserDatabase"  
  11.               description="User database that can be updated and saved"  
  12.               factory="org.apache.catalina.users.MemoryUserDatabaseFactory"  
  13.               pathname="conf/tomcat-users.xml" />  
  14.   </GlobalNamingResources>  
  15.   
  16.     <Service name="Catalina">  
  17.         <Connector port="443" maxHttpHeaderSize="8192"  
  18.             maxThreads="150" minSpareThreads="25"   
  19.             enableLookups="false" disableUploadTimeout="true"  
  20.             acceptCount="100" scheme="https" secure="true"  
  21.             clientAuth="false"   
  22.             SSLEnabled="true"  
  23.             protocol="org.apache.coyote.http11.Http11AprProtocol"  
  24.             SSLCertificateFile="D:\apache-tomcat-7\conf\key1cert.pem"  
  25.             SSLCertificateKeyFile="D:\apache-tomcat-7\conf\key1.pem"  
  26.             SSLPassword="test"  
  27.         />     
  28.                    
  29.         <Connector port="8009" enableLookups="false" redirectPort="443" protocol="AJP/1.3" />      
  30.       
  31.     <Engine name="Catalina" defaultHost="localhost">      
  32.       <Realm className="org.apache.catalina.realm.LockOutRealm">      
  33.         <Realm className="org.apache.catalina.realm.UserDatabaseRealm"  
  34.                resourceName="UserDatabase"/>  
  35.       </Realm>  
  36.       <Host name="localhost"  appBase="webapps"  
  37.             unpackWARs="true" autoDeploy="true">  
  38.         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"    
  39.                prefix="localhost_access_log." suffix=".txt"  
  40.                pattern="%h %l %u %t &quot;%r&quot; %s %b" resolveHosts="false"/>  
  41.       </Host>  
  42.     </Engine>  
  43.   </Service>  
  44. </Server>  


  5、启动tomcat ,https://localhost如果能正常打开,说明配置成功。

  几点注意:
      1)、注意APR是否已经正常配置,
      2)、在启动tomcat前需要确认任务管理器中没有其它tomcat进程在执行(一般删除所有javaw.exe即可),免得造成冲突,提示:java.lang.Exception: Socket bind failed;
      3)、密码要一致,文件名不可写混。

以上是我在tomcat环境下配置HTTPS的一点心得,欢迎大家指正
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值