`
savezshi
  • 浏览: 8632 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

Tomcat配置https详述

    博客分类:
  • Java
阅读更多

这两天研究了下Tomcat如何配置https,实现以https的方式访问我们的web service,下面就如何配置Tomcat以及在访问过程中出现的问题做个简单的总结。

 

首先说明下,我使用的Tomcat的版本是Version 7.0.22。

我们先找到Tomcat的官方参考文档中如何配置SSL:http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html,里面介绍了如何配置SSL的步骤,总得来说,首先生成keystore文件,步骤如下:

1.在windows命令行下输入

写道
%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA

2. 接下来提示输入密码,可以使用Tomcat的默认值changeit,然后按照提示输入相关信息后确认,这里的别名tomcat可以自己定义,一般情况下,上面生成的.keystore文件会在你的${user.home}目录下。

 

然后,找到Tomcat下的server.xml文件,找到

<-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
<!--
<Connector
           port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           clientAuth="false" sslProtocol="TLS"/>
-->

 把打开注释,加上两个属性

keystoreFile="${user.home}/.keystore" keystorePass="changeit"

其中,keystoreFile是生成的服务证书的位置,keystorePass是密码,如果你没输入密码,默认的是changeit。代码如下:

写道
<!-- Define a SSL HTTP/1.1 Connector on port 8443 -->
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
SSLEnabled="true"
maxThreads="200" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="E:/apache-tomcat-7.0.22/.keystore"
keystorePass="123456"/>

 到这里,我们的Tomcat部分就以配置完成了,当我把我的服务部署到Tomcat下面时,出现了下面的错误:

写道
send file exception:sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

 我们要想成功访问我们的web service还需下面的步骤。

上面的错误告诉我们没有找到验证路径,所以还要生成一个验证证书,我们只需要用下面的代码来帮助我们生成:

public class InstallCert {

    public static void main(String[] args) throws Exception {
        String host;
        int port;
        char[] passphrase;
        if ((args.length == 1) || (args.length == 2)) {
            String[] c = args[0].split(":");
            host = c[0];
            port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
            String p = (args.length == 1) ? "changeit" : args[1];
            passphrase = p.toCharArray();
        } else {
            System.out.println("Usage: java InstallCert <host>[:port] [passphrase]");
            return;
        }

        File file = new File("jssecacerts");
        if (file.isFile() == false) {
            char SEP = File.separatorChar;
            File dir = new File(System.getProperty("java.home") + SEP + "lib" + SEP + "security");
            file = new File(dir, "jssecacerts");
            if (file.isFile() == false) {
                file = new File(dir, "cacerts");
            }
        }
        System.out.println("Loading KeyStore " + file + "...");
        InputStream in = new FileInputStream(file);
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(in, passphrase);
        in.close();

        SSLContext context = SSLContext.getInstance("TLS");
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory
                .getDefaultAlgorithm());
        tmf.init(ks);
        X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
        SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
        context.init(null, new TrustManager[] { tm }, null);
        SSLSocketFactory factory = context.getSocketFactory();

        System.out.println("Opening connection to " + host + ":" + port + "...");
        SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
        socket.setSoTimeout(10000);
        try {
            System.out.println("Starting SSL handshake...");
            socket.startHandshake();
            socket.close();
            System.out.println();
            System.out.println("No errors, certificate is already trusted");
        } catch (SSLException e) {
            System.out.println();
            e.printStackTrace(System.out);
        }

        X509Certificate[] chain = tm.chain;
        if (chain == null) {
            System.out.println("Could not obtain server certificate chain");
            return;
        }

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        System.out.println();
        System.out.println("Server sent " + chain.length + " certificate(s):");
        System.out.println();
        MessageDigest sha1 = MessageDigest.getInstance("SHA1");
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        for (int i = 0; i < chain.length; i++) {
            X509Certificate cert = chain[i];
            System.out.println(" " + (i + 1) + " Subject " + cert.getSubjectDN());
            System.out.println("   Issuer  " + cert.getIssuerDN());
            sha1.update(cert.getEncoded());
            System.out.println("   sha1    " + toHexString(sha1.digest()));
            md5.update(cert.getEncoded());
            System.out.println("   md5     " + toHexString(md5.digest()));
            System.out.println();
        }

        System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
        String line = reader.readLine().trim();
        int k;
        try {
            k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
        } catch (NumberFormatException e) {
            System.out.println("KeyStore not changed");
            return;
        }

        X509Certificate cert = chain[k];
        String alias = host + "-" + (k + 1);
        ks.setCertificateEntry(alias, cert);

        OutputStream out = new FileOutputStream("jssecacerts");
        ks.store(out, passphrase);
        out.close();

        System.out.println();
        System.out.println(cert);
        System.out.println();
        System.out.println("Added certificate to keystore 'jssecacerts' using alias '" + alias
                + "'");
    }

    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

    private static String toHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 3);
        for (int b : bytes) {
            b &= 0xff;
            sb.append(HEXDIGITS[b >> 4]);
            sb.append(HEXDIGITS[b & 15]);
            sb.append(' ');
        }
        return sb.toString();
    }

    private static class SavingTrustManager implements X509TrustManager {

        private final X509TrustManager tm;

        private X509Certificate[] chain;

        SavingTrustManager(X509TrustManager tm) {
            this.tm = tm;
        }

        public X509Certificate[] getAcceptedIssuers() {
            throw new UnsupportedOperationException();
        }

        public void checkClientTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            throw new UnsupportedOperationException();
        }

        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            this.chain = chain;
            tm.checkServerTrusted(chain, authType);
        }
    }

}

 然后,运行这个程序,运行程序时,需要输入参数,在Run Configure的Argument输入localhost:8443,Run,显示以下信息:

写道
Loading KeyStore C:\Program Files\Java\jdk1.6.0_10\jre\lib\security\cacerts...
Opening connection to localhost:8443...
Starting SSL handshake...

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1591)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1035)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:124)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1107)
at com.neusoft.mega.client.InstallCert.main(InstallCert.java:85)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)
at sun.security.validator.Validator.validate(Validator.java:218)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
at com.neusoft.mega.client.InstallCert$SavingTrustManager.checkServerTrusted(InstallCert.java:178)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1027)
... 8 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)
... 14 more

Server sent 1 certificate(s):

1 Subject CN=localhost, OU=It, O=It, L=CH, ST=CH, C=86
Issuer CN=localhost, OU=It, O=It, L=CH, ST=CH, C=86
sha1 e4 88 87 2f 9f 22 08 14 3a b7 85 62 99 0a 11 92 2c 8b 08 5c
md5 5f d5 f1 6c d4 28 fc 8e 56 88 45 fa 27 67 18 eb

Enter certificate to add to trusted keystore or 'q' to quit: [1]

 在console下输入1,会输出一堆信息,最后出现一句:Added certificate to keystore 'jssecacerts' using alias 'localhost-1',说明我们的验证文件就生成了,这个文件会在我们的

%JAVA_HOME%/jre6/lib/security

下,文件名为jssecacerts。

到此为止,我们就可以正常通过https访问我们的web service了。

注意:

我开始第一次访问时,出现了:java.security.cert.CertificateException: No name matching localhost found错误,这个错误是说我们指定资源证书的CN与资源访问地址不匹配,在我们生成ketstore文件时,我们在输入您的名字和姓氏的名称与我们自愿的地址不一致。

写道
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\user>keytool -genkey -alias tomcat -keyalg RSA
输入keystore密码:

您的名字与姓氏是什么?
[Unknown]:
localhost
 

比如说,而偶们的访问地址是https://localhost:8443/tomcat,那么我们资源证书的CN也为localhost。

 

 

 

1
1
分享到:
评论

相关推荐

    简单三步教会您 Tomcat 安装SSL证书,Tomcat安装https证书,一看就会,一做就成!

    本文将详述如何在Tomcat服务器上安装SSL证书,确保您的应用能够提供安全的HTTPS服务。 首先,我们需要理解SSL(Secure Socket Layer)和HTTPS(HyperText Transfer Protocol Secure)的基本概念。SSL是一种网络通信...

    tomcat-5.5.28和tomcat-6.0.30及配置资料

    【文件名称列表】中,"Tomcat环境变量配置.txt"是一个重要的文档,它通常会详述如何设置操作系统环境变量,如JAVA_HOME和CATALINA_HOME,这些是运行Tomcat所必需的。这些环境变量的正确设置对于确保Tomcat能正常启动...

    Tomcat9使用免费的Https证书加密网站的方法

    【描述】: "本文详述了如何在Apache Tomcat 9中使用免费的Https证书来加密网站,确保数据传输的安全性,适用于需要保护敏感信息的站点。" 【标签】: "Tomcat9, 网站加密证书, Tomcat9 Https加密网站" 【正文】: ...

    深入解析tomcat.pdf

    3. **配置与管理**:详述如何配置Tomcat,包括server.xml、context.xml等配置文件的解析,以及如何通过管理工具如Manager App和Host Manager进行应用部署、监控和管理。 4. **安全性**:讲解如何保护Tomcat服务器免...

    孙卫琴Tomcat与JavaWeb开发技术详解

    7. **安全与权限管理**:讲解如何设置用户访问控制,使用Realm进行身份验证,以及配置HTTPS协议以增强应用安全性。 8. **日志与错误处理**:分析Tomcat的日志系统,了解如何读取和分析日志信息,以便于调试和问题...

    从安装和配置 Apache Tomcat 到部署和运行 Java Web 应用程序详细教学.rar

    本教程将详述从安装到配置Tomcat,以及部署和运行Java Web应用的全过程。 一、安装Apache Tomcat 1. 下载:首先,访问Apache Tomcat官方网站(https://tomcat.apache.org/)下载最新稳定版本的Tomcat。根据你的...

    TomcatSSL证书部署指南

    对于Tomcat 8.5及之后版本,SSL证书的配置方式有所变更,更推荐用户使用Tomcat的配置文件(server.xml)中的元素来配置HTTPS连接。这部分通常涉及到对Connector元素进行修改,以支持新的加密算法和协议。 在SSL证书...

    https改造的所有配置文件

    1. **Connector元素**:在`&lt;Server&gt;`或`&lt;Service&gt;`下添加一个`&lt;Connector&gt;`元素来配置HTTPS连接器: ``` SSLEnabled="true" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups=...

    tomcat的安装包

    本指南将详述如何下载、安装以及配置Apache Tomcat 8.5.16版本,帮助您在您的开发或生产环境中搭建这一重要的Java Web服务。 **一、Tomcat的下载** 首先,我们需要从Apache官方网站获取Tomcat的最新稳定版。在本文...

    Tomcat技术手册

    2. **安装与配置**:详述在不同操作系统(Windows、Linux、Mac OS)上的安装步骤,以及服务器的配置,包括端口设置、环境变量配置和服务器.xml文件解析。 3. **启动与停止**:阐述如何启动和停止Tomcat服务,以及...

    Tomcate服务器培训文档

    【三、Tomcat配置、部署、管理】 Tomcat的配置主要涉及server.xml、context.xml、web.xml等核心配置文件。在server.xml中,可以配置端口号、连接器、全局JNDI资源等。部署应用程序时,通常将WAR文件放入webapps目录...

    Linux虚拟机配置一条龙

    本文将详述如何通过Linux虚拟机配置实现高效的工作环境,包括安装与配置虚拟机软件,部署Java开发环境,以及搭建Web服务器。 首先,我们需要一个虚拟机软件来运行Linux操作系统。在提供的文件列表中,`VMware-...

    Windows7+_SVN+_Apache2+TortoiseSVN配置安装

    本教程将详述如何在Windows 7操作系统上配置安装SVN、Apache服务器以及TortoiseSVN客户端,以搭建一个高效且稳定的版本控制环境。 首先,我们需要了解SVN。SVN是一个开源的版本控制系统,用于跟踪文件和目录的变化...

    idea工具下载到配置svn项目(maven)到启动项目的过程

    本文将详述从下载IDEA、配置Subversion(SVN)版本控制系统、整合Maven构建工具,直到成功启动项目的全过程。 首先,让我们从下载IntelliJ IDEA开始。访问JetBrains的官方网站(https://www.jetbrains.com/idea/)...

    构架师的道路

    2.3 **Web Server与App Server的整合**:虽然文档未详述具体整合步骤,但通常会涉及到配置Web Server(如Apache)以代理或反向代理到Tomcat,实现静态内容与动态内容的分离处理。 在成为架构师的道路上,理解并实践...

    通向架构师的道路(第三天)之apache性能调优

    在课程的最后,我们会讨论Tomcat集群的配置,为后续的Weblogic和IBM WASND集群配置奠定基础。 **性能测试的重要性** 性能测试,也称为压力测试,用于评估系统在特定并发用户量下的极限性能,查找可能存在的Out of ...

    JavaWeb培训讲义

    - `&lt;CATALINA_HOME&gt;/conf/server.xml`: 主配置文件,用于配置Tomcat服务器的整体架构。 - `&lt;Server&gt;`: 表示整个服务器实例。 - `&lt;Service&gt;`: 表示一个服务,可以包含多个连接器和引擎。 - `&lt;Connector&gt;`: 定义...

    深入剖析NGINGX

    5. **SSL/TLS安全**:指导如何配置NGINX以支持HTTPS,保护数据传输的安全性。 6. **URL重写**:讲解如何使用NGINX进行URL重写,以实现友好的URL或隐藏实际路径。 7. **日志管理**:介绍NGINX的日志格式和日志切割...

    Apache安装及jboss部署说明文档

    在信息技术领域,服务器的搭建与应用部署是至关重要的环节,本文档将详述如何在操作系统上安装Apache HTTP Server并配置部署Java应用程序服务器JBoss。Apache作为世界上最流行的Web服务器软件,而JBoss作为开源的...

    Axis高级编程

    **知识点详述:** 1. **Web服务简介** - Web服务是一种自适应、自我描述的模块化应用,可跨Web发布、定位及调用。 - 基本特征包括自描述性、模块化和自包含性。 - 例子包括天气预报服务、航班信息服务等。 2. *...

Global site tag (gtag.js) - Google Analytics