`

ssl/https配置与实现

阅读更多
SSL协议使用不对称加密技术实现会话双方之间信息的安全传递。可以实现信息传递的保密性、完整性,并且会话双方能鉴别对方身份。不同于常用的http协议,我们在与网站建立SSL安全连接时使用https协议,即采用的方式来访问。
当我们与一个网站建立https连接时,我们的浏览器与Web Server之间要经过一个握手的过程来完成身份鉴定与密钥交换,从而建立安全连接。具体过程如下:
1. 用户浏览器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送到服务器。
2. 服务器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送给浏览器,同时发给浏览器的还有服务器的证书。如果配置服务器的SSL需要验证用户身份,还要发出请求要求浏览器提供用户证书。
3. 客户端检查服务器证书,如果检查失败,提示不能建立SSL连接。如果成功,那么继续。
4. 客户端浏览器为本次会话生成pre-master secret,并将其用服务器公钥加密后发送给服务器。
5. 如果服务器要求鉴别客户身份,客户端还要再对另外一些数据签名后并将其与客户端证书一起发送给服务器。
6. 如果服务器要求鉴别客户身份,则检查签署客户证书的CA是否可信。如果不在信任列表中,结束本次会话。如果检查通过,服务器用自己的私钥解密收到的pre-master secret,并用它通过某些算法生成本次会话的master secret。
7. 客户端与服务器均使用此master secret生成本次会话的会话密钥(对称密钥)。在双方SSL握手结束后传递任何消息均使用此会话密钥。这样做的主要原因是对称加密比非对称加密的运算量低一个数量级以上,能够显著提高双方会话时的运算速度。
8. 客户端通知服务器此后发送的消息都使用这个会话密钥进行加密。并通知服务器客户端已经完成本次SSL握手。
9. 服务器通知客户端此后发送的消息都使用这个会话密钥进行加密。并通知客户端服务器已经完成本次SSL握手。
10. 本次握手过程结束,会话已经建立。双方使用同一个会话密钥分别对发送以及接受的信息进行加、解密。

tomcat实现SSL配置
第一步 生成KeyStore

keytool -genkey -alias tomcat -keyalg RSA –keysize 1024 –validity 730 -keystore D:\server.keystore

输入keystore密码: ************ [Unknown]: localhost [Unknown]: dept [Unknown]: Inc [Unknown]: bj [Unknown]: bj [Unknown]: CN
CN=localhost, OU= dept, O= Inc, L=bj, ST=bj, C=CN 正确吗?
[否]: Y
Ychangeit (回车)

注意: localhost,是网站的域名或者ip,根据实际情况填写,比如 192.168.0.85 否则会出现证书上的名称无效,或者与站点名称不匹配。

建议:将生成的 server.keystore文件,放到%TOMCAT_HOME%或其子目录中(如:%TOMCAT_HOME%/conf)

(其实放哪里都一样,只是放到%TOMCAT_HOME%里面会方便一些)

第二步 修改server.xml

修改%TOMCAT_HOME%/conf/server.xml

去掉下面SSL HTTP那个注释,修改为如下:

<Connector port="8443" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"
     SSLEnabled="true"
     maxThreads="150" 
     scheme="https" 
     secure="true" 
     clientAuth="false" 
     sslProtocol="TLS"   
     keystoreFile="/conf/server.keystore" 
     keystorePass="changeit"
/> 
keystoreFile 是server.keystore放置的位置,keystorePass是密码 (默认密码是changeit)

第三步

重启Tomcat,访问地址

(附录:)tomcat的配置文件SSL部分详细说明
配置文件server.xml,SSL部分: <!-- A "Connector" represents an endpoint by which requests are received
        Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)  
        Java AJP   Connector: /docs/config/ajp.html
        APR (HTTP/AJP) Connector: /docs/apr.html  
        Define a non-SSL HTTP/1.1 Connector on port 8080 

<Connector  port="8443" maxHttpHeaderSize="8192" 
        maxThreads="150" 
        minSpareThreads="25" 
        maxSpareThreads="75"
        enableLookups="false" 
        disableUploadTimeout="true"
        acceptCount="100" 
        scheme="https" 
        secure="true" 
        clientAuth="false" 
        sslProtocol="TLS" 
        keystoreFile="D:/Tomcat/conf/tomcatKey.keystore" 
        keystorePass="changeit" 
        algorithm="SunX509" 
/> 
属性说明: port:这个port属性(默认值是8443)是 TCP/IP端口数码,Tomcat在其上监听安全连接。你可以把它更改成任何你愿意要的数值(如默认的https通信,数目是443)。不过,在许多操作系统中,要想在比1024小的端口数码上运行Tomcat,需要特殊的设置(它超出了这个文档资料的范围)。 redirectPort: 如果你在这里更改端口数值,你还必须更改在non-SSL连接器上的redirectPort 这个属性特定的值。这允许Tomcat自动地redirect那些试图访问有安全限制页面的用户,指明根据 Servlet 2.4 Specification要求,SSL是必需的 clientAuth: 如果你想要Tomcat要求所有的SSL客户在使用这个socket时出示用户认证书,把这个值设定为 true 。如果你想要Tomcat要求出示用户认证书,但是如果没有认证书也可以, 就把这个值设定为want 。 keystoreFile: 如果你产生的keystore文件不在Tomcat期望的默认地方(一个叫做.keystore 的文件在Tomcat运行的主目录),就添加这个属性。你可以指定一个绝对路径名称, 或者一个由$CATALINA_BASE环境变量而派生的相对路径名称。 keystorePass: 如果你使用一个不同的keystore(以及认证书)密码,而不是Tomcat期望的密码 (就是changeit),添加这个元素。 keystoreType: 如果使用一个PKCS12 keystore的话,就添加这个element。 有效的值是JKS 和 PKCS12 sslProtocol: 要在这个socket上被使用的加密/解密协定。如果你在使用Sun的JVM,我们不提倡更改 这个值。据报道,TLS协定的IBM's 1.4.1 实现与一些通用的浏览器不兼容。 如果是这样,就使用value SSL ciphers: 这个socket允许使用的由逗号分隔开的加密密码列单。默认的情况下,任何可用的密码都允许被使用。 algorithm: 可用的X509算法。默认是Sun的实现( SunX509 )。 对于IBM JVMs,你应该使用值 IbmX509。对于其他卖主,查阅JVM文档资料来 找正确的值。 truststoreFile: 用来验证用户认证书的TrustStore文件。 truststorePass: 访问TrustStore的密码。默认值就是keystorePass的值。 truststoreType: 如果你在使用与KeyStore不同格式的TrustStore,添加这个元素。 合法的值是JKS和PKCS12 keyAlias: 如果 keystore 里面有多个 key,你可以为用这个选项为加入的 key 起一个名字。 如果没有指定名字,使用时 keystore 内的第一个 key 将会被使用。

此前我一直对https/ssl如何保护数据不被窃 听有点疑问,因为服务器的证书是公开的,只能实行上行方向的数据加密,下行数据的加密我一直认为是浏览器会自动生成一个客户端的密钥对并将公钥发给服务器。仔细研究了https/ssl后发现其实并不像我想的那样,这里面既有非对称加密,又因为性能原因使用了对称加密。

基本的加解密算法类型也就这两种:

对称加密 :密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES等;

非对称加密 :密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。

明白了这两种加密类型,具体的认证过程就容易理解了:

客户端浏览器连接到https/ssl服务器,并发送ssl版本号等信息到服务器,协商此次连接使用的版本和参数。

服务器根据客户端发来的协商数据和自身支持的特性返回客户端协商参数,并且将服务器的证书发送给客户端,服务器的证书里包括用于非对称加密的服务器的公钥。

客户端收到服务器的证书,可以用于鉴别服务器身份,防止假冒的服务器。但最重要的用处是将一段由客户端浏览器随机生成的数据pre-master secret用服务器证书里的公钥进行加密,发给服务器。注意,因为这段加密的数据只由用服务器的私钥才能解密,所以pre-master secret不会被人监听到。

服务器收到加密后的pre-master secret数据后,用自己的私钥解密得到原始的pre-master secret,并使用一定算法得到对称加密的密钥master secret。

客户端也根据同样的算法得到master secret。

至此,客户端和服务器之间的上/下行数据传送使用对称加/解密,初始密钥为master secret。常用的对称加密算法有RC4,AES等。

经过这些步骤就可以保证https/ssl上下行数据不被监听并且加/解密速度也可以接受。

1. 生成证书

  这里用到的文件,我们存放在D:/SSL/文件夹内,其中D:/SSL/server/内的文件是要交给服务器用的,D:/SSL/client/内的文件是要交给客户端用的。

  1.1生成服务端证书

开始-运行-CMD-在dos窗口执行下执行命令:

keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:/SSL/server/tomcat.keystore -dname "CN=127.0.0.1,OU=zlj,O=zlj,L=Peking,ST=Peking,C=CN" -validity 3650 -storepass zljzlj -keypass zljzlj

说明:

keytool 是JDK提供的证书生成工具,所有参数的用法参见keytool –help

-genkey 创建新证书

-v 详细信息

-alias tomcat 以”tomcat”作为该证书的别名。这里可以根据需要修改

-keyalg RSA 指定算法

-keystore D:/SSL/server/tomcat.keystore 保存路径及文件名

-dname "CN=127.0.0.1,OU=zlj,O=zlj,L=Peking,ST=Peking,C=CN" 证书发行者身份,这里的CN要与发布后的访问域名一致。但由于我们是自己发行的证书,如果在浏览器访问,仍然会有警告提示。

-validity 3650证书有效期,单位为天

-storepass zljzlj 证书的存取密码

-keypass zljzlj 证书的私钥

    1.2 生成客户端证书

    执行命令:
keytool ‐genkey ‐v ‐alias client ‐keyalg RSA ‐storetype PKCS12 ‐keystore D:/SSL/client/client.p12 ‐dname "CN=client,OU=zlj,O=zlj,L=bj,ST=bj,C=CN" ‐validity 3650 ‐storepass client ‐keypass client

说明:
    参数说明同上。这里的-dname 证书发行者身份可以和前面不同,到目前为止,这2个证书可以没有任何关系。下面要做的工作才是建立2者之间的信任关系。

    1.3 导出客户端证书
    执行命令:
keytool ‐export ‐alias client ‐keystore D:/SSL/client/client.p12 ‐storetype PKCS12 ‐storepass client ‐rfc ‐file D:/SSL/client/client.cer

说明:

-export 执行导出

-file 导出文件的文件路径

    1.4 把客户端证书加入服务端证书信任列表

    执行命令:
keytool ‐import ‐alias client ‐v ‐file D:/SSL/client/client.cer ‐keystore D:/SSL/server/tomcat.keystore ‐storepass zljzl

说明:

参数说明同前。这里提供的密码是服务端证书的存取密码。

    1.5 导出服务端证书

    执行命令:
keytool -export -alias tomcat -keystore D:/SSL/server/tomcat.keystore -storepass zljzlj -rfc -file D:/SSL/server/tomcat.cer
 
说明:
把服务端证书导出。这里提供的密码也是服务端证书的密码。

    1.6 生成客户端信任列表

    执行命令:
keytool -import -file D:/SSL/server/tomcat.cer -storepass zljzlj -keystore D:/SSL/client/client.truststore -alias tomcat –noprompt

说明:
让客户端信任服务端证书

2. 配置服务端为只允许HTTPS连接

    2.1 配置Tomcat 目录下的/conf/server.xml

Xml代码 
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"    
   maxThreads="150" scheme="https" secure="true" clientAuth="true"    
   sslProtocol="TLS" keystoreFile="D:/SSL/server/tomcat.keystore"    
   keystorePass="zljzlj" truststoreFile="D:/SSL/server/tomcat.keystore"    
   truststorePass="zljzlj" />  

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
   maxThreads="150" scheme="https" secure="true" clientAuth="true" 
   sslProtocol="TLS" keystoreFile="D:/SSL/server/tomcat.keystore" 
   keystorePass="zljzlj" truststoreFile="D:/SSL/server/tomcat.keystore" 
   truststorePass="zljzlj" /> 
说明:
在server.xml里面这段内容本来是被注释掉的,如果想使用https的默认端口443,请修改这里的port参数。其中的clientAuth="true" 指定了双向证书认证。

    2.2 配置服务端项目web.xml
    在<welcome-file-list>之后增加:
Xml代码 
<security-constraint>    
   <web-resource-collection>    
     <web-resource-name>services</web-resource-name>    
     <url-pattern>/services/*</url-pattern>    
   </web-resource-collection>    
   <user-data-constraint>    
     <transport-guarantee>CONFIDENTIAL</transport-guarantee>    
   </user-data-constraint>    
</security-constraint>   

<security-constraint> 
   <web-resource-collection> 
     <web-resource-name>services</web-resource-name> 
     <url-pattern>/services/*</url-pattern> 
   </web-resource-collection> 
   <user-data-constraint> 
     <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
   </user-data-constraint> 
</security-constraint>  
说明:
这里限制了WEB service服务地址的访问必须为https连接。<url-pattern>要根据你的web service服务地址配置。

3. 修改客户端代码
在执行访问之前,增加:
Java代码 
System.setProperty("javax.net.ssl.trustStore", "D:/SSL/client/client.truststore");    
System.setProperty("javax.net.ssl.trustStorePassword","zljzlj");    
System.setProperty("javax.net.ssl.keyStoreType","PKCS12") ;    
System.setProperty("javax.net.ssl.keyStore","D:/SSL/client/client.p12") ;    
System.setProperty("javax.net.ssl.keyStorePassword","client") ;    
    
String endPoint="https://127.0.0.1:8443/easbCut/services/ApplyFormService";    
...   

System.setProperty("javax.net.ssl.trustStore", "D:/SSL/client/client.truststore"); 
System.setProperty("javax.net.ssl.trustStorePassword","zljzlj"); 
System.setProperty("javax.net.ssl.keyStoreType","PKCS12") ; 
System.setProperty("javax.net.ssl.keyStore","D:/SSL/client/client.p12") ; 
System.setProperty("javax.net.ssl.keyStorePassword","client") ; 
 
String endPoint="https://127.0.0.1:8443/easbCut/services/ApplyFormService"; 
...   通过设置参数来指定客户端连接时所使用的客户端证书,这里还可以采用修改JVM启动参数的的方式来执行,但出于不影响其他功能的考虑,这里采用System.setProperty的方式来设置这些参数,在使用结束后,可以还原这些参数配置。

做为客户端的开发者,可以把拿到的证书文件后,只执行步骤3。
分享到:
评论

相关推荐

    netty实现SSL/TSL双向加密认证示例

    在提供的示例项目 `SSLTest` 中,我们可以看到具体的实现细节,包括如何加载证书、配置 `SslContext` 以及设置 `ChannelPipeline`。通过对这些代码的分析和学习,可以更好地理解 Netty 中的 SSL/TLS 双向认证工作...

    Netty和SSL/TLS应用例子

    通过阅读和分析这些代码,你可以深入理解Netty如何与SSL/TLS结合,以及如何在实际项目中实现安全的网络通信。代码中可能包括了如`SSLEngine`的创建和配置,证书的加载,以及异常处理等关键部分。通过学习这个示例,...

    JAVA实现的SSL/TLS双向认证源代码

    4. **客户端实现**:对应的`TeslaSSLClient`类则需要配置SSLSocket,同样使用自定义的`SSLContext`。客户端在建立连接时会提供自己的证书。 5. **测试**:在完成上述步骤后,你可以使用wss(WebSocket Secure)协议...

    基于 MINA 的 TLS/SSL NIO Socket 实现(二)

    在本篇博文中,我们将深入探讨如何利用Apache MINA库实现基于TLS/SSL的NIO(非阻塞I/O)Socket通信。MINA是一个高度可扩展的网络应用框架,广泛用于构建高性能、高并发的网络应用程序,如服务器端的TCP和UDP服务。...

    SSL及HTTPS配置文档

    SSL是一种协议,用于在互联网上建立安全的连接,而HTTPS则是HTTP协议与SSL/TLS(Transport Layer Security,SSL的后续版本)结合使用的结果,用于加密网页通信,保护用户的隐私和数据安全。 首先,我们要理解SSL...

    Implementing SSL / TLS Using Cryptography and PKI 1st Edition (无水印,数字版)

    根据提供的文件信息,可以看出这是一本关于实现SSL/TLS协议的书籍,使用密码学和公钥基础设施(PKI)作为实现手段。下面将详细介绍与这个主题相关的关键知识点。 SSL(安全套接字层)和TLS(传输层安全性)是两种...

    ssl/tls安全协议

    通过阅读"openssl.pdf"、"SSL.ppt"、"TLS(SSL)协议.ppt"和"OpenSSL编写SSL,TLS程序.txt"等文档,可以深入理解SSL/TLS协议的工作原理,掌握OpenSSL的使用方法,并了解如何在自己的应用程序中实现安全的通信机制。...

    Tomcat中实现https安全连接与SSL配置

    https ssl Tomcat中实现https安全连接与SSL配置https ssl Tomcat中实现https安全连接与SSL配置https ssl Tomcat中实现https安全连接与SSL配置https ssl Tomcat中实现https安全连接与SSL配置

    ssl_android.zip_TLS_android_android ssl_application_ssl/tls

    SSL/TLS(Secure Sockets Layer/...总之,Android应用程序通过SSL/TLS协议实现安全通信,涉及证书管理、HTTPS连接、异常处理等多个环节。开发者应遵循最佳实践,不断更新和优化安全策略,以确保用户数据的安全。

    关于SSL/TLS的认识

    因此,合理配置SSL/TLS参数,如优化缓存策略、减少握手开销,以及使用更快的加密算法,都是提高SSL/TLS性能的重要措施。 **HTTP/HTTPS** HTTP是无状态、明文传输的协议,而HTTPS是HTTP加上SSL/TLS层,实现了加密和...

    c++ smpt发送邮件类 ssl/tls

    描述 "c++ smpt发送邮件类 ssl/tls 转自codeproject" 提到这个实现可能来源于CodeProject,这是一个著名的程序员社区,其中包含了各种代码示例和项目。这意味着你可能找到了一个C++类库,该库专为通过SMTP发送邮件并...

    nginx配置ssl实现https访问的步骤(适合新手)

    本文主要介绍了如何使用Nginx配置SSL以实现HTTPS访问,这对于初学者来说是一份非常实用的指南。首先,我们需要理解HTTPS的重要性,它通过SSL协议在HTTP基础上增加了数据加密和服务器身份验证,确保了数据传输的安全...

    ssl_tls协议RFC5246文档_ssl_ssl标准文档_

    SSL/TLS(安全套接层/传输层安全)协议是互联网上广泛使用的安全通信协议,用于在客户端(如浏览器)和服务器之间建立安全、私密的连接,保护数据免受窃听和篡改。RFC5246文档是SSL/TLS协议的最新版本,正式名为...

    nginx实现ssl之https改造(包含单机版以及负载均衡配置)

    通过以上步骤,你不仅能够实现单机版的HTTPS改造,还能配置负载均衡,提升系统的可用性和可靠性。务必确保在每个步骤中都仔细检查,避免因配置错误导致的服务中断。同时,持续学习和掌握Linux、openssl、jdk等相关...

    ESP8266 MQTT SSL/TLS 阿里物联网套件 百度天工 Onenet等MQTT服务器(注意:是固件)

    这个文件名可能是固件的打包文件,可能包含ESP8266的固件源码、编译脚本、配置文件等,用于开发者编译和烧录到ESP8266芯片上,实现与各种MQTT服务器的SSL/TLS连接功能。 综上所述,ESP8266 MQTT SSL/TLS固件使得...

    Implementing SSL TLS Using Cryptography and PKI.pdf

    - **测试与监控**: 对SSL/TLS连接进行彻底测试,并定期监控其性能和安全性,确保没有漏洞或配置错误。 综上所述,SSL/TLS通过结合先进的加密技术和可靠的PKI基础设施,为网络通信提供了一层强大的安全保障。了解...

    STM32 实现SSL通讯

    ### STM32 实现SSL通讯 #### 一、引言 随着网络安全日益受到重视,确保数据传输的安全性成为了一个不容忽视的问题。对于嵌入式系统而言,如何在资源受限的条件下实现安全通信变得尤为重要。本篇文章将基于STM32F...

    C# HTTP/Https 请求demo

    总的来说,“C# HTTP/Https 请求demo”项目旨在演示如何在C#应用程序中安全地与HTTP和HTTPS服务进行通信,通过GET和POST请求获取或提交数据。理解并掌握这些知识点对于开发任何涉及Web服务交互的C#应用都是非常重要...

    https Ssl 配置设置

    ### HTTPS SSL配置详解 在现代互联网环境中,HTTPS(Hypertext Transfer Protocol Secure)已经成为网站通信安全的标准协议。它通过在HTTP的基础上加入SSL/TLS层来实现数据加密传输,确保了客户端与服务器之间的...

Global site tag (gtag.js) - Google Analytics