【Tech】CAS多机部署Server和Java Client端

昨天尝试把cas的java client端部署到另外一台机器,结果就有问题了。(localhost部署cas server和java client端参见:http://www.cnblogs.com/sunshineatnoon/p/4119565.html

主要是client访问的时候报错:javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present。

后来在stackoverflow上找到了解决办法:http://stackoverflow.com/questions/9331087/how-to-setup-ssl-for-cas-and-client-different-machines?rq=1

根据jasig文档对这个错误的解释:

Sample Alt Name Stack Trace
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present
In most cases this is a hostname/SSL certificate CN mismatch. This commonly happens when a self-signed certificate issued to localhost is placed on a machine that is accessed by IP address. It should be noted that generating a certificate with an IP address for a common name, e.g. CN=192.168.1.1,OU=Middleware,dc=vt,dc=edu, will not work in most cases where the client making the connection is Java. For example the Java CAS client will throw SSL errors on connecting to a CAS server secured with a certificate containing an IP address in the CN.

是由于生成的证书中域名(CN)和server的域名或者以后client端访问的域名不一致造成的,并且这里也说了,不能用ip地址当作生成证书时候的CN,只能用域名。

所以改变的方法就是用域名生成证书,并且配置client端电脑的hosts和lmhosts.sam文件解析服务器域名,具体步骤如下:

1. 编辑client端机器的C:\Windows\System32\Drivers\etc\hosts,添加一行:

your_ip(xxx.xxx.xxx.xxx) your_cn(sunshineatnoon.com)

2. 编辑client端机器的C:\Windows\System32\Drivers\etc\lmhosts.sam,添加一行:

your_ip(xxx.xxx.xxx.xxx) your_cn(sunshineatnoon.com)

3. 在server端所在的机器用keytool重新生成证书:

keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "g:\tomcat.keystore"

在回答"what‘s you name?"这个问题的时候回答上述你的域名:sunshineatnoon.com

4.配置server端机器的tomcat下%TOMCAT_PATH%/conf下的server.xml文件,参考http://www.cnblogs.com/sunshineatnoon/p/4064632.html的3(1)(2),如果生成证书和以前的位置密码都没变,就不用重新配置了。

5.重新用文件InstallCert.java生成证书放到client端机器的$JAVA_HOME\jre\lib\security下,参考http://www.cnblogs.com/sunshineatnoon/p/4070750.html我所解决的第2个bug。

6.client端的java程序中请求ticket的url就由https://localhost:8443/cas/v1/tickets变成了https://sunshineatnoon.com:8443/cas/v1/tickets,改变后的client.java如下所示:

  1 package cas;
  2
  3
  4 import java.io.BufferedReader;
  5 import java.io.BufferedWriter;
  6 import java.io.IOException;
  7 import java.io.InputStreamReader;
  8 import java.io.OutputStreamWriter;
  9 import java.net.MalformedURLException;
 10 import java.net.URL;
 11 import java.net.URLConnection;
 12 import java.net.URLEncoder;
 13
 14 import javax.net.ssl.HttpsURLConnection;
 15
 16 public class Client {
 17
 18
 19     public static void main(String... args) throws Exception
 20     {
 21         String username ="test01";
 22         String password ="psw01";
 23         validateFromCAS(username,password);
 24     }
 25
 26     public static boolean validateFromCAS(String username, String password) throws Exception
 27     {
 28
 29         //String url = "https://localhost:8443/cas/v1/tickets";
 30         String url = "https://sunshineatnoon.com:8443/cas/v1/tickets";
 31         try
 32         {
 33             HttpsURLConnection hsu = (HttpsURLConnection)openConn(url);
 34             String s =   URLEncoder.encode("username","UTF-8") + "=" + URLEncoder.encode("test01","UTF-8");
 35             s+="&" +URLEncoder.encode("password","UTF-8") + "=" + URLEncoder.encode("psw01","UTF-8");
 36
 37             System.out.println(s);
 38             OutputStreamWriter out = new OutputStreamWriter(hsu.getOutputStream());
 39             BufferedWriter bwr = new BufferedWriter(out);
 40             bwr.write(s);
 41             bwr.flush();
 42             bwr.close();
 43             out.close();
 44
 45             String tgt = hsu.getHeaderField("location");
 46             System.out.println( hsu.getResponseCode());
 47             if(tgt != null && hsu.getResponseCode() == 201)
 48             {
 49                 System.out.println(tgt);
 50
 51                 System.out.println("Tgt is : " + tgt.substring( tgt.lastIndexOf("/") +1));
 52                 tgt = tgt.substring( tgt.lastIndexOf("/") +1);
 53                 bwr.close();
 54                 closeConn(hsu);
 55
 56
 57                 //String serviceURL = "http://localhost:8080/CasClient";
 58                 String serviceURL = "http://www.baidu.com";
 59                 String encodedServiceURL = URLEncoder.encode("service","utf-8") +"=" + URLEncoder.encode(serviceURL,"utf-8");
 60                 System.out.println("Service url is : " + encodedServiceURL);
 61
 62
 63
 64                 String myURL = url+ "/"+ tgt ;
 65                 System.out.println(myURL);
 66                 hsu = (HttpsURLConnection)openConn(myURL);
 67                 out = new OutputStreamWriter(hsu.getOutputStream());
 68                 bwr = new BufferedWriter(out);
 69                 bwr.write(encodedServiceURL);
 70                 bwr.flush();
 71                 bwr.close();
 72                 out.close();
 73
 74                 System.out.println("Response code is:  " + hsu.getResponseCode());
 75
 76                 BufferedReader isr = new BufferedReader(   new InputStreamReader(hsu.getInputStream()));
 77                 String line;
 78                 System.out.println( hsu.getResponseCode());
 79                 while ((line = isr.readLine()) != null) {
 80                     System.out.println( line);
 81                 }
 82                 isr.close();
 83                 hsu.disconnect();
 84                 return true;
 85
 86             }
 87             else
 88             {
 89                 return false;
 90             }
 91
 92
 93         }
 94         catch(MalformedURLException mue)
 95         {
 96             mue.printStackTrace();
 97             throw mue;
 98
 99         }
100         catch(IOException ioe)
101         {
102             ioe.printStackTrace();
103             throw ioe;
104         }
105
106
107
108
109
110     }
111
112
113     static URLConnection openConn(String urlk)  throws MalformedURLException, IOException
114     {
115
116         URL url = new URL(urlk);
117         HttpsURLConnection hsu = (HttpsURLConnection) url.openConnection();
118         hsu.setDoInput(true);
119         hsu.setDoOutput(true);
120         hsu.setRequestMethod("POST");
121         return hsu;
122
123
124     }
125
126
127     static void closeConn(HttpsURLConnection c)
128     {
129         c.disconnect();
130     }
131
132
133     }

注意红色那行改变的代码。

7.这时client端上的java client端应该就可以成功得到TGT和ST了。

时间: 2024-08-27 01:38:42

【Tech】CAS多机部署Server和Java Client端的相关文章

Memcached Java Client with sample program--reference

In my previous post, I listed down most common telnet commands for memcached with sample execution terminal logs. Today I want to discuss about the Memcached Client program available in Java language. There are three most widely used memcached client

mac本机部署canal

1.背景介绍 最近做的一个项目需要快速检索数据,经过商讨后采用了ElasticSearch作为快速检索数据引擎,但是数据如何同步到ES中是个问题,我们最开始计划了定时任务.mysql trigger等方式,最后选择了比较好的canal组件,通过canal同步mysql中的数据到ES中,所以要学习一下canal. 2.canal介绍 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求.不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年

基于Bluemix快速构建部署一款Java小程序——微博影响力分析器

一.前言 近年来IT界风云际会,各种新概念如大数据.云平台.虚拟化等,如雨后春笋般层出不穷.而云平台,可以说是近些年来引领时代新潮的边缘概念之一,各大厂商竞相推出各种云产品,抢占云市场高地.近期,IT百年老厂IBM也推出了其花费重金打造的基于CloudFoundry开放标准的云平台Bluemix.本文就旨在从一位普通Java开发者角度,尝鲜Bluemix云平台及其提供的Cloudant服务,快速构建并部署一款Java小程序"微博影响力分析器". 二."微博影响力分析器&quo

淘宝分布式 key/value 存储引擎Tair安装部署过程及Java客户端测试一例

目录 1. 简介 2. 安装步骤及问题小记 3. 部署配置 4. Java客户端测试 5. 参考资料 声明 1. 下面的安装部署基于Linux系统环境:centos 6(64位),其它Linux版本可能有所差异. 2. 网上有人说tair安装失败可能是因为gcc版本问题,高版本的gcc可能不支持某些特性导致安装失败,经过实验证明,该说法是错误的,tair安装失败有各种可能的原因但绝对与gcc版本无关,比如我的gcc开始版本为4.4.7,后来tair安装失败,我重新编译低版本的gcc(gcc4.1

linux部署项目(Java项目+Tomcat+mysql)

项目做完了,要发布了,而Java的特长之一就是移植性好,面对着微软的XP的停止服务,Windows系统的"独裁",越来越多的商家选择了开源的免费的linux系统作为服务器.因为linux系统也有图形界面(虽然和Windows比起来很不一样),所以在图形界面中操作相对来说还是容易的,这就好比我们在Windows系统上部署项目一样,大部分人都是小Case.但是真正工作中,服务器都会在固定的机房,而且往往只有一台主机,更规模大一些的就是使用单片机,像摆书一样摆到机房的机器架上,而我们操作它的

菜鸟系列Fabric——Fabric 1.2 多机部署(3)

多机部署fabric kafka共识 1. 角色分配 主机1 主机 2 Org1 peer0 1 Org2 peer 0 1 Orderer 0 1 Orderer 2 kafka 0 1 kafka 2 3 zookeeper 0 1 zookeeper 2 2. 配置文件生成及准备yaml文件 2.1 修改配置文件 configtx-kafka.yaml Addresses: - orderer0.example.com:7050 - orderer1.example.com:8050 -

maven 编译部署src/main/java下的资源文件

maven 编译部署src/main/java下的资源文件 maven默认会把src/main/resources下的所有配置文件以及src/main/java下的所有java文件打包或发布到target\classes下面, 但是现实我们可能会在src/main/java下面也放置一些配置文件如hibernate配置文件或mybatis mapper配置文件等, 如果不做一些额外配置,那我们打包后的项目可能找不到这些必须的资源文件,因此在pom.xml中增加类似如下配置: <build> &

如何批量部署Office 2013 (四)——多机部署Office 2013

接下来来看Office的多机部署,如何在多台客户端中批量部署Office,其实方法并不唯一,可以通过MDT结合操作系统一同部署,也可以单独批量部署Office,这两种方法我们都会讲,首先来看下单独实现Office的批量部署 1.将Office 2013安装文件复制到网络存储位置 2. 将制作好的OCT文件拷贝到updates文件夹下 3.将部署文件夹共享并设置读写权限 4.在开始屏幕中打开AD用户和计算机 5.创建一个名为Office的OU 6.在Computers中将OfficeClient.

探秘 Java 热部署三(Java agent agentmain)

前言 让我们继续探秘 Java 热部署.在前文 探秘 Java 热部署二(Java agent premain)中,我们介绍了 Java agent premain.通过在main方法之前通过类似 AOP 的方式添加 premain 方法,我们可以在类加载之前做修改字节码的操作,无论是第一次加载,还是每次新的 ClassLoader 加载,都会经过 ClassFileTransformer 的 transform 方法,也就是说,都可以在这个方法中修改字节码,虽然他的方法名是 premain ,