公司的游戏需要个弱联网服务器来保存用户的信息,游戏的成绩排名等数据,服务器程序写好了,但用户名密码是属于敏感数据要防止其他人截获,这就涉及到了数据加密的问题。
服务器用的是http服务器,属于弱联网。强连接的数据加密比较好办,用对称加密的方式就可以处理。但弱联网服务器不能确定是哪个客户端发来的数据,及发向哪个目标服务器,所以还需要身份验证。
http通信通常有三种风险:
1:窃听风险 2:篡改风险 3:冒充风险。于是SSL/TSL相应就采取了如下3种措施来防范这些风险
1:所有信息加密传播,防止窃听。2:具有校验机制,一旦被篡改通信双方会立刻发现。3:配备证书机制,防止身份被冒充。
在网上看了一堆讲的云里雾里的文章,又和朋友聊了一些,终于把https的一些基本思路弄明白了。
1:在服务器上用java的keytool创建一个keystore,同时会在其中保存了公钥,私钥,数字证书。
2:数字证书需要被CA机构签名,这才能成为被大家公认的合法证书,否则各大浏览器在访问自己的https网站是会提示证书不合法。
3:配置tomcat,打开8443端口指定keystore文件位置。
4:用户拿到证书后,导入证书库,可正常访问指定的https网站。
如果,只需要数据加密,不需要对方的身份验证,那就只需要做1 3步骤就可以了。然后在程序里做特殊处理,以下的程序可不要求证书验证也能正常访问https网站。
/**
* 通过自定义 TrustManager 来实现无根证书时访问 https
* @date 2013-8-29
* @file HttpsClient.java
*/
public class HttpsClient {
/**
* 测试 https
* @param args
*/
public static void main(String[] args) throws Exception {
// init https
HttpsClient.init();
URL url = new URL("https://ugame.net.cn:8443/UGameCenter/ugametime");
url.openConnection();
InputStream in = url.openStream();
BufferedReader buf = new BufferedReader(new InputStreamReader(in));
String line = null;
while ((line = buf.readLine()) != null){
System.out.println(line);
}
buf.close();
in.close();
// System.out.println("-- finished --");
}
/**
* 初始化
*/
public static void init() {
try {
SSLContext sslCtx = SSLContext.getInstance("TLS");
sslCtx.init(null, new TrustManager[]{new MyTrustManager()}, null);
SSLSocketFactory sslSocketFactory = sslCtx.getSocketFactory();
HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory);
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
}
catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 默认信任服务端根证书
*/
class MyTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
return;
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
return;
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}