• about tomcat ssl


    http://www.kuqin.com/shuoit/20140615/340573.html

    1SSL单向认证概念

      当客户端(服务请求方)向服务端(服务提供方)发起请求时,服务器端需要向客户端提供认证。服务端需要生成一个keystore和一个服务器密钥对儿(公钥和私钥),客户端需要生成一个truststore,然后导入服务端的公钥证书。

    2keystore以及服务器密钥对儿的生成

    keytool-genkeypair-aliascertificatekey-keyalgRSA-validity365-keystoreshfqkeystore.jks

    这条命令会在生成keystore后接着生成一个密钥对儿。RSA是非对称密钥算法,也可以改为keytool支持的其他密钥算法,365代表的是证书的有效期,可以自己指定,shfqkeystore.jks是keystroe的名称,也可以自己指定。打开cmd命令行,输入:

    keytool-genkeypair-aliascertificatekey-keyalgRSA-validity365-keystoreshfqkeystore.jks

    会提示输入keystore的密码,接着会提示输入名字等信息,如下图:

    补充:输入<certificatekey>的主密码,是指生成服务端证书的私钥。服务端私钥如果和keystore的相同的话,直接按回车。建议直接按回车,即服务端私钥和keystore的密码相同。如果两者的密码不相同的话在服务端tomcatserver.xml中配置完毕以后启动tomcat会报一个UnrecoverableKeyException:Cannotrecoverkey的异常(后面会介绍服务端tomcatserver.xml的配置的)。

    keytool会把生成的keystore文件默认保存到C:Userslenovo路径下(用户目录下的计算机名称下)接下来生成的所有文件也都保存到此处。

    3验证新生成的keystor文件以及证书信息

    可以执行下面的命令:

    keytool-list-v-keystoreshfqkeystore.jks

    会显示出以下信息,如图:

    4导出公钥证书

    下面的命令可以导出自签公钥证书:

    keytool-export-aliascertificatekey-keystoreshfqkeystore.jks-rfc-fileshfqcert.cer

    其中shfqcert.cer是导出证书的名称,可以随便起个名字,shfqkeystore.jks是2中生成的keystore文件。

    执行上面的命令会要求输入shfqkeystore的密码,会显示以下信息,如下图。

    5Truststore的生成以及公钥证书的导入

    把4生成的公钥证书shfqcert.cer导入到truststore中

    Keytool-import-aliascertificatekey-fileshfqcert.cer-keystore

    shfqtruststore.jks

    shfqcert.cer是4导出的公钥证书,shfqtruststore.jks可以随便起,是生成的truststore的文件名。这条命令首先会生成一个truststore,然后导入4生成的公钥证书shfqcert.cer。

    执行keytool-import-aliascertificatekey-fileshfqcert.cer-keystoreshfqtruststore.jks后,首先会提示输入truststore的密码,如下图:

    6验证5生成的truststore文件

    keytool-list-v-keystoreshfqtruststore.jks

    shfqtruststore.jks是5生成的truststore文件名。

    到此为止,keystore、truststore、公钥证书都已生成完毕。

    7配置服务端的tomcat

    找到tomcat安装路径下的conf路径下的server.xml文件

    打开server.xml,找到

    <!--

    <Connectorport="8443"protocol="HTTP/1.1" SSLEnabled="true"

    maxThreads="150"scheme="https"secure="true"

    clientAuth="false"sslProtocol="TLS"/>

    -->

    这样一段注释,在这段注释下面添加如下一段代码:

    <ConnectorSSLEnabled="true"acceptCount="100"clientAuth="false"

    disableUploadTimeout="true"

    enableLookups="false"maxThreads="25"

    port="8443"keystoreFile="D:developToolsapache-tomcat-idmtomcat.keystore" keystorePass="111111"

    protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"

    secure="true"sslProtocol="TLS"/>

    其中clientAuth=”false”表示是SSL单向认证,即服务端认证,port=”8443”是https的访问端口,keystoreFile="D:developToolsapache-tomcat-idmtomcat.keystore"是第一步中生成的keystore的保存路径,keystorePass="111111"是第一步生成的keystore的密码。

    到此服务器端已经配置完毕,为了验证是否已经配置正确,我们可以在浏览器中进行验证。首先启动tomcat,然后在浏览器地址输入栏中输入:https://localhost:8443

    如果看到如下截图的一个页面则表示服务端已经配置成功了。

    之所以会出现“该网站的安全证书不受信任!”的警告是因为证书是自己签发的而不是一个权威的CA机构签发的。
    最后还得在hosts文件中配置自己的IP地址,把IP地址映射为一个common name,这个common name就是您在第2步中生成服务器证书时候的“您的名字与姓氏是什么?”输入的名字。

    8客户端配置

    在客户端配置服务端的地址时要注意:比如https://shifengqiang:8443/syn/Users

    这个地址协议格式是https主机名是shifengqiang,这个shifengqiang就是在第2步中生成服务器端证书时要求输入的“您的名字与姓氏是什么?”名字。8443是https协议默认的端口。

    在客户端向服务器端同步代码前面加入这样一段代码:

    System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");

    System.setProperty("java.protocol.handler.pkgs", "com.ibm.net.ssl.internal.www.protocol");

    StringtrustStorePath=

    “D:developToolsapache-tomcat-idmshfqtruststore.jks”;

    StringtrustStorePassword=“client”;

    System.setProperty("javax.net.ssl.trustStore", trustStorePath);

    System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);

    其中trustStorePath是truststore的路径,trustStorePassword是truststore的密码。至此单向SSL配置完毕。

    参考链接:http://zjumty.iteye.com/blog/1885356

    在配置的过程中参考了网上大量的链接,有些链接没有做记录恕不一一列举。

    https协议如何通过X509TrustManager接口实现自己创建的证书-Java/JavaSE

    但是会报错误,请高手解决 谢谢
    错误信息如下:
    java.io.IOException: HTTPS hostname wrong: should be <调用的服务器的IP地址>
    at sun.net.www.protocol.https.HttpsClient.checkURLSpoofing(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)

    ------回答---------
    ------其他回答(15分)---------


    该不是因为证书里卖弄用的是hostname,你用的是ip吧?
    听说这个对SSL来说有区别.

    ------其他回答(5分)---------


    mark

  • 相关阅读:
    【并查集】连接格点C++
    【拓扑排序】威虎山上的分配C++
    CF39D Cubical PlanetC++
    【拓扑排序】排队C++
    [USACO09OCT]Invasion of the Milkweed】乳草的侵占C++
    免杀常用手段
    DELPHI 线程类
    动态注册OCX
    DELPHI 常用文件路径
    套接字(TCP)
  • 原文地址:https://www.cnblogs.com/feika/p/4560402.html
Copyright © 2020-2023  润新知