您的位置:首页 > 理论基础 > 计算机网络

Web服务Https配置和代码访问方法

2015-06-01 11:11 405 查看

一、Https方式及证书

Web服务使用Https方式需要SSL证书,证书可从两个渠道获取:公开可信认证机构申请或自己生成。公开可信认证机构优势在于校验方便,但是会有租金。自己生成工具成本低,但用浏览器访问时会提示风险,需要用户手动确认可信。 Https还分单向认证和双向认证,单向认证只需要服务器端部署1份证书,双向认证要Client和Server端都有证书,而且还会增加Client和Server握手步骤。 单向认证已经能够满足传输数据的加密需求,所以登录服务器与客户端通讯采用自己生成SSL证书的Https单向认证方式。 证书有以下常用文件格式:JKS(.keystore),微软(.pfx),PEM(.key + .crt)。在Web服务器端部署Https时,Tomcat用的是JKS格式,Nginx用的是PEM格式。 生成证书时需要输入密码时,注意最好都用同一个。

二、生成JKS证书

通过JDK自带的keytool工具生成JKS证书: 1.打开命令行窗口,如果是Windows7系统注意要以管理员身份运行。 2.进入JDK安装目录下的bin目录,输入命令:keytool -genkey -v -alias testKey -keyalg RSA -validity 3650 -keystore c:\test.keystore alias: 别名keyalg: 证书算法,RSAvalidity:证书有效时间,10年keystore:证书生成的目标路径和文件名 c:\test.keystore 3.输入完上条命令回车会要求输入一些信息,需要记住自己输入的秘钥库口令和秘要口令,最好用同一个,会在Tomcat配置Https时用到。
4.最后会在c盘根目录得到生成好的test.keystore。

三、生成PEM证书

通过刚才生成的JKS证书转成PEM证书,手工转换步骤较多,所以通过kestore-export工具(百度网盘下载链接)转换。工具包含的文件:



运行JKS2PFX转换,命令格式为:JKS2PFX <KeyStore文件> <KeyStore密码> <Alias别名> <导出文件名> [Java Runtime的目录]为了简化操作,可以直接运行已经编辑好的go.bat来转换。用go.bat前注意,需要把.keystore放到本目录下,命令最后的[Java Runtime的目录]如果是包含有空格的路径,需要用Windows简化的写法,不能用双引号括起来的(比如”c:\Program Files\Java\jdk...”)。运行go.bat时还会让输入密码,最好跟前边的密码都统一。完成后,目录里会多出.crt,.key,.pfx三个文件。

四、Tomcat配置Https

1.把.keystore格式的证书放到Tomcat服务器上。
2.在安装好的Tomcat的conf目录下,找到Server.xml文件,找到:

3.把这个Connector配置解注释,并添加下图红框内参数:

keystoreFile:指向.keystore证书的路径keystorePass:生成.keystore时的密码 4.重启Tomcat服务,通过https://[Tomcat服务器IP]:8443/可以访问之前的Web服务说明配置成功。8443是Tomcat自己的定义的端口,如果改成https默认的443端口,访问时可省去端口参数。
5.如果使用的是自己生成的证书,浏览器访问时会提示风险,确认下就可以正常访问。

五、Nginx配置Https

1.安装好Nginx后,安装目录下找到nginx.conf配置文件,找到Server段。 2.修改监听的端口,有80改为443。 3.添加SSL参数,填上PEM证书的.key和.crt文件所在位置。 4.重启Nginx即可生效。 server{ listen 443;
server_name mxyx.login;
index index.jsp;
root /home/www;

ssl on;
ssl_certificate /home/test.crt;
ssl_certificate_key /home/test.key;

(...)
}

六、Java通过HttpClient访问Https方法

传入已经创建好的HttpClient实例,返回可访问Https的httpClient。

public static HttpClient wrapClient(HttpClient base) {
try {
SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {

public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
}

public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
X509HostnameVerifier verifier = new X509HostnameVerifier() {

@Override
public void verify(String string, SSLSocket ssls) throws IOException {
}

@Override
public void verify(String string, X509Certificate xc) throws SSLException {
}

@Override
public void verify(String string, String[] strings, String[] strings1) throws SSLException {
}

@Override
public boolean verify(String string, SSLSession ssls) {
return true;
}
};
ctx.init(null, new TrustManager[] { tm }, null);
SSLSocketFactory ssf = new SSLSocketFactory(ctx);
ssf.setHostnameVerifier(verifier);
ClientConnectionManager ccm = base.getConnectionManager();
SchemeRegistry sr = ccm.getSchemeRegistry();
sr.register(new Scheme("https", ssf, 443));
return new DefaultHttpClient(ccm, base.getParams());
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}

七、C#访问Https方法

string url="";
WWWForm form=null;
string result = null;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create (url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
//如果有post数据------
Stream sendStream = request.GetRequestStream ();
byte[] formData = form.data;
sendStream.Write (formData, 0, formData.Length);
sendStream.Close ();
//-------------
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback (CheckValidationResult);

HttpWebResponse response = (HttpWebResponse)request.GetResponse ();
if (response.StatusCode == HttpStatusCode.OK) {
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) {
result = reader.ReadToEnd ();
reader.Close ();
}
}


八、抓包验证

通过tcpdump命令查看指定端口的通讯数据
tcpdump -i eth1 -vv 'port 8080' -nn -X
eth1 外网网卡名称
8080 要监听的端口

本文出自 “zl1030的记录” 博客,请务必保留此出处http://zl1030.blog.51cto.com/274507/1657027
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: