Things About Tomcat SSL Certification and CAS(SAML)
这里是对Tomcat配置证书(生成/导出/导入)的 spike 总结。也不一定是总结 啦。
会总结哪些方面呢?
- keytool 相关的命令和作用;
- Tomcat 的 SSL 配置;
- 什么是证书?
- 服务端和客户端都在本地的配置(开发配置);
- 服务端部署在其他域名上;
- etc.
目前想到的几个问题:
– ~/.keystore,为什么 client 会找这个文件?
self-signed certificate
CAS Java Client 配置 SAML 1.1
在 client 需要添加这些依赖:
- cas-client-core-3.1.3.jar
- commons-codec-1.4.jar
- commons-logging-1.1.jar
- opensaml-1.1.jar
- xmlsec-1.4.0.jar
- log4j-1.2.15.jar
关于版本,core的话,目前最新的是 3.2。opensaml肯定使用 1.1,因为是 SAML1.1 协议。
其他几个包是什么呢?不需要深入了解,从名称猜测,commons-codec 提供了一 些 encode,decode 方法。xmlsec 应该是安全的XML。
cas-client-core http://mvnrepository.com/artifact/org.jasig.cas
commons-codec http://mvnrepository.com/artifact/commons-codec/commons-codec
opensaml http://mvnrepository.com/artifact/org.opensaml/opensaml/1.1
xmlsec http://mvnrepository.com/artifact/org.apache.santuario/xmlsec
Tomcat 配置 SSL
关于 Tomcat 配置 SSL
什么是 SSL?
主要参考文章 SSL简介
SSL(Server Socket Layer)
SSL(Server Socket Layer)是一种保证网络上的两个节点进行安全通信的协议。IETF(Internet Engineering Task Force)组织对SSL作了标准化,制订了RFC2246规范,并将其称为TLS(Transport Layer Security)。从技术上讲,目前TLS 1.0与TLS 3.0的差别非常微小。
从引用看出一个经常看到的术语:TLS,就是标准化的 SSL 通信协议。换句话说, TLS 是基于 SSL 开发的。准确地说,TLS 1.0 替代了 SSL 2.0,并且 TLS 1.0 和 SSL 3.0 的差别不大,但不能忽操作。
这方面的参考链接:
SSL和TLS建立在TCP/IP协议的基础上,一些应用层协议,如HTTP和IMAP协议都可 以采用SSL来保证通信的安全。建立在SSL协议上的HTTP被称为HTTPS协议。HTTP 使用的默认端口为80,而HTTPS使用的默认端口为443。
| 协议层 | 协议 |
|---|---|
| 应用层 | HTTP、IMAP、NNTP、Telnet、FTP等 |
| 安全套接字层 | SSL、TLS |
| 传输层 | TCP |
| 网络层 | IP |
SSL采用加密技术来实现安全通信,保证通信数据的保密性和完整性,并且保证 通信双方可以验证对方的身份。
SSL 中的证书
除了对数据通信进行加密外,SSL还采用了身份认证机制,确保通信双方都可以 验证对方的真实身份。
SSL通过安全证书来证明客户或服务器的身份。当客户通过安全的连接和服务器 通信时,服务器会先向客户出示它的安全证书,这个证书声明该服务器是安全的, 而且的确是这个服务器。每一个证书在全球范围内都是唯一的,其他非法服务器 无法假冒原始服务器的身份。可以把安全证书比做电子身份证。
获取安全证书是一件麻烦的事情。一些服务器会向客户出示自己的安全证书,但 另一方面,为了扩大客户群并且便于客户访问,许多服务器不要求客户出示安全 证书。在某些情况下,服务器也会要求客户出示安全证书,以便核实客户的身份, 这主要用于B2B(Business to Business)事务中。
获取安全证书有两种方式,一种方式是从权威机构购买证书,还有一种方式是创建自我签名的证书。
1 从权威机构获得证书
安全证书可以有效地保证通信双方身份的可信性。安全证书采用加密技术制作而 成,他人几乎无法伪造。安全证书由国际权威的证书机构(Certificate Authority,CA)如VeriSign(www.verisign.com)和Thawte(www.thawte.com) 颁发,它们保证了证书的可信性。申请安全证书时,必须支付一定的费用。一个 安全证书只对一个IP地址有效,如果用户的系统环境中有多个IP,那么必须为每 个IP地址购买安全证书。
2 创建自我签名证书
在某些场合,通信双方只关心数据在网络上可以安全传输,并不需要对对方进行 身份验证,在这种情况下,可以创建自我签名(self-assign)的证书,比如通 过SUN公司提供的keytool工具就可以创建这样的证书。
即,只需要数据加密传输,而不需要额外的一层身份校验。
使用 keytool 工具
这方面的参考文章很多。
对于 .Net,请参考: Yale CAS + .net Client 实现 SSO(1)
对于 Java,请参考: CAS实现单点登录(SSO)经典完整教程 。
这里唯一需要注意的一点是:生成证书时,要求输入名称和姓氏(First Name and Last Name)时,需要输入部署 cas server 的计算机名,比如: pieux-macbook-pro.local 或者 tech-w-xishanshan。在后面的配置 cas client 的 Authentication Filter 和 Validation Filter 时,配置的服务器 地址应该也是以计算机名开头,不要使用 localhost 或者 ip:
1 2 3 4 5 6 7 8 9 10 11 | |
自我签名证书在开发中的注意事项
如果 cas server 和 cas client 都部署在相同的机器上(一般是开发过程中), 那如果你按照上面和上面提到的参考文章的步骤,就应该不会有错误了。
但是,有一个大坑。如果 cas server 和 cas client 不是部署在一台机器上, 你很有可能会遇到一个异常是:
1
| |
The problem here is that the CAS client does not trust the certificate presented by the CAS server; most often this occurs because of using a self-signed certificate on the CAS server.
该问题一般是 cas client 不信任 cas server 展示的证书,而且绝大多数情况 下(按我目前遇到的,就是所有情况下),是 cas server 向 client 展示的是 self-signed certificate。
而且,使用SAML11的时候会报错(难道是SAML11也需要检验证书的真实性?), 使用CAS20就不会报错。因为按理说,SSL可以不需要证书,只利用加密通信的特 性。这块持续挖掘下。
那怎么解决这个问题呢?很简单,让 client 信任 server 的证书就行了。把 server 端生成的证书拷贝到 client 端部署的机器上,然后用 keytool 工具导 入到 client 机器 JDK 的 cacerts 里。
SSL握手通信过程
主要参考文章 SSL握手通信过程
暂时先不了解。