1.搭建环境
1) Eclipse Jee Pthoton
2) GlassFish 5.0
3) JDK8u201
2.场景
在GlassFish服务器上发布一个网页,用户通过键入地名来获取相关的邮编。 后台接收地名并调用政府服务器的一个api来返回邮编。
3.SSL Client 代码
新建一个SSL Client, 调用api并取回JSON字符串:
String city = xxx;
String StrUri = "https://geo.api.gouv.fr/communes?nom="+city;
ClientConfig clientConfig = new ClientConfig();
Client client = ClientBuilder.newClient(clientConfig);
URI serviceUri = UriBuilder.fromUri(StrUri).build();
WebTarget webTarget = client.target(serviceUri);
String jsonString = webTarget.request().accept(MediaType.APPLICATION_JSON).get(String.class);
4.SSL handshake
api(https://geo.api.gouv.fr/communes?xxxxx)的前缀为https,所以这个政府的服务器带有SSL/TLS证书, 也就是说它使用传输层安全性协议进行SSL/TLS通信。
在SSL client 与SSL server通信之前,它们需要建立安全验证,这就叫SSL/TLS基本握手(SSL/TLS handshake)。
其中Client要验证Server发来的证书的有效性,是怎么做的呢?
首先,Client是在GlassFish上建立的,它会查看在GlassFish里的存放证书的文件,根据其官方文档(安全手册 p26) 的说明,GlassFish有两个存放证书的文件:
- cacerts.jks 包含着被GlassFish信任的CA (root 或 intermediate) 的证书,包括它们的公钥
- keystore.jks 包含着GlassFish自己的一些证书,包括私钥
其次,根据政府服务器发来的证书,Client 会检测此证书的CA信息,然后与cacerts.jks的对应CA信息对比,以检验刚发来的证书是否有效。
接下来我们打开网页,输入地名,然后调用api返回邮编,结果出现了些问题。
5.问题一
javax.ws.rs.ProcessingException: sun.security.ssl.SSLSessionImpl.<init>
javax.ws.rs.ProcessingExcepti