HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),简单来说就是加了安全验证的 HTTP,即HTTP + SSL
;咱们知道 HTTP 通信时,若是客户端C 请求服务器S,那么能够经过网络抓包的形式来获取信息,甚至能够模拟服务器 S 端,来骗取与 C 端的通信信息;这对互联网应用在安全领域的推广很是不利;HTTPS解决了这个问题。java
1)HTTPS 的服务器须要到 CA 申请证书,以证实本身服务器的用途;linux
2)HTTP 信息是明文传输,HTTPS 信息是密文传输;web
3)HTTP 与 HTTPS 的默认端口不一样,前者是 80 端口,后者是 443 端口;算法
能够说 HTTP 与 HTTPS 是彻底不一样的链接方式,HTTPS 集合了加密传输,身份认证,更加的安全。shell
client 向 server 发送实际的业务 HTTPS 请求以前,会先与 server 进行几回握手,互相证实身份:apache
握手的流程图:windows
一种解释:浏览器
1)客户端请求服务器,发送握手消息tomcat
2)服务器返回客户端本身的加密算法、数字证书和公钥;
3)客户端验证服务器端发送来的数字证书是否与本地受信任的证书相关信息一致;若是不一致则客户端浏览器提示证书不安全。若是验证经过,则浏览器会采用自身的随机数算法产生一个随机数,并用服务器发送来的公钥加密;发送给服务器;这里若是有人经过攻击获取了这个消息,那也没用,由于他没有解密此段消息所须要私钥;验证经过的网站在浏览器地址栏的右边会有一安全锁的标识;
3)服务器解密获得此随机数,并用此随机数做为密钥采用对称加密算法加密一段握手消息发送给浏览器;
4)浏览器收到消息后解密成功,则握手结束,后续的信息都经过此随机密钥加密传输。
以上是服务端认证的状况,若是服务端对访问的客户端也有认证需求,则客户端也须要将本身的证书发送给服务器,服务器认证不经过,通信结束;原理同上;
另外,通常在传输过程当中为了防止消息窜改,还会采用消息摘要后再加密的方式,以此保证消息传递的正确性。
另外一种解释说明:
客户端发起一个 https 的请求,把自身支持的一系列 Cipher Suite(密钥算法套件,简称Cipher)发送给服务端。
服务端,接收到客户端全部的 Cipher 后与自身支持的对比,若是不支持则链接断开,反之则会从中选出一种加密算法和HASH算法,以证书的形式返回给客户端 证书中还包含了:公钥、颁证机构、网址、失效日期等等。
客户端收到服务端响应后会作如下几件事:
3.1 验证证书的合法性
颁发证书的机构是否合法与是否过时,证书中包含的网站地址是否与正在访问的地址一致等
证书验证经过后,在浏览器的地址栏会加上一把小锁(每家浏览器验证经过后的提示不同 不作讨论)
3.2 生成随机密码
若是证书验证经过,或者用户接受了不授信的证书,此时浏览器会生成一串随机数,而后用证书中的公钥加密。
3.3 HASH握手信息
用一开始约定好的 HASH 方式,把握手消息取 HASH 值, 而后用随机数加密 “握手消息 + 握手消息 HASH 值(签名)”
并一块儿发送给服务端。
在这里之因此要取握手消息的 HASH 值,主要是把握手消息作一个签名,用于验证握手消息在传输过程当中没有被篡改过。
而后用随机密码加密一段握手消息(握手消息+握手消息的HASH值 )给客户端
要么找 CA 授信机构颁发证书,要么本身给本身颁证书(不受信任的HTTPS)
下面咱们在 windows 上配置 tomcat 的HTTPS 访问
首先使用 JDK 的 keytool
命令,生成 keystore,在 cmd 命令行模式下执行:
keytool -genkey -alias uzipi.com -keyalg RSA -keystore 1024 -validity 365 -keystore d:/server.keystore -keypass Cs123456 -storepass Cs123456
-genkey 表示要生成密钥 -keyalg 指定密钥算法,这里指定为 RSA 算法。 -keysize 指定密钥长度,默认 1024 bit,这里指定为 2048 bit。 -sigalg 指定数字签名算法,这里指定为 SHA1withRSA 算法。 -validity 指定证书有效期,这里指定为 365 天。 -alias 指定生成的密钥库的别名,这里是 uzipi.com -keystore 指定密钥库存储位置,这里设定的是 d:/server.keystore -keypass 密钥口令 -storepass 密钥库口令
为何要移动到 Tomcat 根目录下呢?由于 Tomcat 启动时优先扫描当前根目录。
进入 ${TOMCAT_BASE}/conf
,编辑 server.xml
文件,按照 Tomcat 官网的提示,咱们能够找到 port="8443"
的 <Connector>
标签注释,解开注释修改内容, 也能够直接复制以下内容(本身改密码),加入到 server.xml
文件:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" keystoreFile="server.keystore" keystorePass="Cs123456" clientAuth="false" sslProtocol="TLS" />
keystoreFile
属性值,填写咱们刚刚建立的 server.keystore
的文件(若是放在了其余目录下,须要指定路径)keystorePass
属性值,填写以前建立的密钥库密码配置 webapps 目录中的项目,找到 WEB-INF/web.xml
文件,添加以下内容:
<security-constraint> <web-resource-collection> <web-resource-name>SSL</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
用 https + 8443 端口方式访问项目,会发现与以前普通 http + 8080 端口方式访问的区别:浏览器地址栏前面多了不安全的警告。由于是咱们本身颁发的证书,因此是不被其余机构信任的。
linux 上的配置与 windows 环境的配置是相同的。
(1)cd 转向到 tomcat 主目录,执行命令生成 keystore
文件
keytool -genkey -alias uzipi.com -keyalg RSA -keypass Cs123456 -storepass Cs123456 -keystore server.keystore -validity 3600
执行命令以后,将会在tomcat主目录下生成 server.keystore
文件;
(2)根据 keystore
文件产生的证书请求,向 CA 申请服务器数字证书:
keytool -export -trustcacerts -alias uzipi.com -file server.cer -keystore server.keystore -storepass Cs123456
执行命令以后,将会在tomcat主目录下生成 server.cer
文件;
(3)将信息中心签发的服务器证书 server.cer
导入到 server.keystore
文件:
keytool -import -trustcacerts -alias uzipi.com -file server.cer -keystore server.keystore -storepass Cs123456
(1)为了确保客户端证书可以顺利导入到 IE 和 Firefox 浏览器,须将证书格式为 PKCS12
,命令以下:
keytool -genkey -v -alias clientAlias -keyalg RSA -storetype PKCS12 -validity 3600 -keystore client.p12 -storepass clientStorePass -keypass clientKeyPass
执行命令以后,将会在tomcat主目录下生成 client.p12
文件;
双向 SSL 认证,服务器需要信任客户端证书,所以要把客户端证书添加为服务器的信任认证。
因为不能直接将 PKCS12
格式的证书导入,要先把客户端证书导出为一个单独的 CER
文件,命令以下:
keytool -export -alias clientAlias -keystore client.p12 -storetype PKCS12 -storepass clientStorePass -rfc -file client.cer
执行命令以后,将会在tomcat主目录下生成 client.cer
文件;
而后将 client.cer
导入到服务器的证书库 server.keystore
,添加为一个信任证书:
keytool -import -v -file client.cer -keystore server.keystore -storepass Cs123456
执行后,认证就已添加至 keystore
中了。
(1)经过list命令查看服务器的证书库,能够看到两个输入,一个是服务器证书,一个是受信任的客户端证书:
keytool -list -keystore server.keystore -storepass Cs123456
(2)删除证书命令
keytool -delete -alias myKey -keystore server.keystore -storepass Cs123456
修改 conf/server.xml
文件,配置 <Connector> port="8443"
:
<!-- Define a SSL HTTP/1.1 Connector on port 8443 This connector uses the JSSE configuration, when using APR, the connector should be using the OpenSSL style configuration described in the APR documentation --> <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="server.keystore" keystorePass="Cs123456" truststoreFile="server.keystore" truststorePass="Cs123456" />
clientAuth="true"
,双向认证;clientAuth="false"
,单向认证;执行 ./bin/startup.sh
命令,访问 https://127.0.0.1:8443
(你本身的地址) 。
单向认证相关的配置到此结束。若是还须要配置双向认证,继续往下看。
将 server.xml
文件中的 clientAuth="true"
,设置为双向认证,打开 Firefox 菜单:编辑->首选项->高级->加密->查看证书->你的证书
,将 client.p12
导入到 IE 中,按照 Firefox 提示完成登陆 tomcat 首页;
if(request.isSecure()) { //若是是SSL通讯 Java.security.cert.X509Certificate[] certs = (java.security.cert.X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate"); if(certs!=null && certs.lengtt>0) { subjectDN="Certificates found"; } }
使用java解析证书可获取证书中用户信息:
issue=certs.getIssuerDN().toString(); //证书签发者 subject=certs.getSubjectDN().getName(); //证书全部者 after=certs.getNotAfter().toString(); //证书起效时间 before=certs.getNotBefore().toString(); //证书到期时间 version=Integer.toString(certs.getVersion()); //证书版本 serialno=certs.getSerialNumber().toString(); //证书序列号
参考文章:
http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html tomcat7.0 ssl配置
http://wenku.baidu.com/view/e7b22df0f90f76c661371a6f.html Tomcat SSL 配置